77#ifndef RETROFONT_PRESENT
78# error "retrofont not present!"
83#ifndef RETROGUI_TRACE_LVL
84# define RETROGUI_TRACE_LVL 0
87#ifndef RETROGUI_COLOR_BORDER
93# define RETROGUI_COLOR_BORDER RETROFLAT_COLOR_DARKBLUE
96#ifndef RETROGUI_CTL_TEXT_SZ_MAX
103#ifndef RETROGUI_KEY_ACTIVATE
109# define RETROGUI_KEY_ACTIVATE RETROFLAT_KEY_SPACE
112#ifndef RETROGUI_KEY_NEXT
118# define RETROGUI_KEY_NEXT RETROFLAT_KEY_DOWN
121#ifndef RETROGUI_KEY_PREV
127# define RETROGUI_KEY_PREV RETROFLAT_KEY_UP
130#ifndef RETROGUI_KEY_SEL_NEXT
136# define RETROGUI_KEY_SEL_NEXT RETROFLAT_KEY_RIGHT
139#ifndef RETROGUI_KEY_SEL_PREV
145# define RETROGUI_KEY_SEL_PREV RETROFLAT_KEY_LEFT
148#ifndef RETROGUI_PAD_ACTIVATE
154# define RETROGUI_PAD_ACTIVATE RETROFLAT_PAD_A
157#ifndef RETROGUI_PAD_NEXT
163# define RETROGUI_PAD_NEXT RETROFLAT_PAD_DOWN
166#ifndef RETROGUI_PAD_PREV
172# define RETROGUI_PAD_PREV RETROFLAT_PAD_UP
175#ifndef RETROGUI_PAD_SEL_NEXT
181# define RETROGUI_PAD_SEL_NEXT RETROFLAT_PAD_RIGHT
184#ifndef RETROGUI_PAD_SEL_PREV
190# define RETROGUI_PAD_SEL_PREV RETROFLAT_PAD_LEFT
193# define RETROGUI_CTL_TEXT_SZ_MAX 128
196#ifndef RETROGUI_CTL_SZ_MAX_INIT
197# define RETROGUI_CTL_SZ_MAX_INIT 20
200#ifndef RETROGUI_PADDING
205# define RETROGUI_PADDING 5
208#ifndef RETROGUI_BTN_LBL_SZ_MAX
209# define RETROGUI_BTN_LBL_SZ_MAX 64
212#ifndef RETROGUI_BTN_LBL_PADDED_X
213# define RETROGUI_BTN_LBL_PADDED_X 8
216#ifndef RETROGUI_BTN_LBL_PADDED_Y
217# define RETROGUI_BTN_LBL_PADDED_Y 8
220#ifndef RETROGUI_CTL_TEXT_BLINK_FRAMES
221# define RETROGUI_CTL_TEXT_BLINK_FRAMES 15
224#ifndef RETROGUI_CTL_LISTBOX_CURSOR_RADIUS
225# define RETROGUI_CTL_LISTBOX_CURSOR_RADIUS 8
228#ifndef RETROGUI_CTL_LISTBOX_STR_SZ_MAX
229# define RETROGUI_CTL_LISTBOX_STR_SZ_MAX 255
232#ifndef RETROGUI_CTL_TEXT_CUR_WH
233# define RETROGUI_CTL_TEXT_CUR_WH 8
236#ifndef RETROGUI_DEBOUNCE_MAX_DEFAULT
237# define RETROGUI_DEBOUNCE_MAX_DEFAULT 100
240#ifndef RETROGUI_LABEL_SHOW_TICKS_MAX
246# define RETROGUI_LABEL_SHOW_TICKS_MAX 2
249#ifndef RETROGUI_LABEL_SHOW_INC
254# define RETROGUI_LABEL_SHOW_INC 3
263#define RETROGUI_FLAGS_DIRTY 0x01
270#define RETROGUI_FLAGS_FONT_OWNED 0x02
277#define RETROGUI_LABEL_FLAG_SHOWINC 0x02
288#define RETROGUI_LABEL_FLAG_SHOWINC_SLOW 0x06
290#define RETROGUI_FILLBAR_FLAG_SHOWNUM 0x02
292#define _retrogui_copy_str( field, src_str, dest_ctl, str_tmp, str_sz ) \
294 assert( NULL != src_str ); \
295 debug_printf( RETROGUI_TRACE_LVL, \
296 "copying string \"%s\" to " #dest_ctl, src_str ); \
297 if( 0 == str_sz ) { \
298 str_sz = maug_strlen( src_str ); \
299 debug_printf( RETROGUI_TRACE_LVL, \
300 "determined str sz of \"%s\": " SIZE_T_FMT, src_str, str_sz ); \
303 str_sz != dest_ctl. field ## _sz && \
304 (MAUG_MHANDLE)NULL != dest_ctl. field ## _h \
306 debug_printf( RETROGUI_TRACE_LVL, \
307 "string size different; creating new buffer..." ); \
309 maug_mfree( dest_ctl. field ## _h ); \
310 dest_ctl. field ## _h = (MAUG_MHANDLE)NULL; \
312 if( (MAUG_MHANDLE)NULL == dest_ctl. field ## _h ) { \
314 maug_malloc_test( dest_ctl. field ## _h, str_sz + 1, 1 ); \
316 maug_mlock( dest_ctl. field ## _h, str_tmp ); \
317 maug_cleanup_if_null_lock( char*, str_tmp ); \
320 assert( NULL != str_tmp ); \
321 maug_mzero( str_tmp, str_sz + 1 ); \
322 debug_printf( RETROGUI_TRACE_LVL, \
323 "zeroed str sz for \"%s\": " SIZE_T_FMT, src_str, str_sz + 1 ); \
324 maug_strncpy( str_tmp, src_str, str_sz ); \
325 dest_ctl. field ## _sz = str_sz; \
326 debug_printf( RETROGUI_TRACE_LVL, "copied str as: \"%s\"", str_tmp ); \
327 maug_munlock( dest_ctl. field ## _h, str_tmp );
332#define RETROGUI_IDC_FMT "%d"
334#define RETROGUI_IDC_NONE -1
339#define RETROGUI_COLOR_BG 1
344#define RETROGUI_COLOR_FG 2
350#define RETROGUI_COLOR_SEL_BG 3
356#define RETROGUI_COLOR_SEL_FG 4
381#define RETROGUI_CTL_TABLE_BASE( f ) \
382 f( 0, NONE, void* none; ) \
383 f( 1, LISTBOX, struct MDATA_VECTOR list; size_t sel_idx; ) \
384 f( 2, BUTTON, MAUG_MHANDLE label_h; char* label; size_t label_sz; int16_t push_frames; uint8_t font_flags; ) \
385 f( 3, LABEL, uint8_t flags; MAUG_MHANDLE label_h; char* label; size_t label_sz; uint8_t font_flags; size_t shown_sz; int show_ticks; ) \
386 f( 4, IMAGE, retroflat_blit_t image; ssize_t image_cache_id; int16_t instance; retroflat_pxxy_t src_x; retroflat_pxxy_t src_y; ) \
387 f( 5, FILLBAR, uint8_t flags; uint16_t cur; uint16_t max; )
389#ifdef RETROGUI_NO_TEXTBOX
390# define RETROGUI_CTL_TABLE( f ) RETROGUI_CTL_TABLE_BASE( f )
392# define RETROGUI_CTL_TABLE( f ) RETROGUI_CTL_TABLE_BASE( f ) \
393 f( 6, TEXTBOX, MAUG_MHANDLE text_h; char* text; size_t text_sz; size_t text_sz_max; size_t text_cur; int16_t blink_frames; )
397 f( 6, SCROLLBAR,
size_t min;
size_t max;
size_t value; )
400#ifdef RETROGUI_NO_TEXTBOX
402 (RETROGUI_CTL_TYPE_BUTTON == (ctl)->base.type || \
403 RETROGUI_CTL_TYPE_LISTBOX == (ctl)->base.type)
409 (RETROGUI_CTL_TYPE_BUTTON == (ctl)->base.type || \
410 RETROGUI_CTL_TYPE_TEXTBOX == (ctl)->base.type || \
411 RETROGUI_CTL_TYPE_LISTBOX == (ctl)->base.type)
426#if defined( RETROGUI_NATIVE_WIN )
435#define RETROGUI_CTL_TABLE_FIELDS( idx, c_name, c_fields ) \
436 struct RETROGUI_CTL_ ## c_name { \
437 struct RETROGUI_CTL_BASE base; \
447#define RETROGUI_CTL_TABLE_TYPES( idx, c_name, c_fields ) \
448 struct RETROGUI_CTL_ ## c_name c_name;
457typedef void (*retrogui_xy_cb)(
460typedef char retrogui_list_t[RETROGUI_CTL_LISTBOX_STR_SZ_MAX + 1];
479 retroflat_blit_t* draw_bmp;
480 retroflat_ms_t debounce_next;
481 retroflat_ms_t debounce_max;
482#ifdef RETROGXC_PRESENT
510 struct RETROGUI* gui, RETROFLAT_IN_KEY* p_input,
538#ifndef RETROGUI_NO_TEXTBOX
553 const char* fmt, ... );
603 struct RETROGUI* gui,
size_t start, ssize_t incr );
641#define retrogui_focus_next( gui ) \
642 retrogui_focus_iter( gui, 0, 1 )
644#define retrogui_focus_prev( gui ) \
645 retrogui_focus_iter( gui, mdata_vector_ct( &((gui)->ctls) ) - 1, -1 )
649#define RETROGUI_CTL_TABLE_CONSTS( idx, c_name, c_fields ) \
650 MAUG_CONST uint8_t SEG_MCONST RETROGUI_CTL_TYPE_ ## c_name = idx;
652RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_CONSTS )
654#ifdef RETROGUI_TRACE_TOKENS
656#define RETROGUI_CTL_TABLE_NAMES( idx, c_name, f_fields ) \
659MAUG_CONST
char* SEG_MCONST gc_retrogui_ctl_names[] = {
660 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_NAMES )
715static void retrogui_destroy_NONE(
union RETROGUI_CTL* ctl ) {
739# if defined( RETROGUI_NATIVE_WIN )
743 if( !mdata_vector_is_locked( &(ctl->LISTBOX.list) ) ) {
751 (
char*)mdata_vector_get( &(ctl->LISTBOX.list), i, retrogui_list_t );
754#ifdef RETROGXC_PRESENT
756 gui->draw_bmp, list_i, 0, gui->font_idx,
757 ctl->base.w, ctl->base.h, &w, &h, 0 );
760 gui->draw_bmp, list_i, 0, gui->
font_h,
761 ctl->base.w, ctl->base.h, &w, &h, 0 );
768 ctl->LISTBOX.sel_idx = i;
781 if( MERROR_OK != retval ) {
782 idc_out = RETROGUI_IDC_NONE;
798 ctl->LISTBOX.sel_idx++;
799 if( ctl->LISTBOX.sel_idx >=
mdata_vector_ct( &(ctl->LISTBOX.list) ) ) {
800 ctl->LISTBOX.sel_idx = 0;
809 ctl->LISTBOX.sel_idx--;
811 if( ctl->LISTBOX.sel_idx >=
mdata_vector_ct( &(ctl->LISTBOX.list) ) ) {
824static void retrogui_redraw_LISTBOX(
836# if defined( RETROGUI_NATIVE_WIN )
840 if( !mdata_vector_is_locked( &(ctl->LISTBOX.list) ) ) {
845 if( RETROFLAT_COLOR_BLACK != ctl->base.bg_color ) {
846 retroflat_2d_rect( gui->draw_bmp, ctl->base.bg_color,
847 gui->x + ctl->base.x, gui->y + ctl->base.y,
853 (
char*)mdata_vector_get( &(ctl->LISTBOX.list), i, retrogui_list_t );
854#ifdef RETROGXC_PRESENT
856 gui->draw_bmp, list_i, 0, gui->font_idx,
857 ctl->base.w, ctl->base.h, &w, &h, 0 );
860 gui->draw_bmp, list_i, 0, gui->
font_h,
861 ctl->base.w, ctl->base.h, &w, &h, 0 );
863#if RETROGUI_TRACE_LVL > 0
864 debug_printf( RETROGUI_TRACE_LVL,
865 "str height for \"%s\": " SIZE_T_FMT, list_i, h );
867 if( i == ctl->LISTBOX.sel_idx ) {
869 retroflat_2d_rect( gui->draw_bmp, ctl->base.sel_bg,
870 gui->x + ctl->base.x,
871 gui->y + ctl->base.y + item_y,
873 fg_color = ctl->base.sel_fg;
875 retroflat_2d_ellipse(
876 gui->draw_bmp, ctl->base.sel_fg,
877 gui->x + ctl->base.x,
878 gui->y + ctl->base.y + item_y,
879 RETROGUI_CTL_LISTBOX_CURSOR_RADIUS,
880 RETROGUI_CTL_LISTBOX_CURSOR_RADIUS, 0 );
883 fg_color = ctl->base.fg_color;
886#ifdef RETROGXC_PRESENT
888 gui->draw_bmp, fg_color, list_i, 0, gui->font_idx,
889 gui->x + ctl->base.x +
891 gui->y + ctl->base.y + item_y,
895 gui->draw_bmp, fg_color, list_i, 0, gui->
font_h,
896 gui->x + ctl->base.x +
898 gui->y + ctl->base.y + item_y,
913 if( MERROR_OK != retval ) {
914 error_printf(
"error drawing LISTBOX: %d", retval );
926# if defined( RETROGUI_NATIVE_WIN )
929 SendMessage( ctl->base.hwnd, LB_SETCURSEL, item_idx, 0 );
933 ctl->LISTBOX.sel_idx = item_idx;
946 retrogui_list_t item_stage;
949 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
954#if RETROGUI_TRACE_LVL > 0
955 debug_printf( RETROGUI_TRACE_LVL,
956 "pushing item \"%s\" to listbox " RETROGUI_IDC_FMT
"...", item, idc );
959 ctl = _retrogui_get_ctl_by_idc( gui, idc );
962 error_printf(
"could not add item: %s", item );
967# if defined( RETROGUI_NATIVE_WIN )
969 SendMessage( ctl->LISTBOX.base.hwnd, LB_ADDSTRING, 0, (LPARAM)item );
973 maug_mzero( item_stage, RETROGUI_CTL_LISTBOX_STR_SZ_MAX + 1 );
974 maug_strncpy( item_stage, item, RETROGUI_CTL_LISTBOX_STR_SZ_MAX );
976 &(ctl->LISTBOX.list), item_stage, RETROGUI_CTL_LISTBOX_STR_SZ_MAX + 1 );
978 retval = merror_sz_to_retval( i );
997# if defined( RETROGUI_NATIVE_WIN )
999 ctl->base.hwnd = CreateWindow(
1000 "LISTBOX", NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD,
1001 gui->x + ctl->base.x, gui->y + ctl->base.y, ctl->base.w, ctl->base.h,
1002 g_retroflat_state->window, (HMENU)(ctl->base.idc),
1003 g_retroflat_instance, NULL );
1004#if RETROGUI_TRACE_LVL > 0
1005 debug_printf( RETROGUI_TRACE_LVL,
1006 "listbox hwnd: %p", ctl->LISTBOX.base.hwnd );
1008 if( (HWND)NULL == ctl->base.hwnd ) {
1009 error_printf(
"could not create listbox" );
1010 retval = MERROR_GUI;
1047static void retrogui_destroy_LISTBOX(
union RETROGUI_CTL* ctl ) {
1048 mdata_vector_free( &(ctl->LISTBOX.list) );
1054#if RETROGUI_TRACE_LVL > 0
1055 debug_printf( RETROGUI_TRACE_LVL,
1056 "initializing listbox " RETROGUI_IDC_FMT
"...", ctl->base.idc );
1059 ctl->base.bg_color = RETROFLAT_COLOR_WHITE;
1060 ctl->base.sel_fg = RETROFLAT_COLOR_WHITE;
1061 if( 2 < retroflat_screen_colors() ) {
1062 ctl->base.sel_bg = RETROFLAT_COLOR_BLUE;
1065 ctl->base.sel_bg = RETROFLAT_COLOR_BLACK;
1066 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
1081 if( 0 < ctl->BUTTON.push_frames ) {
1086 idc_out = ctl->base.idc;
1090 ctl->BUTTON.push_frames = 3;
1110static void retrogui_redraw_BUTTON(
1121 if( ctl->base.idc == gui->
focus ) {
1123 fg_color = ctl->base.sel_fg;
1126 if( ctl->base.idc == gui->
focus ) {
1128 bg_color = ctl->base.sel_bg;
1132 if( 2 >= retroflat_screen_colors() ) {
1133 push_shadow_color = RETROFLAT_COLOR_BLACK;
1134 border_color = RETROFLAT_COLOR_BLACK;
1138 gui->draw_bmp, bg_color, gui->x + ctl->base.x, gui->y + ctl->base.y,
1141 retroflat_2d_rect( gui->draw_bmp, border_color,
1142 gui->x + ctl->base.x, gui->y + ctl->base.y,
1143 ctl->base.w, ctl->base.h, 0 );
1148 if( 0 < ctl->BUTTON.push_frames ) {
1150 gui->draw_bmp, push_shadow_color,
1151 gui->x + ctl->base.x + 1, gui->y + ctl->base.y + 1,
1152 gui->x + ctl->base.x + ctl->base.w - 2, gui->y + ctl->base.y + 1, 0 );
1154 gui->draw_bmp, push_shadow_color,
1155 gui->x + ctl->base.x + 1, gui->y + ctl->base.y + 2,
1156 gui->x + ctl->base.x + 1, gui->y + ctl->base.y + ctl->base.h - 3, 0 );
1159 ctl->BUTTON.push_frames--;
1164 gui->draw_bmp, RETROFLAT_COLOR_WHITE,
1165 gui->x + ctl->base.x + 1, gui->y + ctl->base.y + 1,
1166 gui->x + ctl->base.x + ctl->base.w - 2, gui->y + ctl->base.y + 1, 0 );
1168 gui->draw_bmp, RETROFLAT_COLOR_WHITE,
1169 gui->x + ctl->base.x + 1, gui->y + ctl->base.y + 2,
1170 gui->x + ctl->base.x + 1, gui->y + ctl->base.y + ctl->base.h - 3, 0 );
1173 maug_mlock( ctl->BUTTON.label_h, ctl->BUTTON.label );
1174 if( NULL == ctl->BUTTON.label ) {
1175 error_printf(
"could not lock BUTTON label!" );
1180#ifdef RETROGXC_PRESENT
1183 retrofont_string_sz(
1185 gui->draw_bmp, ctl->BUTTON.label, 0,
1186#ifdef RETROGXC_PRESENT
1192 ctl->base.w, ctl->base.h, &w, &h, ctl->BUTTON.font_flags );
1194#ifdef RETROGXC_PRESENT
1199 gui->draw_bmp, fg_color, ctl->BUTTON.label, 0,
1200#ifdef RETROGXC_PRESENT
1205 gui->x + ctl->base.x + ((ctl->base.w >> 1) - (w >> 1)) + text_offset,
1206 gui->y + ctl->base.y + ((ctl->base.h >> 1) - (h >> 1)) + text_offset,
1208 ctl->base.w, ctl->base.h, ctl->BUTTON.font_flags );
1210 maug_munlock( ctl->BUTTON.label_h, ctl->BUTTON.label );
1220# if defined( RETROGUI_NATIVE_WIN )
1222 ctl->base.hwnd = CreateWindow(
1223 "BUTTON", ctl->BUTTON.label, WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
1224 gui->x + ctl->base.x, gui->y + ctl->base.y, ctl->base.w, ctl->base.h,
1225 g_retroflat_state->window, (HMENU)(ctl->base.idc),
1226 g_retroflat_instance, NULL );
1227 if( (HWND)NULL == ctl->base.hwnd ) {
1229 "Could not create button " RETROGUI_IDC_FMT
": %s",
1230 ctl->base.idc, ctl->BUTTON.label );
1231 retval = MERROR_GUI;
1236 char* label_tmp = NULL;
1238#if RETROGUI_TRACE_LVL > 0
1239 debug_printf( RETROGUI_TRACE_LVL,
"pushing BUTTON control..." );
1243 label, ctl->BUTTON.label, ctl->BUTTON, label_tmp, ctl->BUTTON.label_sz );
1244 ctl->BUTTON.label = NULL;
1259 assert( NULL != ctl );
1260 assert( NULL == ctl->BUTTON.label );
1261 assert( (MAUG_MHANDLE)NULL != ctl->BUTTON.label_h );
1263 maug_mlock( ctl->BUTTON.label_h, ctl->BUTTON.label );
1264 maug_cleanup_if_null_lock(
char*, ctl->BUTTON.label );
1267#ifdef RETROGXC_PRESENT
1270 retrofont_string_sz(
1275#ifdef RETROGXC_PRESENT
1283 p_h, ctl->BUTTON.font_flags );
1286 *p_w += RETROGUI_BTN_LBL_PADDED_X;
1287 *p_h += RETROGUI_BTN_LBL_PADDED_Y;
1291 maug_munlock( ctl->BUTTON.label_h, ctl->BUTTON.label );
1303# if defined( RETROGUI_NATIVE_WIN )
1306 assert( NULL != ctl );
1321static void retrogui_destroy_BUTTON(
union RETROGUI_CTL* ctl ) {
1322 if( (MAUG_MHANDLE)NULL != ctl->BUTTON.label_h ) {
1323 maug_mfree( ctl->BUTTON.label_h );
1330#if RETROGUI_TRACE_LVL > 0
1331 debug_printf( RETROGUI_TRACE_LVL,
1332 "initializing button " RETROGUI_IDC_FMT
"...", ctl->base.idc );
1335 if( 2 < retroflat_screen_colors() ) {
1337 ctl->base.bg_color = RETROFLAT_COLOR_GRAY;
1338 ctl->base.sel_fg = RETROFLAT_COLOR_BLUE;
1339 ctl->base.sel_bg = RETROFLAT_COLOR_GRAY;
1341 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
1342 ctl->base.bg_color = RETROFLAT_COLOR_WHITE;
1343 ctl->base.sel_fg = RETROFLAT_COLOR_WHITE;
1344 ctl->base.sel_bg = RETROFLAT_COLOR_BLACK;
1350#ifndef RETROGUI_NO_TEXTBOX
1371# if defined( RETROGUI_NATIVE_WIN )
1375 c = retroflat_vk_to_ascii( *p_input, input_evt->key_flags );
1380 RETROFLAT_KEY_RIGHT != *p_input &&
1381 RETROFLAT_KEY_LEFT != *p_input
1387 assert( NULL == ctl->TEXTBOX.text );
1388 assert( (MAUG_MHANDLE)NULL != ctl->TEXTBOX.text_h );
1389 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
1390 if( NULL == ctl->TEXTBOX.text ) {
1391 error_printf(
"could not lock TEXTBOX text handle!" );
1395 switch( *p_input ) {
1396 case RETROFLAT_KEY_BKSP:
1398 ctl->TEXTBOX.text, ctl->TEXTBOX.text_cur, ctl->TEXTBOX.text_sz )
1401 case RETROFLAT_KEY_ENTER:
1402 idc_out = ctl->base.idc;
1405 case RETROFLAT_KEY_LEFT:
1406 if( 0 < ctl->TEXTBOX.text_cur ) {
1407 ctl->TEXTBOX.text_cur--;
1411 case RETROFLAT_KEY_RIGHT:
1412 if( ctl->TEXTBOX.text_sz > ctl->TEXTBOX.text_cur ) {
1413 ctl->TEXTBOX.text_cur++;
1418 assert( ctl->TEXTBOX.text_sz < ctl->TEXTBOX.text_sz_max );
1419 debug_printf( 1,
"cur: %d, sz: %d, sz_max: %d",
1420 ctl->TEXTBOX.text_cur, ctl->TEXTBOX.text_sz, ctl->TEXTBOX.text_sz_max );
1423 ctl->TEXTBOX.text_cur,
1424 ctl->TEXTBOX.text_sz,
1425 ctl->TEXTBOX.text_sz_max );
1433 if( NULL != ctl->TEXTBOX.text ) {
1434 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
1442static void retrogui_redraw_TEXTBOX(
1451 if( 2 >= retroflat_screen_colors() ) {
1452 shadow_color = RETROFLAT_COLOR_BLACK;
1453 border_color = RETROFLAT_COLOR_BLACK;
1456# if defined( RETROGUI_NATIVE_WIN )
1460 retroflat_2d_rect( gui->draw_bmp, ctl->base.bg_color,
1461 gui->x + ctl->base.x, gui->y + ctl->base.y,
1466 retroflat_2d_rect( gui->draw_bmp, border_color,
1467 gui->x + ctl->base.x,
1468 gui->y + ctl->base.y, ctl->base.w, 2,
1471 retroflat_2d_rect( gui->draw_bmp, border_color,
1472 gui->x + ctl->base.x,
1473 gui->y + ctl->base.y, 2, ctl->base.h,
1476 retroflat_2d_rect( gui->draw_bmp, shadow_color,
1477 gui->x + ctl->base.x,
1478 gui->y + ctl->base.y + ctl->base.h - 1,
1482 retroflat_2d_rect( gui->draw_bmp, shadow_color,
1483 gui->x + ctl->base.x + ctl->base.w - 1,
1484 gui->y + ctl->base.y, 2, ctl->base.h,
1489 assert( NULL == ctl->TEXTBOX.text );
1490 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
1491 if( NULL == ctl->TEXTBOX.text ) {
1495#ifdef RETROGXC_PRESENT
1497 gui->draw_bmp, ctl->base.fg_color,
1498 ctl->TEXTBOX.text, ctl->TEXTBOX.text_cur, gui->font_idx,
1504 gui->draw_bmp, ctl->TEXTBOX.text, ctl->TEXTBOX.text_cur, gui->font_idx,
1508 gui->draw_bmp, ctl->base.fg_color,
1509 ctl->TEXTBOX.text, ctl->TEXTBOX.text_cur, gui->
font_h,
1514 retrofont_string_sz(
1515 gui->draw_bmp, ctl->TEXTBOX.text, ctl->TEXTBOX.text_cur, gui->
font_h,
1521 if( cursor_x + RETROGUI_CTL_TEXT_CUR_WH >= ctl->base.w ) {
1524 cursor_y += RETROGUI_CTL_TEXT_CUR_WH;
1528 retroflat_2d_rect( gui->draw_bmp,
1532 RETROGUI_CTL_TEXT_CUR_WH, RETROGUI_CTL_TEXT_CUR_WH,
1535 gui->
focus == ctl->base.idc &&
1538 if( (-1 * RETROGUI_CTL_TEXT_BLINK_FRAMES) > --(ctl->TEXTBOX.blink_frames) ) {
1539 ctl->TEXTBOX.blink_frames = RETROGUI_CTL_TEXT_BLINK_FRAMES;
1542 if( NULL != ctl->TEXTBOX.text ) {
1544 #ifdef RETROGXC_PRESENT
1545 retrogxc_string_indent(
1546 gui->draw_bmp, ctl->base.fg_color,
1547 &(ctl->TEXTBOX.text[ctl->TEXTBOX.text_cur]),
1549 strlen( ctl->TEXTBOX.text ) - ctl->TEXTBOX.text_cur,
1554 ctl->base.w, ctl->base.h,
1555 cursor_x + RETROGUI_CTL_TEXT_CUR_WH, 0 );
1557 retrofont_string_indent(
1558 gui->draw_bmp, ctl->base.fg_color,
1559 &(ctl->TEXTBOX.text[ctl->TEXTBOX.text_cur]),
1561 strlen( ctl->TEXTBOX.text ) - ctl->TEXTBOX.text_cur,
1566 ctl->base.w, ctl->base.h,
1567 cursor_x + RETROGUI_CTL_TEXT_CUR_WH, 0 );
1570 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
1583# if defined( RETROGUI_NATIVE_WIN )
1585 ctl->base.hwnd = CreateWindow(
1586 "EDIT", 0, WS_CHILD | WS_VISIBLE | WS_BORDER,
1587 gui->x + ctl->base.x, gui->y + ctl->base.y, ctl->base.w, ctl->base.h,
1588 g_retroflat_state->window, (HMENU)(ctl->base.idc),
1589 g_retroflat_instance, NULL );
1590 if( (HWND)NULL == ctl->base.hwnd ) {
1592 "Could not create textbox: " RETROGUI_IDC_FMT, ctl->base.idc );
1593 retval = MERROR_GUI;
1599#if RETROGUI_TRACE_LVL > 0
1600 debug_printf( RETROGUI_TRACE_LVL,
1601 "clearing textbox " RETROGUI_IDC_FMT
" buffer...", ctl->base.idc );
1603 assert( (MAUG_MHANDLE)NULL == ctl->TEXTBOX.text_h );
1604 maug_malloc_test( ctl->TEXTBOX.text_h, RETROGUI_CTL_TEXT_SZ_MAX + 1, 1 );
1605 ctl->TEXTBOX.text_sz_max = RETROGUI_CTL_TEXT_SZ_MAX;
1607 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
1608 maug_cleanup_if_null_alloc(
char*, ctl->TEXTBOX.text );
1609#if RETROGUI_TRACE_LVL > 0
1610 debug_printf( RETROGUI_TRACE_LVL,
1611 "clearing textbox " RETROGUI_IDC_FMT
" buffer...", ctl->base.idc );
1613 maug_mzero( ctl->TEXTBOX.text, RETROGUI_CTL_TEXT_SZ_MAX + 1 );
1614 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
1643static void retrogui_destroy_TEXTBOX(
union RETROGUI_CTL* ctl ) {
1644 if( (MAUG_MHANDLE)NULL != ctl->TEXTBOX.text_h ) {
1645 maug_mfree( ctl->TEXTBOX.text_h );
1652#if RETROGUI_TRACE_LVL > 0
1653 debug_printf( RETROGUI_TRACE_LVL,
1654 "initializing textbox " RETROGUI_IDC_FMT
"...", ctl->base.idc );
1657 ctl->base.bg_color = RETROFLAT_COLOR_WHITE;
1658 ctl->base.sel_bg = RETROFLAT_COLOR_WHITE;
1659 if( 2 < retroflat_screen_colors() ) {
1660 ctl->base.sel_fg = RETROFLAT_COLOR_BLUE;
1663 ctl->base.sel_fg = RETROFLAT_COLOR_BLACK;
1664 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
1679 return RETROGUI_IDC_NONE;
1686 return RETROGUI_IDC_NONE;
1689static void retrogui_redraw_LABEL(
1694# if defined( RETROGUI_NATIVE_WIN )
1700#ifdef RETROGXC_PRESENT
1701 assert( 0 <= gui->font_idx );
1703 assert( (MAUG_MHANDLE)NULL != gui->
font_h );
1706 assert( NULL == ctl->LABEL.label );
1707 maug_mlock( ctl->LABEL.label_h, ctl->LABEL.label );
1708 if( NULL == ctl->LABEL.label ) {
1709 error_printf(
"could not lock LABEL text!" );
1717 if( 0 < ctl->LABEL.show_ticks ) {
1719 ctl->LABEL.show_ticks--;
1720 show_sz = ctl->LABEL.shown_sz;
1721 if( ctl->LABEL.shown_sz < ctl->LABEL.label_sz ) {
1727 ctl->LABEL.show_ticks =
1735 if( show_sz > ctl->LABEL.label_sz ) {
1737 show_sz = ctl->LABEL.label_sz;
1744 ctl->LABEL.shown_sz = show_sz;
1748 show_sz = ctl->LABEL.label_sz;
1751#ifdef RETROGXC_PRESENT
1756 gui->draw_bmp, ctl->base.fg_color, ctl->LABEL.label, show_sz,
1757#ifdef RETROGXC_PRESENT
1764 ctl->LABEL.font_flags );
1768 if( NULL != ctl->LABEL.label ) {
1769 maug_munlock( ctl->LABEL.label_h, ctl->LABEL.label );
1780# if defined( RETROGUI_NATIVE_WIN )
1785 char* label_tmp = NULL;
1787#if RETROGUI_TRACE_LVL > 0
1788 debug_printf( RETROGUI_TRACE_LVL,
"pushing LABEL control..." );
1792 label, ctl->LABEL.label, ctl->LABEL, label_tmp, ctl->LABEL.label_sz );
1793 ctl->LABEL.label = NULL;
1794 ctl->LABEL.shown_sz = 1;
1795 ctl->LABEL.show_ticks =
1827static void retrogui_destroy_LABEL(
union RETROGUI_CTL* ctl ) {
1828 if( (MAUG_MHANDLE)NULL != ctl->LABEL.label_h ) {
1829 maug_mfree( ctl->LABEL.label_h );
1836#if RETROGUI_TRACE_LVL > 0
1837 debug_printf( RETROGUI_TRACE_LVL,
1838 "initializing label " RETROGUI_IDC_FMT
"...", ctl->base.idc );
1841 if( 2 < retroflat_screen_colors() ) {
1844 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
1846 ctl->base.bg_color = RETROFLAT_COLOR_WHITE;
1858 return RETROGUI_IDC_NONE;
1865 return RETROGUI_IDC_NONE;
1868static void retrogui_redraw_IMAGE(
1871# if defined( RETROGUI_NATIVE_WIN )
1875# if defined( RETROGXC_PRESENT )
1876 if( 0 <= ctl->IMAGE.image_cache_id ) {
1879#if RETROGUI_TRACE_LVL > 0
1880 debug_printf( RETROGUI_TRACE_LVL,
1881 "redrawing image ctl " RETROGUI_IDC_FMT
1882 ", cache ID " SSIZE_T_FMT
"...",
1883 ctl->base.idc, ctl->IMAGE.image_cache_id );
1885 retrogxc_blit_bitmap(
1887 ctl->IMAGE.image_cache_id,
1888 ctl->IMAGE.src_x, ctl->IMAGE.src_y,
1889 gui->x + ctl->base.x, gui->y + ctl->base.y, ctl->base.w, ctl->base.h,
1890 ctl->IMAGE.instance );
1893 if( retroflat_2d_bitmap_ok( &(ctl->IMAGE.image) ) ) {
1895 retroflat_2d_blit_bitmap(
1897 &(ctl->IMAGE.image),
1898 ctl->IMAGE.src_x, ctl->IMAGE.src_y,
1899 gui->x + ctl->base.x, gui->y + ctl->base.y, ctl->base.w, ctl->base.h,
1900 ctl->IMAGE.instance );
1911# if defined( RETROGUI_NATIVE_WIN )
1917#if RETROGUI_TRACE_LVL > 0
1918 debug_printf( RETROGUI_TRACE_LVL,
"pushing IMAGE control..." );
1921 assert( !retroflat_2d_bitmap_ok( &(ctl->IMAGE.image) ) );
1941# ifdef RETROGXC_PRESENT
1942 retval = retrogxc_bitmap_wh( ctl->IMAGE.image_cache_id, p_w, p_h );
1943 maug_cleanup_if_not_ok();
1947 0 == *p_w && 0 == *p_h &&
1948 !retroflat_2d_bitmap_ok( &(ctl->IMAGE.image) )
1950 error_printf(
"image not assigned!" );
1951 retval = MERROR_GUI;
1955 *p_w = retroflat_2d_bitmap_w( &(ctl->IMAGE.image) );
1956 *p_h = retroflat_2d_bitmap_h( &(ctl->IMAGE.image) );
1973static void retrogui_destroy_IMAGE(
union RETROGUI_CTL* ctl ) {
1974 if( retroflat_2d_bitmap_ok( &(ctl->IMAGE.image) ) ) {
1975 retroflat_2d_destroy_bitmap( &(ctl->IMAGE.image) );
1982#if RETROGUI_TRACE_LVL > 0
1983 debug_printf( RETROGUI_TRACE_LVL,
1984 "initializing IMAGE " RETROGUI_IDC_FMT
"...", ctl->base.idc );
2011static void retrogui_redraw_FILLBAR(
2016 if( 0 == ctl->FILLBAR.cur ) {
2019 fill_w = ctl->base.w * ctl->FILLBAR.cur / ctl->FILLBAR.max;
2023 gui->draw_bmp, ctl->base.bg_color,
2024 gui->x + ctl->base.x + fill_w,
2025 gui->y + ctl->base.y,
2029 gui->draw_bmp, ctl->base.fg_color,
2030 gui->x + ctl->base.x,
2031 gui->y + ctl->base.y,
2040# if defined( RETROGUI_NATIVE_WIN )
2056 assert( NULL != ctl );
2070# if defined( RETROGUI_NATIVE_WIN )
2073 assert( NULL != ctl );
2088static void retrogui_destroy_FILLBAR(
union RETROGUI_CTL* ctl ) {
2094#if RETROGUI_TRACE_LVL > 0
2095 debug_printf( RETROGUI_TRACE_LVL,
2096 "initializing fillbar " RETROGUI_IDC_FMT
"...", ctl->base.idc );
2099 if( 2 < retroflat_screen_colors() ) {
2101 ctl->base.bg_color = RETROFLAT_COLOR_GRAY;
2103 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
2104 ctl->base.bg_color = RETROFLAT_COLOR_WHITE;
2118 assert( mdata_vector_is_locked( &((gui)->ctls) ) );
2121 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
2122 if( idc == ctl->base.idc ) {
2129 error_printf(
"could not find GUI item IDC " RETROGUI_IDC_FMT, idc );
2145 assert( mdata_vector_is_locked( &((gui)->ctls) ) );
2147#if RETROGUI_TRACE_LVL > 0
2148 debug_printf( RETROGUI_TRACE_LVL,
2149 "sizing control " RETROGUI_IDC_FMT
" to: " SIZE_T_FMT
"x" SIZE_T_FMT,
2150 idc, max_w, max_h );
2153 ctl = _retrogui_get_ctl_by_idc( gui, idc );
2156 error_printf(
"could not size item!" );
2157 retval = MERROR_GUI;
2161 #define RETROGUI_CTL_TABLE_SZ( idx, c_name, c_fields ) \
2162 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2164 retval = retrogui_sz_ ## c_name( gui, ctl, p_w, p_h, max_w, max_h ); \
2165 maug_cleanup_if_not_ok();
2168 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_SZ )
2171#if RETROGUI_TRACE_LVL > 0
2172 debug_printf( RETROGUI_TRACE_LVL,
2173 "sized control " RETROGUI_IDC_FMT
" at " SIZE_T_FMT
"x" SIZE_T_FMT
"...",
2174 ctl->base.idc, ctl->base.w, ctl->base.h );
2185 struct RETROGUI* gui, RETROFLAT_IN_KEY* p_input,
2196 return RETROGUI_IDC_NONE;
2199 assert( !mdata_vector_is_locked( &((gui)->ctls) ) );
2202# if defined( RETROGUI_NATIVE_WIN )
2204 if( 0 == g_retroflat_state->last_idc ) {
2209 ctl = retrogui_get_ctl_by_idc( gui, g_retroflat_state->last_idc );
2210 g_retroflat_state->last_idc = 0;
2212#if RETROGUI_TRACE_LVL > 0
2213 debug_printf( RETROGUI_TRACE_LVL,
2214 "invalid IDC: " RETROGUI_IDC_FMT, gui->
focus );
2219# ifndef RETROGUI_NO_TEXTBOX
2220 if( RETROGUI_CTL_TYPE_TEXTBOX == ctl->base.type ) {
2221 if( SendMessage( ctl->base.hwnd, EM_GETMODIFY, 0, 0 ) ) {
2222 SendMessage( ctl->base.hwnd, EM_SETMODIFY, 0, 0 );
2223#if RETROGUI_TRACE_LVL > 0
2224 debug_printf( RETROGUI_TRACE_LVL,
"mod: %d",
2225 SendMessage( ctl->base.hwnd, EM_GETMODIFY, 0, 0 ) );
2235# define RETROGUI_CTL_TABLE_CLICK( idx, c_name, c_fields ) \
2236 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2237 gui->flags |= RETROGUI_FLAGS_DIRTY; \
2238 idc_out = retrogui_click_ ## c_name( gui, ctl, p_input, input_evt );
2240# define RETROGUI_CTL_TABLE_KEY( idx, c_name, c_fields ) \
2241 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2242 gui->flags |= RETROGUI_FLAGS_DIRTY; \
2243 idc_out = retrogui_key_ ## c_name( gui, ctl, p_input, input_evt );
2245 if( 0 != *p_input ) {
2246#if RETROGUI_TRACE_LVL > 0
2247 debug_printf( RETROGUI_TRACE_LVL,
2248 "focus " RETROGUI_IDC_FMT
" input: %d", gui->
focus, *p_input );
2253 if( retroflat_get_ms() < gui->debounce_next ) {
2254#if RETROGUI_TRACE_LVL > 0
2255 debug_printf( RETROGUI_TRACE_LVL,
2256 "debo! %d vs %d", retroflat_get_ms(), gui->debounce_next );
2261 if( 0 == *p_input ) {
2269 if( 0 <= gui->
focus ) {
2270 idc_out = gui->
focus;
2278 retrogui_focus_next( gui );
2280#if RETROGUI_TRACE_LVL > 0
2281 debug_printf( RETROGUI_TRACE_LVL,
"next: " RETROGUI_IDC_FMT, gui->
focus );
2290 retrogui_focus_prev( gui );
2292#if RETROGUI_TRACE_LVL > 0
2293 debug_printf( RETROGUI_TRACE_LVL,
"prev: " RETROGUI_IDC_FMT, gui->
focus );
2299# ifndef RETROGUI_NO_MOUSE
2301 RETROFLAT_MOUSE_B_LEFT == *p_input ||
2302 RETROFLAT_MOUSE_B_RIGHT == *p_input
2307#if RETROGUI_TRACE_LVL > 0
2308 debug_printf( RETROGUI_TRACE_LVL,
"resetting focus for mouse click..." );
2310 gui->
focus = RETROGUI_IDC_NONE;
2312 mouse_x = input_evt->
mouse_x - gui->x;
2313 mouse_y = input_evt->
mouse_y - gui->y;
2316 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
2318 mouse_x < ctl->base.x ||
2319 mouse_y < ctl->base.y ||
2320 mouse_x > ctl->base.x + ctl->base.w ||
2321 mouse_y > ctl->base.y + ctl->base.h
2326 if( gui->idc_prev == ctl->base.idc ) {
2329 idc_out = RETROGUI_IDC_NONE;
2333 gui->idc_prev = ctl->base.idc;
2335#if RETROGUI_TRACE_LVL > 0
2336 debug_printf( RETROGUI_TRACE_LVL,
2337 "setting focus to clicked control: " RETROGUI_IDC_FMT,
2340 gui->
focus = ctl->base.idc;
2343 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_CLICK )
2351 if( RETROGUI_IDC_NONE == gui->
focus ) {
2357 ctl = _retrogui_get_ctl_by_idc( gui, gui->
focus );
2362#if RETROGUI_TRACE_LVL > 0
2363 debug_printf( RETROGUI_TRACE_LVL,
2364 "invalid focus IDC: " RETROGUI_IDC_FMT, gui->
focus );
2370 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_KEY )
2375 gui->debounce_next = retroflat_get_ms() + gui->debounce_max;
2381 if( MERROR_OK != retval ) {
2382 idc_out = RETROGUI_IDC_NONE;
2398#if RETROGUI_TRACE_LVL > 0
2399 debug_printf( RETROGUI_TRACE_LVL,
"redrawing controls..." );
2402#ifndef RETROWIN_NO_BITMAP
2413 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
2419 RETROFLAT_COLOR_BLACK != gui->bg_color &&
2420 0 < gui->w && 0 < gui->h
2422 retroflat_2d_rect( gui->draw_bmp,
2427 gui->flags &= ~RETROGUI_FLAGS_DIRTY;
2429 #define RETROGUI_CTL_TABLE_REDRAW( idx, c_name, c_fields ) \
2430 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2431 retrogui_redraw_ ## c_name( gui, ctl );
2435 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
2437 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_REDRAW )
2441#if RETROGUI_TRACE_LVL > 0
2442 debug_printf( RETROGUI_TRACE_LVL,
"redrawing controls complete!" );
2466 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
2471#if RETROGUI_TRACE_LVL > 0
2472 debug_printf( RETROGUI_TRACE_LVL,
2473 "moving control " RETROGUI_IDC_FMT
" to: " SIZE_T_FMT
", " SIZE_T_FMT,
2477 ctl = _retrogui_get_ctl_by_idc( gui, idc );
2480 error_printf(
"could not position control!" );
2481 retval = MERROR_GUI;
2485 #define RETROGUI_CTL_TABLE_POS( idx, c_name, c_fields ) \
2486 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2488 retval = retrogui_pos_ ## c_name( gui, ctl, x, y, w, h ); \
2489 maug_cleanup_if_not_ok();
2492 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_POS )
2495#if RETROGUI_TRACE_LVL > 0
2496 debug_printf( RETROGUI_TRACE_LVL,
2497 "moved control " RETROGUI_IDC_FMT
" to " SIZE_T_FMT
", " SIZE_T_FMT
2498 " and sized to " SIZE_T_FMT
"x" SIZE_T_FMT
"...",
2499 ctl->base.idc, gui->x + ctl->base.x, gui->y + ctl->base.y,
2500 ctl->base.w, ctl->base.h );
2524 assert( 0 < ctl->base.idc );
2526#ifdef RETROGXC_PRESENT
2527 if( 0 > gui->font_idx ) {
2529 if( (MAUG_MHANDLE)NULL == gui->
font_h ) {
2533 retval = MERROR_GUI;
2539#if RETROGUI_TRACE_LVL > 0
2540 debug_printf( RETROGUI_TRACE_LVL,
2545 RETROGUI_CTL_TYPE_IMAGE != ctl->base.type &&
2546 RETROFLAT_COLOR_NULL == ctl->base.bg_color
2549 "invalid background color specified for control " RETROGUI_IDC_FMT
"!",
2551 retval = MERROR_GUI;
2557 RETROGUI_CTL_TYPE_IMAGE != ctl->base.type &&
2558 RETROFLAT_COLOR_NULL == ctl->base.fg_color
2561 "invalid foreground color specified for control " RETROGUI_IDC_FMT
"!",
2563 retval = MERROR_GUI;
2569#ifdef RETROGUI_TRACE_TOKENS
2570 debug_printf( RETROGUI_TRACE_LVL,
2571 "pushing %s " RETROGUI_IDC_FMT
" to slot " SIZE_T_FMT
"...",
2572 gc_retrogui_ctl_names[ctl->base.type], ctl->base.idc,
2574#elif RETROGUI_TRACE_LVL > 0
2575 debug_printf( RETROGUI_TRACE_LVL,
2576 "pushing control type %d, " RETROGUI_IDC_FMT
" to slot " SIZE_T_FMT
"...",
2587 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
2593 ctl = mdata_vector_get_last( &(gui->ctls),
2595 assert( NULL != ctl );
2597#if RETROGUI_TRACE_LVL > 0
2598# define RETROGUI_CTL_TABLE_PUSH( idx, c_name, c_fields ) \
2599 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2600 debug_printf( RETROGUI_TRACE_LVL, \
2601 "running " #c_name " push hook..." ); \
2602 retval = retrogui_push_ ## c_name( ctl ); \
2603 maug_cleanup_if_not_ok();
2605# define RETROGUI_CTL_TABLE_PUSH( idx, c_name, c_fields ) \
2606 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2607 retval = retrogui_push_ ## c_name( ctl ); \
2608 maug_cleanup_if_not_ok();
2612 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_PUSH )
2618 if( 0 == ctl->base.w || 0 == ctl->base.h ) {
2619#ifdef RETROGUI_TRACE_TOKENS
2620 debug_printf( RETROGUI_TRACE_LVL,
2621 "determining size for new %s control " RETROGUI_IDC_FMT
"...",
2622 gc_retrogui_ctl_names[ctl->base.type], ctl->base.idc );
2623#elif RETROGUI_TRACE_LVL > 0
2624 debug_printf( RETROGUI_TRACE_LVL,
2625 "determining size for new control type %d, " RETROGUI_IDC_FMT
"...",
2626 ctl->base.type, ctl->base.idc );
2628 retval = _retrogui_sz_ctl(
2629 gui, ctl->base.idc, &(ctl->base.w), &(ctl->base.h), 0, 0 );
2630 maug_cleanup_if_not_ok();
2634#if RETROGUI_TRACE_LVL > 0
2635 debug_printf( RETROGUI_TRACE_LVL,
2636 "setting focus to control: " RETROGUI_IDC_FMT, ctl->base.idc );
2638 gui->
focus = ctl->base.idc;
2657 if( mdata_vector_is_locked( &((gui)->ctls) ) ) {
2658 error_printf(
"GUI is locked!" );
2662 assert( !mdata_vector_is_locked( &((gui)->ctls) ) );
2665 #define RETROGUI_CTL_TABLE_FREE_CTL( idx, c_name, c_fields ) \
2666 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2667 retrogui_destroy_ ## c_name( ctl );
2670 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
2671 if( idc != ctl->base.idc ) {
2677 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_FREE_CTL )
2701#ifdef RETROGXC_PRESENT
2702 gui->font_idx = retrogxc_load_font( font_path, 0, 33, 93 );
2704 gui->font_idx, (ssize_t)0, SSIZE_T_FMT, MERROR_GUI );
2707 maug_cleanup_if_not_ok();
2717#ifndef RETROGUI_NO_TEXTBOX
2726 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
2731 ctl = _retrogui_get_ctl_by_idc( gui, idc );
2734 error_printf(
"could not get control text!" );
2735 retval = MERROR_GUI;
2739 if( RETROGUI_CTL_TYPE_TEXTBOX == ctl->base.type ) {
2740# if defined( RETROGUI_NATIVE_WIN )
2743 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
2744 maug_cleanup_if_null_lock(
char*, ctl->TEXTBOX.text );
2746 maug_strncpy( buffer, ctl->TEXTBOX.text, buffer_sz );
2748 }
else if( RETROGUI_CTL_TYPE_LABEL == ctl->base.type ) {
2749# if defined( RETROGUI_NATIVE_WIN )
2752 maug_mlock( ctl->LABEL.label_h, ctl->LABEL.label );
2753 maug_cleanup_if_null_lock(
char*, ctl->LABEL.label );
2755 maug_strncpy( buffer, ctl->LABEL.label, buffer_sz );
2762 if( RETROGUI_CTL_TYPE_TEXTBOX == ctl->base.type ) {
2763 if( NULL != ctl->TEXTBOX.text ) {
2764 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
2767 }
else if( RETROGUI_CTL_TYPE_LABEL == ctl->base.type ) {
2768 if( NULL != ctl->LABEL.label ) {
2769 maug_munlock( ctl->LABEL.label_h, ctl->LABEL.label );
2790 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
2795 ctl = _retrogui_get_ctl_by_idc( gui, idc );
2798 error_printf(
"could not get control selection!" );
2799 retval = MERROR_GUI;
2803 assert( RETROGUI_CTL_TYPE_LISTBOX == ctl->base.type );
2805# if defined( RETROGUI_NATIVE_WIN )
2806 idx = SendMessage( ctl->base.hwnd, LB_GETCARETINDEX, 0, 0 );
2808 idx = ctl->LISTBOX.sel_idx;
2817 if( MERROR_OK != retval ) {
2833 assert( !mdata_vector_is_locked( &((gui)->ctls) ) );
2836#if RETROGUI_TRACE_LVL > 0
2837 debug_printf( RETROGUI_TRACE_LVL,
2838 "setting control " RETROGUI_IDC_FMT
" color %u to: %d",
2839 idc, color_key, color_val );
2843 ctl = _retrogui_get_ctl_by_idc( gui, idc );
2846 error_printf(
"could not set control color!" );
2847 retval = MERROR_GUI;
2851 switch( color_key ) {
2858 error_printf(
"invalid color key specified: %u", color_key );
2873 const char* fmt, ...
2876 char* label_tmp = NULL;
2877 char* buffer = NULL;
2879 MAUG_MHANDLE buffer_h = (MAUG_MHANDLE)NULL;
2882 assert( !mdata_vector_is_locked( &((gui)->ctls) ) );
2885#if RETROGUI_TRACE_LVL > 0
2886 debug_printf( RETROGUI_TRACE_LVL,
2887 "setting control " RETROGUI_IDC_FMT
" text to: %s", idc, fmt );
2891 ctl = _retrogui_get_ctl_by_idc( gui, idc );
2894 error_printf(
"could not set control text!" );
2895 retval = MERROR_GUI;
2900 maug_malloc_test( buffer_h, 1, buffer_sz + 1 );
2903 maug_mlock( buffer_h, buffer );
2904 maug_cleanup_if_null_lock(
char*, buffer );
2905 maug_mzero( buffer, buffer_sz + 1 );
2909 maug_mzero( buffer, buffer_sz + 1);
2913 va_start( args, fmt );
2914 maug_vsnprintf( buffer, buffer_sz, fmt, args );
2919 if( RETROGUI_CTL_TYPE_BUTTON == ctl->base.type ) {
2920 assert( NULL == ctl->BUTTON.label );
2921 _retrogui_copy_str( label, buffer, ctl->BUTTON, label_tmp, buffer_sz );
2922 }
else if( RETROGUI_CTL_TYPE_LABEL == ctl->base.type ) {
2923 assert( NULL == ctl->LABEL.label );
2925 label, buffer, ctl->LABEL, label_tmp, buffer_sz );
2926 ctl->LABEL.shown_sz = 1;
2927 ctl->LABEL.show_ticks =
2933#ifndef RETROGUI_NO_TEXTBOX
2934 }
else if( RETROGUI_CTL_TYPE_TEXTBOX == ctl->base.type ) {
2939 if( buffer_sz > ctl->TEXTBOX.text_sz_max ) {
2940#if RETROGUI_TRACE_LVL > 0
2941 debug_printf( RETROGUI_TRACE_LVL,
2942 "string size different; creating new buffer..." );
2944 if( (MAUG_MHANDLE)NULL != ctl->TEXTBOX.text_h ) {
2946 maug_mfree( ctl->TEXTBOX.text_h );
2950 maug_malloc_test( ctl->TEXTBOX.text_h, buffer_sz + 1, 1 );
2952 ctl->TEXTBOX.text_sz_max = buffer_sz;
2954 ctl->TEXTBOX.text_sz = buffer_sz;
2955 ctl->TEXTBOX.text_cur = 0;
2956 maug_mlock( ctl->TEXTBOX.text_h, label_tmp );
2957 maug_cleanup_if_null_lock(
char*, label_tmp );
2960 maug_mzero( label_tmp, buffer_sz + 1 );
2961#if RETROGUI_TRACE_LVL > 0
2962 debug_printf( RETROGUI_TRACE_LVL,
2963 "zeroed str sz for \"%s\": " SIZE_T_FMT, buffer, buffer_sz + 1 );
2965 maug_strncpy( label_tmp, buffer, buffer_sz );
2966#if RETROGUI_TRACE_LVL > 0
2967 debug_printf( RETROGUI_TRACE_LVL,
"copied str as: \"%s\"", label_tmp );
2969 maug_munlock( ctl->TEXTBOX.text_h, label_tmp );
2973 error_printf(
"invalid control type! no label!" );
2982 if( NULL != buffer ) {
2983 maug_munlock( buffer_h, buffer );
2986 if( (MAUG_MHANDLE)NULL != buffer_h ) {
2987 maug_mfree( buffer_h );
3004 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
3009#if RETROGUI_TRACE_LVL > 0
3010 debug_printf( RETROGUI_TRACE_LVL,
3011 "setting control " RETROGUI_IDC_FMT
" image to: %s", idc, path );
3015 ctl = _retrogui_get_ctl_by_idc( gui, idc );
3018 error_printf(
"could not set control image!" );
3019 retval = MERROR_GUI;
3024 if( RETROGUI_CTL_TYPE_IMAGE == ctl->base.type ) {
3026# ifdef RETROGXC_PRESENT
3027 ctl->IMAGE.image_cache_id = -1;
3029 if( retroflat_2d_bitmap_ok( &(ctl->IMAGE.image) ) ) {
3030 retroflat_2d_destroy_bitmap( &(ctl->IMAGE.image) );
3034 if( NULL != path &&
'\0' != path[0] ) {
3035# if defined( RETROGXC_PRESENT )
3036 ctl->IMAGE.image_cache_id = retrogxc_load_bitmap( path, flags );
3038 retroflat_2d_load_bitmap( path, &(ctl->IMAGE.image), flags );
3042 error_printf(
"invalid control type! no image!" );
3069 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
3074#if RETROGUI_TRACE_LVL > 0
3075 debug_printf( RETROGUI_TRACE_LVL,
3076 "setting control " RETROGUI_IDC_FMT
" image to: %p", idc, blit );
3080 ctl = _retrogui_get_ctl_by_idc( gui, idc );
3083 error_printf(
"could not set control image!" );
3084 retval = MERROR_GUI;
3089 if( RETROGUI_CTL_TYPE_IMAGE == ctl->base.type ) {
3090 if( NULL != blit ) {
3092# if defined( RETROGXC_PRESENT )
3093 ctl->IMAGE.image_cache_id = -1;
3096 ctl_img_w = retroflat_2d_bitmap_w( &(ctl->IMAGE.image) );
3097 ctl_img_h = retroflat_2d_bitmap_h( &(ctl->IMAGE.image) );
3098 blit_w = retroflat_2d_bitmap_w( blit );
3099 blit_h = retroflat_2d_bitmap_h( blit );
3103 retroflat_2d_bitmap_ok( &(ctl->IMAGE.image) ) &&
3104 (blit_w < ctl_img_w || blit_h < ctl_img_h)
3106 retroflat_2d_destroy_bitmap( &(ctl->IMAGE.image) );
3109#if RETROGUI_TRACE_LVL > 0
3110 debug_printf( RETROGUI_TRACE_LVL,
3111 "creating control " RETROGUI_IDC_FMT
" image: %u, %u",
3112 idc, blit_w, blit_h );
3116 retval = retroflat_2d_create_bitmap(
3117 blit_w, blit_h, &(ctl->IMAGE.image), 0 );
3118 maug_cleanup_if_not_ok();
3120 retroflat_2d_lock_bitmap( &(ctl->IMAGE.image) );
3122#if RETROGUI_TRACE_LVL > 0
3123 debug_printf( RETROGUI_TRACE_LVL,
3124 "blitting control " RETROGUI_IDC_FMT
" image from: %p", idc, blit );
3128 retroflat_2d_blit_bitmap(
3129 &(ctl->IMAGE.image),
3131 0, 0, 0, 0, blit_w, blit_h,
3132 ctl->IMAGE.instance );
3133 retroflat_2d_release_bitmap( &(ctl->IMAGE.image) );
3138 error_printf(
"invalid control type! no image!" );
3164 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
3169#if RETROGUI_TRACE_LVL > 0
3170 debug_printf( RETROGUI_TRACE_LVL,
3171 "setting control " RETROGUI_IDC_FMT
" level to: %u", idc, level );
3175 ctl = _retrogui_get_ctl_by_idc( gui, idc );
3178 error_printf(
"could not set control level!" );
3179 retval = MERROR_GUI;
3184 if( RETROGUI_CTL_TYPE_FILLBAR == ctl->base.type ) {
3185 ctl->FILLBAR.cur = level;
3187 ctl->FILLBAR.max = max;
3190 error_printf(
"invalid control type! no level!" );
3213#if RETROGUI_TRACE_LVL > 0
3214 debug_printf( RETROGUI_TRACE_LVL,
3215 "initializing control base " RETROGUI_IDC_FMT
"...", idc );
3220 ctl->base.type = type;
3221 ctl->base.idc = idc;
3222 ctl->base.fg_color = RETROFLAT_COLOR_NULL;
3223 ctl->base.bg_color = RETROFLAT_COLOR_NULL;
3224 ctl->base.sel_fg = RETROFLAT_COLOR_NULL;
3225 ctl->base.sel_bg = RETROFLAT_COLOR_NULL;
3227 #define RETROGUI_CTL_TABLE_INITS( idx, c_name, c_fields ) \
3228 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
3229 retrogui_init_ ## c_name( ctl );
3232 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_INITS )
3235# ifdef RETROGXC_PRESENT
3236 if( RETROGUI_CTL_TYPE_IMAGE == type ) {
3237 ctl->IMAGE.image_cache_id = -1;
3251 if( mdata_vector_is_locked( &((gui)->ctls) ) ) {
3252 error_printf(
"GUI is locked!" );
3260 assert( !mdata_vector_is_locked( &((gui)->ctls) ) );
3263 #define RETROGUI_CTL_TABLE_FREE( idx, c_name, c_fields ) \
3264 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
3265 retrogui_destroy_ ## c_name( ctl );
3268 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
3270 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_FREE )
3276# ifndef RETROGXC_PRESENT
3278 maug_mfree( gui->
font_h );
3284 mdata_vector_free( &(gui->ctls) );
3292 struct RETROGUI* gui,
size_t start, ssize_t incr
3298 ssize_t i_before = -1;
3305 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
3314 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
3317 }
else if( RETROGUI_IDC_NONE == gui->
focus || 0 <= i_before ) {
3319 idc_out = ctl->base.idc;
3320#if RETROGUI_TRACE_LVL > 0
3321 debug_printf( RETROGUI_TRACE_LVL,
3322 "moving focus to control: " RETROGUI_IDC_FMT, idc_out );
3324 gui->
focus = idc_out;
3327 }
else if( ctl->base.idc == gui->
focus ) {
3340 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
3343#if RETROGUI_TRACE_LVL > 0
3345 RETROGUI_TRACE_LVL,
"skipping: " RETROGUI_IDC_FMT, i );
3349 idc_out = ctl->base.idc;
3350#if RETROGUI_TRACE_LVL > 0
3351 debug_printf( RETROGUI_TRACE_LVL,
3352 "moving focus to control: " RETROGUI_IDC_FMT, idc_out );
3354 gui->
focus = idc_out;
3362 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
3365#if RETROGUI_TRACE_LVL > 0
3367 RETROGUI_TRACE_LVL,
"skipping: " RETROGUI_IDC_FMT, i );
3371 idc_out = ctl->base.idc;
3372#if RETROGUI_TRACE_LVL > 0
3373 debug_printf( RETROGUI_TRACE_LVL,
3374 "moving focus to control: " RETROGUI_IDC_FMT, idc_out );
3376 gui->
focus = idc_out;
3382 error_printf(
"invalid focus: " RETROGUI_IDC_FMT, i );
3391 if( MERROR_OK != retval ) {
3392 idc_out = merror_retval_to_sz( retval );
3399#if RETROGUI_TRACE_LVL > 0
3401 RETROGUI_TRACE_LVL,
"selected IDC: " RETROGUI_IDC_FMT, idc_out );
3412 maug_mzero( gui,
sizeof(
struct RETROGUI ) );
3414 gui->bg_color = RETROFLAT_COLOR_BLACK;
3415 gui->
focus = RETROGUI_IDC_NONE;
3416 gui->debounce_max = RETROGUI_DEBOUNCE_MAX_DEFAULT;
3418#if RETROGUI_TRACE_LVL > 0
3419 debug_printf( RETROGUI_TRACE_LVL,
"initialized GUI" );
3427#define RETROGUI_CTL_TABLE_CONSTS( idx, c_name, c_fields ) \
3428 extern MAUG_CONST uint8_t SEG_MCONST RETROGUI_CTL_TYPE_ ## c_name;
3430RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_CONSTS )
3432#ifdef RETROGUI_TRACE_TOKENS
3433extern MAUG_CONST
char* gc_retrogui_ctl_names[];
uint16_t MERROR_RETVAL
Return type indicating function returns a value from this list.
Definition: merror.h:28
char maug_path[MAUG_PATH_SZ_MAX]
Path/name used to load an asset from disk or access other files.
Definition: mfile.h:141
int8_t RETROFLAT_COLOR
Defines an index in the platform-specific color-table.
Definition: retroflt.h:326
#define RETROFLAT_FLAGS_FILL
Flag for retroflat_rect() or retroflat_ellipse(), indicating drawn shape should be filled.
Definition: retroflt.h:374
void retroflat_message(uint8_t flags, const char *title, const char *format,...)
Display a message in a dialog box and/or on stderr.
#define RETROFLAT_MSG_FLAG_ERROR
This icon/type flag indicates an error. It will try to display messages in an urgent way with a red i...
Definition: retroflt.h:462
int16_t retroflat_pxxy_t
Type used for surface pixel coordinates.
Definition: retroflt.h:879
#define RETROGUI_KEY_SEL_PREV
Overrideable constant defining the keyboard key (RETROFLAT_KEY_*) that will select the previous sub-i...
Definition: retrogui.h:145
#define RETROGUI_PAD_SEL_NEXT
Overrideable constant defining the gamepad button (RETROGUI_PAD_*) that will select the next sub-item...
Definition: retrogui.h:181
#define RETROGUI_KEY_NEXT
Overrideable constant defining the keyboard key (RETROFLAT_KEY_*) that will select the next activatea...
Definition: retrogui.h:118
#define RETROGUI_LABEL_SHOW_TICKS_MAX
The number of ticks (frames) to count down before incrementing the amount of text shown in a label if...
Definition: retrogui.h:246
#define RETROGUI_KEY_ACTIVATE
Overrideable constant defining the keyboard key (RETROFLAT_KEY_*) that will activate the RETROGUI_CTL...
Definition: retrogui.h:109
#define RETROGUI_PAD_ACTIVATE
Overrideable constant defining the gamepad button (RETROFLAT_PAD_*) that will activate the RETROGUI_C...
Definition: retrogui.h:154
#define RETROGUI_PAD_SEL_PREV
Overrideable constant defining the gamepad button (RETROGUI_PAD_*) that will select the previous sub-...
Definition: retrogui.h:190
#define RETROGUI_PAD_NEXT
Overrideable constant defining the gamepad button (RETROFLAT_PAD_*) that will select the next activat...
Definition: retrogui.h:163
#define RETROGUI_LABEL_SHOW_INC
The number of characters to increment the amount of text shown in a label by if RETROGUI_LABEL_FLAG_S...
Definition: retrogui.h:254
#define RETROGUI_KEY_PREV
Overrideable constant defining the keyboard key (RETROFLAT_KEY_*) that will select the previous activ...
Definition: retrogui.h:127
#define RETROGUI_KEY_SEL_NEXT
Overrideable constant defining the keyboard key (RETROFLAT_KEY_*) that will select the next sub-item ...
Definition: retrogui.h:136
#define RETROGUI_PAD_PREV
Overrideable constant defining the gamepad button (RETROFLAT_PAD_*) that will select the previous act...
Definition: retrogui.h:172
#define RETROGUI_PADDING
Overrideable constant defining the padding for text inside of controls in pixels.
Definition: retrogui.h:205
#define RETROGUI_CTL_TABLE_FIELDS(idx, c_name, c_fields)
Creates the corresponding RETROGUI_* structs from ::RETROGUI_CTL_TABLE that populate union RETROGUI_C...
Definition: retrogui.h:435
#define retrogui_can_focus_ctl(ctl)
Determine if a RETROGUI_CTL can hold RETROGUI::focus.
Definition: retrogui.h:408
#define RETROGUI_CTL_TABLE_TYPES(idx, c_name, c_fields)
Adds the structs created by RETROGUI_CTL_TABLE_FIELDS to union RETROGUI_CTL.
Definition: retrogui.h:447
MERROR_RETVAL retrogui_set_ctl_level(struct RETROGUI *gui, retrogui_idc_t idc, uint16_t level, uint16_t max, uint8_t flags)
Set the current progress level displayed by a FILLBAR-type RETROGUI_CTL.
#define RETROGUI_COLOR_SEL_BG
Value for retrogui_set_ctl_color() color_key indicating selection background.
Definition: retrogui.h:350
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_remove_ctl(struct RETROGUI *gui, retrogui_idc_t idc)
Remove a control with the given unique identifier index from the given RETROGUI controller.
MERROR_RETVAL retrogui_set_font(struct RETROGUI *gui, const maug_path font_path)
Load the RetroFont API for the given RETROGUI to draw its controls with. Use RetroGXCache API if avai...
#define RETROGUI_COLOR_SEL_FG
Value for retrogui_set_ctl_color() color_key indicating selection foreground.
Definition: retrogui.h:356
#define RETROGUI_COLOR_BG
Value for retrogui_set_ctl_color() color_key indicating background.
Definition: retrogui.h:339
MERROR_RETVAL retrogui_destroy(struct RETROGUI *gui)
Free memory held by a RETROGUI controller internally and clean up any subordinate controls.
MERROR_RETVAL retrogui_set_ctl_image_blit(struct RETROGUI *gui, retrogui_idc_t idc, retroflat_blit_t *blit, uint8_t flags)
Blit the given image onto the control, ensuring that the size is sufficient to hold it.
retrogui_idc_t retrogui_focus_iter(struct RETROGUI *gui, size_t start, ssize_t incr)
Increment RETROGUI::focus, skipping elements that cannot hold focus.
MERROR_RETVAL retrogui_set_ctl_image(struct RETROGUI *gui, retrogui_idc_t idc, const maug_path path, uint8_t flags)
Set the image displayed by an IMAGE-type RETROGUI_CTL.
MERROR_RETVAL retrogui_init(struct RETROGUI *gui)
Prepare a RETROGUI controller for use.
int16_t retrogui_idc_t
Unique identifying constant number for controls.
Definition: retrogui.h:330
#define RETROGUI_COLOR_BORDER
RetroGUI will try to use this color on non-monochrome systems instead of black to draw things like bo...
Definition: retrogui.h:93
#define RETROGUI_COLOR_FG
Value for retrogui_set_ctl_color() color_key indicating foreground.
Definition: retrogui.h:344
ssize_t mdata_vector_append(struct MDATA_VECTOR *v, const void *item, size_t item_sz)
Append an item to the specified vector.
MERROR_RETVAL mdata_vector_remove(struct MDATA_VECTOR *v, size_t idx)
Remove item at the given index, shifting subsequent items up by 1.
#define RETROFONT_FLAG_SZ_MIN
Flag for retroflat_string_sz() to return the size of the shortest line in a multi-line string.
Definition: retrofnt.h:46
MERROR_RETVAL retrofont_load(const char *font_name, MAUG_MHANDLE *p_font_h, uint8_t glyph_h, uint16_t first_glyph, uint16_t glyphs_count)
Load a font for drawing.
void retrofont_string(retroflat_blit_t *target, RETROFLAT_COLOR color, const char *str, size_t str_sz, MAUG_MHANDLE font_h, retroflat_pxxy_t x, retroflat_pxxy_t y, retroflat_pxxy_t max_w, retroflat_pxxy_t max_h, uint8_t flags)
Draw a string with the given font.
A vector of uniformly-sized objects, stored contiguously.
Definition: mdata.h:108
#define mdata_vector_lock(v)
Lock the vector. This should be done when items from the vector are actively being referenced,...
Definition: mdata.h:372
#define mdata_vector_unlock(v)
Unlock the vector so items may be added and removed.
Definition: mdata.h:405
size_t item_sz
Size, in bytes, of each item.
Definition: mdata.h:124
#define mdata_vector_ct(v)
Number of items of MDATA_VECTOR::item_sz bytes actively stored in this vector.
Definition: mdata.h:448
Fields common to ALL RETROGUI_CTL types.
Definition: retrogui.h:415
Definition: retrogui.h:468
#define RETROGUI_FLAGS_DIRTY
RETROGUI::flags indicating controls should be redrawn.
Definition: retrogui.h:263
MAUG_MHANDLE font_h
Font used to draw any attached RETROGUI_CTL.
Definition: retrogui.h:494
#define RETROGUI_FLAGS_FONT_OWNED
RETROGUI::flags indicating GUI font is owned by this RETROGUI and can/will be freed by retrogui_destr...
Definition: retrogui.h:270
retrogui_idc_t focus
Unique identifying index for current highlighted RETROGUI_CTL.
Definition: retrogui.h:478
Definition: retrogui.h:450
#define RETROGUI_LABEL_FLAG_SHOWINC
Flag for flags field in RETROGUI_CTL LABEL type indicating that the label should be shown incremental...
Definition: retrogui.h:277
#define RETROGUI_LABEL_FLAG_SHOWINC_SLOW
Flag for flags field in RETROGUI_CTL LABEL type indicating that the label should be shown incremental...
Definition: retrogui.h:288