49#ifndef RETROWIN_TRACE_LVL
50# define RETROWIN_TRACE_LVL 0
58#define RETROWIN_FLAG_INIT_GUI 0x10
60#define RETROWIN_FLAG_INIT_BMP 0x20
62#define RETROWIN_FLAG_GUI_LOCKED 0x04
64#define RETROWIN_FLAG_BORDER_NONE 0x00
65#define RETROWIN_FLAG_BORDER_GRAY 0x01
66#define RETROWIN_FLAG_BORDER_BLUE 0x02
68#define retrowin_win_is_active( win ) \
69 (RETROWIN_FLAG_INIT_BMP == (RETROWIN_FLAG_INIT_BMP & (win)->flags))
71#define RETROWIN_FLAG_BORDER_MASK 0x03
73#define retrowin_lock_gui( win ) \
75 RETROWIN_FLAG_INIT_GUI == (RETROWIN_FLAG_INIT_GUI & (win)->flags) && \
76 RETROWIN_FLAG_GUI_LOCKED != (RETROWIN_FLAG_GUI_LOCKED & (win)->flags) \
78 debug_printf( RETROWIN_TRACE_LVL, "locking managed gui handle %p...", \
80 maug_mlock( (win)->gui_h, (win)->gui_p ); \
81 maug_cleanup_if_null_lock( struct RETROGUI*, (win)->gui_p ); \
82 (win)->flags |= RETROWIN_FLAG_GUI_LOCKED; \
83 debug_printf( RETROWIN_TRACE_LVL, "locked managed gui to pointer %p!", \
87#define retrowin_unlock_gui( win ) \
89 RETROWIN_FLAG_INIT_GUI == (RETROWIN_FLAG_INIT_GUI & (win)->flags) && \
90 RETROWIN_FLAG_GUI_LOCKED == (RETROWIN_FLAG_GUI_LOCKED & (win)->flags) \
92 debug_printf( RETROWIN_TRACE_LVL, "unlocking managed gui pointer %p...", \
94 maug_munlock( (win)->gui_h, (win)->gui_p ); \
95 (win)->flags &= ~RETROWIN_FLAG_GUI_LOCKED; \
105 retroflat_blit_t gui_bmp;
119void retrowin_free_win(
struct RETROWIN* win );
121ssize_t retrowin_get_by_idc(
size_t idc,
struct MDATA_VECTOR* win_stack );
133 size_t idc,
const char* font_filename,
134 size_t x,
size_t y,
size_t w,
size_t h, uint8_t flags );
150 RETROWIN_FLAG_INIT_GUI != (RETROWIN_FLAG_INIT_GUI & win->flags) ||
151 RETROWIN_FLAG_GUI_LOCKED == (RETROWIN_FLAG_GUI_LOCKED & win->flags) );
153 switch( RETROWIN_FLAG_BORDER_MASK & win->flags ) {
154 case RETROWIN_FLAG_BORDER_GRAY:
156 win->gui_p->draw_bmp,
157 2 < retroflat_screen_colors() ?
158 RETROFLAT_COLOR_GRAY : RETROFLAT_COLOR_WHITE, 0, 0,
159 retroflat_2d_bitmap_w( win->gui_p->draw_bmp ),
160 retroflat_2d_bitmap_h( win->gui_p->draw_bmp ),
165 win->gui_p->draw_bmp, RETROFLAT_COLOR_BLACK, 0, 0,
166 retroflat_2d_bitmap_w( win->gui_p->draw_bmp ),
167 retroflat_2d_bitmap_h( win->gui_p->draw_bmp ),
169 if( 2 < retroflat_screen_colors() ) {
172 win->gui_p->draw_bmp, RETROFLAT_COLOR_WHITE,
173 1, 1, retroflat_2d_bitmap_w( win->gui_p->draw_bmp ) - 2, 1, 0 );
175 win->gui_p->draw_bmp, RETROFLAT_COLOR_WHITE,
176 1, 2, 1, retroflat_2d_bitmap_h( win->gui_p->draw_bmp ) - 3, 0 );
180 case RETROWIN_FLAG_BORDER_BLUE:
182 win->gui_p->draw_bmp,
183 2 < retroflat_screen_colors() ?
184 RETROFLAT_COLOR_BLUE : RETROFLAT_COLOR_BLACK, 0, 0,
185 retroflat_2d_bitmap_w( win->gui_p->draw_bmp ),
186 retroflat_2d_bitmap_h( win->gui_p->draw_bmp ),
191 win->gui_p->draw_bmp, RETROFLAT_COLOR_BLACK, 2, 2,
192 retroflat_2d_bitmap_w( win->gui_p->draw_bmp ) - 4,
193 retroflat_2d_bitmap_h( win->gui_p->draw_bmp ) - 4,
196 win->gui_p->draw_bmp, RETROFLAT_COLOR_WHITE, 1, 1,
197 retroflat_2d_bitmap_w( win->gui_p->draw_bmp ) - 2,
198 retroflat_2d_bitmap_h( win->gui_p->draw_bmp ) - 2,
201 win->gui_p->draw_bmp, RETROFLAT_COLOR_BLACK, 0, 0,
202 retroflat_2d_bitmap_w( win->gui_p->draw_bmp ),
203 retroflat_2d_bitmap_h( win->gui_p->draw_bmp ),
217 RETROWIN_FLAG_INIT_GUI != (RETROWIN_FLAG_INIT_GUI & win->flags) ||
218 RETROWIN_FLAG_GUI_LOCKED == (RETROWIN_FLAG_GUI_LOCKED & win->flags) );
220 retroflat_2d_lock_bitmap( &(win->gui_bmp) );
223 win->gui_p->draw_bmp = &(win->gui_bmp);
225 debug_printf( RETROWIN_TRACE_LVL,
226 "redrawing window " SIZE_T_FMT
" (GUI %p)...", win->idc, win->gui_p );
228 _retrowin_draw_border( win );
236 retval = retrogui_redraw_ctls( win->gui_p );
237 win->gui_p->x = win->x;
238 win->gui_p->y = win->y;
239 maug_cleanup_if_not_ok();
241 retroflat_2d_release_bitmap( &(win->gui_bmp) );
255 if( 0 == mdata_vector_ct( win_stack ) ) {
259 assert( !mdata_vector_is_locked( win_stack ) );
260 mdata_vector_lock( win_stack );
262 for( i = 0 ; mdata_vector_ct( win_stack ) > i ; i++ ) {
263 win = mdata_vector_get( win_stack, i,
struct RETROWIN );
264 assert( NULL != win );
266 if( !retrowin_win_is_active( win ) ) {
270 retrowin_lock_gui( win );
273 if( RETROGUI_FLAGS_DIRTY == (RETROGUI_FLAGS_DIRTY & win->gui_p->flags) ) {
274 debug_printf( RETROWIN_TRACE_LVL,
275 "redrawing window idx " SIZE_T_FMT
", IDC " SIZE_T_FMT,
279 retval = _retrowin_redraw_win( win );
280 maug_cleanup_if_not_ok();
286 retval = retroflat_2d_blit_win(
287 &(win->gui_bmp), win->gui_p->x, win->gui_p->y );
289 retrowin_unlock_gui( win );
294 mdata_vector_unlock( win_stack );
306 if( 0 == mdata_vector_ct( win_stack ) ) {
310 assert( !mdata_vector_is_locked( win_stack ) );
311 mdata_vector_lock( win_stack );
313 for( i = 0 ; mdata_vector_ct( win_stack ) > i ; i++ ) {
314 win = mdata_vector_get( win_stack, i,
struct RETROWIN );
315 assert( NULL != win );
317 if( !retrowin_win_is_active( win ) ) {
321 retrowin_lock_gui( win );
323 debug_printf( RETROWIN_TRACE_LVL,
324 "refreshing window idx " SIZE_T_FMT
", IDC " SIZE_T_FMT,
327 win->gui_p->flags |= RETROGUI_FLAGS_DIRTY;
329 retrowin_unlock_gui( win );
334 mdata_vector_unlock( win_stack );
350 assert( !mdata_vector_is_locked( win_stack ) );
351 mdata_vector_lock( win_stack );
353 for( i = 0 ; mdata_vector_ct( win_stack ) > i ; i++ ) {
354 win = mdata_vector_get( win_stack, i,
struct RETROWIN );
355 assert( NULL != win );
356 if( idc_active != win->idc || !retrowin_win_is_active( win ) ) {
360 debug_printf( RETROWIN_TRACE_LVL,
"polling window: " SIZE_T_FMT,
363 retrowin_lock_gui( win );
367 retrowin_unlock_gui( win );
374 if( MERROR_OK != retval ) {
375 error_printf(
"error redrawing windows!" );
379 mdata_vector_unlock( win_stack );
386void retrowin_free_win(
struct RETROWIN* win ) {
389 if( RETROWIN_FLAG_INIT_BMP == (RETROWIN_FLAG_INIT_BMP & win->flags) ) {
390 retroflat_2d_destroy_bitmap( &(win->gui_bmp) );
391 retrowin_lock_gui( win );
392 win->gui_p->draw_bmp = NULL;
393 retrowin_unlock_gui( win );
398 retrowin_lock_gui( win )
399 retrogui_destroy( win->gui_p );
400 retrowin_unlock_gui( win )
401 maug_mfree( win->gui_h );
406 if( MERROR_OK != retval ) {
407 error_printf(
"error while locking self-managed GUI! not freed!" );
410 maug_mzero( win,
sizeof(
struct RETROWIN ) );
415ssize_t retrowin_get_by_idc(
size_t idc,
struct MDATA_VECTOR* win_stack ) {
416 ssize_t idx_out = -1;
422 if( 0 == mdata_vector_ct( win_stack ) ) {
426 if( !mdata_vector_is_locked( win_stack ) ) {
427 mdata_vector_lock( win_stack );
431 for( i = 0 ; mdata_vector_ct( win_stack ) > i ; i++ ) {
432 win = mdata_vector_get( win_stack, i,
struct RETROWIN );
433 if( idc == win->idc ) {
442 mdata_vector_unlock( win_stack );
445 if( MERROR_OK != retval ) {
446 idx_out = merror_retval_to_sz( retval );
456 size_t idc,
const char* font_filename,
457 size_t x,
size_t y,
size_t w,
size_t h, uint8_t flags
461 ssize_t idx_out = -1;
463 idx_out = retrowin_get_by_idc( idc, win_stack );
465 error_printf(
"window IDC " SIZE_T_FMT
" already exists!", idc );
469 maug_mzero( &win,
sizeof(
struct RETROWIN ) );
477 win.gui_h = maug_malloc( 1,
sizeof(
struct RETROGUI ) );
478 maug_cleanup_if_null_alloc( MAUG_MHANDLE, win.gui_h );
483 retrowin_lock_gui( &win );
485 retval = retrogui_init( win.gui_p );
486 maug_cleanup_if_not_ok();
489 maug_cleanup_if_not_ok();
492 retval = retroflat_2d_create_bitmap(
494 maug_cleanup_if_not_ok();
496 win.flags |= RETROWIN_FLAG_INIT_BMP;
510 debug_printf( RETROWIN_TRACE_LVL,
511 "pushing window IDC " SIZE_T_FMT
", GUI %p: " SIZE_T_FMT
"x" SIZE_T_FMT
512 " @ " SIZE_T_FMT
", " SIZE_T_FMT,
514 win.gui_p->w, win.gui_p->h, win.gui_p->x, win.gui_p->y );
516 retrowin_unlock_gui( &win );
518 idx_out = mdata_vector_append( win_stack, &win,
sizeof(
struct RETROWIN ) );
526 "non-square window created; some systems may have trouble!" );
534 retrowin_unlock_gui( &win );
550 debug_printf( RETROWIN_TRACE_LVL,
551 "attempting to destroy window: " SIZE_T_FMT, idc );
553 if( !mdata_vector_is_locked( win_stack ) ) {
554 mdata_vector_lock( win_stack );
558 for( i = 0 ; mdata_vector_ct( win_stack ) > i ; i++ ) {
559 win = mdata_vector_get( win_stack, i,
struct RETROWIN );
560 assert( NULL != win );
561 if( idc != win->idc ) {
565 if( !retrowin_win_is_active( win ) ) {
566 debug_printf( RETROWIN_TRACE_LVL,
567 "window IDC " SIZE_T_FMT
" found, but not active! (flags: 0x%02x)",
572 debug_printf( RETROWIN_TRACE_LVL,
"freeing window: " SIZE_T_FMT,
575 retrowin_free_win( win );
585 mdata_vector_unlock( win_stack );
587 mdata_vector_remove( win_stack, i_free );
589 mdata_vector_lock( win_stack );
596 mdata_vector_unlock( win_stack );
int MERROR_RETVAL
Return type indicating function returns a value from this list.
Definition merror.h:19
#define RETROFLAT_FLAGS_OPAQUE
Flag for retroflat_create_bitmap() or retroflat_load_bitmap() to create or load a bitmap without tran...
Definition retroflt.h:379
#define RETROFLAT_FLAGS_FILL
Flag for retroflat_rect() or retroflat_ellipse(), indicating drawn shape should be filled.
Definition retroflt.h:373
retrogui_idc_t retrogui_poll_ctls(struct RETROGUI *gui, RETROFLAT_IN_KEY *p_input, struct RETROFLAT_INPUT *input_evt)
Poll for the last clicked control and maintain listboxes and menus.
MERROR_RETVAL retrogui_set_font(struct RETROGUI *gui, const char *font_path)
Load the RetroFont API for the given RETROGUI to draw its controls with. Use RetroGXCache API if avai...
int16_t retrogui_idc_t
Unique identifying constant number for controls.
Definition retrogui.h:231
MERROR_RETVAL retrowin_refresh_win_stack(struct MDATA_VECTOR *win_stack)
Force all windows on the stack to redraw.
ssize_t retrowin_push_win(struct RETROGUI *gui, struct MDATA_VECTOR *win_stack, size_t idc, const char *font_filename, size_t x, size_t y, size_t w, size_t h, uint8_t flags)
Create a new window on the given win_stack.
MERROR_RETVAL retrowin_destroy_win(struct MDATA_VECTOR *win_stack, size_t idc)
Destroy the given window's resources and remove it from the window stack.
#define RETROWIN_FLAG_INIT_GUI
Flag for RETROWIN::flags indicating RETROWIN::gui_p should be locked from RETROWIN::gui_h before use.
Definition retrowin.h:58
A vector of uniformly-sized objects, stored contiguously.
Definition mdata.h:83
Definition retrogui.h:328