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 0
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;
504 struct RETROGUI* gui, RETROFLAT_IN_KEY* p_input,
532#ifndef RETROGUI_NO_TEXTBOX
547 const char* fmt, ... );
597 struct RETROGUI* gui,
size_t start, ssize_t incr );
635#define retrogui_focus_next( gui ) \
636 retrogui_focus_iter( gui, 0, 1 )
638#define retrogui_focus_prev( gui ) \
639 retrogui_focus_iter( gui, mdata_vector_ct( &((gui)->ctls) ) - 1, -1 )
643#define RETROGUI_CTL_TABLE_CONSTS( idx, c_name, c_fields ) \
644 MAUG_CONST uint8_t SEG_MCONST RETROGUI_CTL_TYPE_ ## c_name = idx;
646RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_CONSTS )
648#ifdef RETROGUI_TRACE_TOKENS
650#define RETROGUI_CTL_TABLE_NAMES( idx, c_name, f_fields ) \
653MAUG_CONST
char* SEG_MCONST gc_retrogui_ctl_names[] = {
654 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_NAMES )
709static void retrogui_destroy_NONE(
union RETROGUI_CTL* ctl ) {
732 MAUG_MHANDLE font_h = (MAUG_MHANDLE)NULL;
734# if defined( RETROGUI_NATIVE_WIN )
738 if( !mdata_vector_is_locked( &(ctl->LISTBOX.list) ) ) {
739 mdata_vector_lock( &(ctl->LISTBOX.list) );
744 while( i < mdata_vector_ct( &(ctl->LISTBOX.list) ) ) {
746 (
char*)mdata_vector_get( &(ctl->LISTBOX.list), i, retrogui_list_t );
749#ifdef RETROGXC_PRESENT
751 gui->
font.cache_idx, RETROGXC_ASSET_TYPE_FONT );
752 maug_cleanup_if_null_alloc( MAUG_MHANDLE, font_h );
754 font_h = gui->
font.handle;
757 gui->draw_bmp, list_i, 0, font_h,
758 ctl->base.w, ctl->base.h, &w, &h, 0 );
764 ctl->LISTBOX.sel_idx = i;
774 mdata_vector_unlock( &(ctl->LISTBOX.list) );
777 if( MERROR_OK != retval ) {
778 idc_out = RETROGUI_IDC_NONE;
794 ctl->LISTBOX.sel_idx++;
795 if( ctl->LISTBOX.sel_idx >= mdata_vector_ct( &(ctl->LISTBOX.list) ) ) {
796 ctl->LISTBOX.sel_idx = 0;
800 gui->flags |= RETROGUI_FLAGS_DIRTY;
805 ctl->LISTBOX.sel_idx--;
807 if( ctl->LISTBOX.sel_idx >= mdata_vector_ct( &(ctl->LISTBOX.list) ) ) {
808 ctl->LISTBOX.sel_idx = mdata_vector_ct( &(ctl->LISTBOX.list) ) - 1;
812 gui->flags |= RETROGUI_FLAGS_DIRTY;
820static void retrogui_redraw_LISTBOX(
831 MAUG_MHANDLE font_h = (MAUG_MHANDLE)NULL;
833# if defined( RETROGUI_NATIVE_WIN )
837 if( !mdata_vector_is_locked( &(ctl->LISTBOX.list) ) ) {
838 mdata_vector_lock( &(ctl->LISTBOX.list) );
842 if( RETROFLAT_COLOR_BLACK != ctl->base.bg_color ) {
843 retroflat_2d_rect( gui->draw_bmp, ctl->base.bg_color,
844 gui->x + ctl->base.x, gui->y + ctl->base.y,
848 while( i < mdata_vector_ct( &(ctl->LISTBOX.list) ) ) {
850 (
char*)mdata_vector_get( &(ctl->LISTBOX.list), i, retrogui_list_t );
851#ifdef RETROGXC_PRESENT
853 gui->
font.cache_idx, RETROGXC_ASSET_TYPE_FONT );
854 maug_cleanup_if_null_alloc( MAUG_MHANDLE, font_h );
856 font_h = gui->
font.handle;
859 gui->draw_bmp, list_i, 0, font_h,
860 ctl->base.w, ctl->base.h, &w, &h, 0 );
861#if RETROGUI_TRACE_LVL > 0
862 debug_printf( RETROGUI_TRACE_LVL,
863 "str height for \"%s\": " SIZE_T_FMT, list_i, h );
865 if( i == ctl->LISTBOX.sel_idx ) {
867 retroflat_2d_rect( gui->draw_bmp, ctl->base.sel_bg,
868 gui->x + ctl->base.x,
869 gui->y + ctl->base.y + item_y,
871 fg_color = ctl->base.sel_fg;
873 retroflat_2d_ellipse(
874 gui->draw_bmp, ctl->base.sel_fg,
875 gui->x + ctl->base.x,
876 gui->y + ctl->base.y + item_y,
877 RETROGUI_CTL_LISTBOX_CURSOR_RADIUS,
878 RETROGUI_CTL_LISTBOX_CURSOR_RADIUS, 0 );
881 fg_color = ctl->base.fg_color;
884#ifdef RETROGXC_PRESENT
886 gui->
font.cache_idx, RETROGXC_ASSET_TYPE_FONT );
887 maug_cleanup_if_null_alloc( MAUG_MHANDLE, font_h );
889 font_h = gui->
font.handle;
892 gui->draw_bmp, fg_color, list_i, 0, font_h,
893 gui->x + ctl->base.x +
895 gui->y + ctl->base.y + item_y,
906 mdata_vector_unlock( &(ctl->LISTBOX.list) );
909 if( MERROR_OK != retval ) {
910 error_printf(
"error drawing LISTBOX: %d", retval );
922# if defined( RETROGUI_NATIVE_WIN )
925 SendMessage( ctl->base.hwnd, LB_SETCURSEL, item_idx, 0 );
929 ctl->LISTBOX.sel_idx = item_idx;
942 retrogui_list_t item_stage;
945 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
946 mdata_vector_lock( &(gui->ctls) );
950#if RETROGUI_TRACE_LVL > 0
951 debug_printf( RETROGUI_TRACE_LVL,
952 "pushing item \"%s\" to listbox " RETROGUI_IDC_FMT
"...", item, idc );
955 ctl = _retrogui_get_ctl_by_idc( gui, idc );
958 error_printf(
"could not add item: %s", item );
963# if defined( RETROGUI_NATIVE_WIN )
965 SendMessage( ctl->LISTBOX.base.hwnd, LB_ADDSTRING, 0, (LPARAM)item );
969 maug_mzero( item_stage, RETROGUI_CTL_LISTBOX_STR_SZ_MAX + 1 );
970 maug_strncpy( item_stage, item, RETROGUI_CTL_LISTBOX_STR_SZ_MAX );
971 i = mdata_vector_append(
972 &(ctl->LISTBOX.list), item_stage, RETROGUI_CTL_LISTBOX_STR_SZ_MAX + 1 );
974 retval = merror_sz_to_retval( i );
979 gui->flags |= RETROGUI_FLAGS_DIRTY;
984 mdata_vector_unlock( &(gui->ctls) );
993# if defined( RETROGUI_NATIVE_WIN )
995 ctl->base.hwnd = CreateWindow(
996 "LISTBOX", NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD,
997 gui->x + ctl->base.x, gui->y + ctl->base.y, ctl->base.w, ctl->base.h,
998 g_retroflat_state->window, (HMENU)(ctl->base.idc),
999 g_retroflat_instance, NULL );
1000#if RETROGUI_TRACE_LVL > 0
1001 debug_printf( RETROGUI_TRACE_LVL,
1002 "listbox hwnd: %p", ctl->LISTBOX.base.hwnd );
1004 if( (HWND)NULL == ctl->base.hwnd ) {
1005 error_printf(
"could not create listbox" );
1006 retval = MERROR_GUI;
1010 gui->flags |= RETROGUI_FLAGS_DIRTY;
1043static void retrogui_destroy_LISTBOX(
union RETROGUI_CTL* ctl ) {
1044 mdata_vector_free( &(ctl->LISTBOX.list) );
1050#if RETROGUI_TRACE_LVL > 0
1051 debug_printf( RETROGUI_TRACE_LVL,
1052 "initializing listbox " RETROGUI_IDC_FMT
"...", ctl->base.idc );
1055 ctl->base.bg_color = RETROFLAT_COLOR_WHITE;
1056 ctl->base.sel_fg = RETROFLAT_COLOR_WHITE;
1057 if( 2 < retroflat_screen_colors() ) {
1058 ctl->base.sel_bg = RETROFLAT_COLOR_BLUE;
1061 ctl->base.sel_bg = RETROFLAT_COLOR_BLACK;
1062 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
1077 if( 0 < ctl->BUTTON.push_frames ) {
1082 idc_out = ctl->base.idc;
1086 ctl->BUTTON.push_frames = 3;
1103#if RETROGUI_TRACE_LVL > 0
1104 debug_printf( RETROGUI_TRACE_LVL,
"pushing BUTTON control..." );
1106 idc_out = ctl->base.idc;
1112static void retrogui_redraw_BUTTON(
1122 MAUG_MHANDLE font_h = (MAUG_MHANDLE)NULL;
1126 fg_color = ctl->base.sel_fg;
1131 bg_color = ctl->base.sel_bg;
1135 if( 2 >= retroflat_screen_colors() ) {
1136 push_shadow_color = RETROFLAT_COLOR_BLACK;
1137 border_color = RETROFLAT_COLOR_BLACK;
1141 gui->draw_bmp, bg_color, gui->x + ctl->base.x, gui->y + ctl->base.y,
1144 retroflat_2d_rect( gui->draw_bmp, border_color,
1145 gui->x + ctl->base.x, gui->y + ctl->base.y,
1146 ctl->base.w, ctl->base.h, 0 );
1151 if( 0 < ctl->BUTTON.push_frames ) {
1153 gui->draw_bmp, push_shadow_color,
1154 gui->x + ctl->base.x + 1, gui->y + ctl->base.y + 1,
1155 gui->x + ctl->base.x + ctl->base.w - 2, gui->y + ctl->base.y + 1, 0 );
1157 gui->draw_bmp, push_shadow_color,
1158 gui->x + ctl->base.x + 1, gui->y + ctl->base.y + 2,
1159 gui->x + ctl->base.x + 1, gui->y + ctl->base.y + ctl->base.h - 3, 0 );
1161 gui->flags |= RETROGUI_FLAGS_DIRTY;
1162 ctl->BUTTON.push_frames--;
1167 gui->draw_bmp, RETROFLAT_COLOR_WHITE,
1168 gui->x + ctl->base.x + 1, gui->y + ctl->base.y + 1,
1169 gui->x + ctl->base.x + ctl->base.w - 2, gui->y + ctl->base.y + 1, 0 );
1171 gui->draw_bmp, RETROFLAT_COLOR_WHITE,
1172 gui->x + ctl->base.x + 1, gui->y + ctl->base.y + 2,
1173 gui->x + ctl->base.x + 1, gui->y + ctl->base.y + ctl->base.h - 3, 0 );
1176 maug_mlock( ctl->BUTTON.label_h, ctl->BUTTON.label );
1177 if( NULL == ctl->BUTTON.label ) {
1178 error_printf(
"could not lock BUTTON label!" );
1183#ifdef RETROGXC_PRESENT
1185 gui->
font.cache_idx, RETROGXC_ASSET_TYPE_FONT );
1186 if( (MAUG_MHANDLE)NULL == font_h ) {
1190 font_h = gui->
font.handle;
1192 retrofont_string_sz(
1193 gui->draw_bmp, ctl->BUTTON.label, 0, font_h,
1194 ctl->base.w, ctl->base.h, &w, &h, ctl->BUTTON.font_flags );
1197 gui->draw_bmp, fg_color, ctl->BUTTON.label, 0, font_h,
1198 gui->x + ctl->base.x + ((ctl->base.w >> 1) - (w >> 1)) + text_offset,
1199 gui->y + ctl->base.y + ((ctl->base.h >> 1) - (h >> 1)) + text_offset,
1201 ctl->base.w, ctl->base.h, ctl->BUTTON.font_flags );
1203 maug_munlock( ctl->BUTTON.label_h, ctl->BUTTON.label );
1213# if defined( RETROGUI_NATIVE_WIN )
1215 ctl->base.hwnd = CreateWindow(
1216 "BUTTON", ctl->BUTTON.label, WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
1217 gui->x + ctl->base.x, gui->y + ctl->base.y, ctl->base.w, ctl->base.h,
1218 g_retroflat_state->window, (HMENU)(ctl->base.idc),
1219 g_retroflat_instance, NULL );
1220 if( (HWND)NULL == ctl->base.hwnd ) {
1222 "Could not create button " RETROGUI_IDC_FMT
": %s",
1223 ctl->base.idc, ctl->BUTTON.label );
1224 retval = MERROR_GUI;
1229 char* label_tmp = NULL;
1231#if RETROGUI_TRACE_LVL > 0
1232 debug_printf( RETROGUI_TRACE_LVL,
"pushing BUTTON control..." );
1236 label, ctl->BUTTON.label, ctl->BUTTON, label_tmp, ctl->BUTTON.label_sz );
1237 ctl->BUTTON.label = NULL;
1251 MAUG_MHANDLE font_h = (MAUG_MHANDLE)NULL;
1253 assert( NULL != ctl );
1254 assert( NULL == ctl->BUTTON.label );
1255 assert( (MAUG_MHANDLE)NULL != ctl->BUTTON.label_h );
1257 maug_mlock( ctl->BUTTON.label_h, ctl->BUTTON.label );
1258 maug_cleanup_if_null_lock(
char*, ctl->BUTTON.label );
1261#ifdef RETROGXC_PRESENT
1263 gui->
font.cache_idx, RETROGXC_ASSET_TYPE_FONT );
1264 maug_cleanup_if_null_alloc( MAUG_MHANDLE, font_h );
1266 font_h = gui->
font.handle;
1268 retrofont_string_sz(
1269 NULL, ctl->BUTTON.label, 0, font_h,
1270 max_w - 8, max_h - 8, p_w, p_h, ctl->BUTTON.font_flags );
1273 *p_w += RETROGUI_BTN_LBL_PADDED_X;
1274 *p_h += RETROGUI_BTN_LBL_PADDED_Y;
1278 maug_munlock( ctl->BUTTON.label_h, ctl->BUTTON.label );
1290# if defined( RETROGUI_NATIVE_WIN )
1293 assert( NULL != ctl );
1308static void retrogui_destroy_BUTTON(
union RETROGUI_CTL* ctl ) {
1309 if( (MAUG_MHANDLE)NULL != ctl->BUTTON.label_h ) {
1310 maug_mfree( ctl->BUTTON.label_h );
1317#if RETROGUI_TRACE_LVL > 0
1318 debug_printf( RETROGUI_TRACE_LVL,
1319 "initializing button " RETROGUI_IDC_FMT
"...", ctl->base.idc );
1322 if( 2 < retroflat_screen_colors() ) {
1324 ctl->base.bg_color = RETROFLAT_COLOR_GRAY;
1325 ctl->base.sel_fg = RETROFLAT_COLOR_BLUE;
1326 ctl->base.sel_bg = RETROFLAT_COLOR_GRAY;
1328 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
1329 ctl->base.bg_color = RETROFLAT_COLOR_WHITE;
1330 ctl->base.sel_fg = RETROFLAT_COLOR_WHITE;
1331 ctl->base.sel_bg = RETROFLAT_COLOR_BLACK;
1337#ifndef RETROGUI_NO_TEXTBOX
1358# if defined( RETROGUI_NATIVE_WIN )
1362 c = retroflat_vk_to_ascii( *p_input, input_evt->key_flags );
1367 RETROFLAT_KEY_RIGHT != *p_input &&
1368 RETROFLAT_KEY_LEFT != *p_input
1374 assert( NULL == ctl->TEXTBOX.text );
1375 assert( (MAUG_MHANDLE)NULL != ctl->TEXTBOX.text_h );
1376 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
1377 if( NULL == ctl->TEXTBOX.text ) {
1378 error_printf(
"could not lock TEXTBOX text handle!" );
1382 switch( *p_input ) {
1383 case RETROFLAT_KEY_BKSP:
1385 ctl->TEXTBOX.text, ctl->TEXTBOX.text_cur, ctl->TEXTBOX.text_sz )
1388 case RETROFLAT_KEY_ENTER:
1389 idc_out = ctl->base.idc;
1392 case RETROFLAT_KEY_LEFT:
1393 if( 0 < ctl->TEXTBOX.text_cur ) {
1394 ctl->TEXTBOX.text_cur--;
1398 case RETROFLAT_KEY_RIGHT:
1399 if( ctl->TEXTBOX.text_sz > ctl->TEXTBOX.text_cur ) {
1400 ctl->TEXTBOX.text_cur++;
1405 assert( ctl->TEXTBOX.text_sz < ctl->TEXTBOX.text_sz_max );
1406 debug_printf( 1,
"cur: %d, sz: %d, sz_max: %d",
1407 ctl->TEXTBOX.text_cur, ctl->TEXTBOX.text_sz, ctl->TEXTBOX.text_sz_max );
1410 ctl->TEXTBOX.text_cur,
1411 ctl->TEXTBOX.text_sz,
1412 ctl->TEXTBOX.text_sz_max );
1420 if( NULL != ctl->TEXTBOX.text ) {
1421 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
1429static void retrogui_redraw_TEXTBOX(
1436 MAUG_MHANDLE font_h = (MAUG_MHANDLE)NULL;
1439 if( 2 >= retroflat_screen_colors() ) {
1440 shadow_color = RETROFLAT_COLOR_BLACK;
1441 border_color = RETROFLAT_COLOR_BLACK;
1444# if defined( RETROGUI_NATIVE_WIN )
1448 retroflat_2d_rect( gui->draw_bmp, ctl->base.bg_color,
1449 gui->x + ctl->base.x, gui->y + ctl->base.y,
1454 retroflat_2d_rect( gui->draw_bmp, border_color,
1455 gui->x + ctl->base.x,
1456 gui->y + ctl->base.y, ctl->base.w, 2,
1459 retroflat_2d_rect( gui->draw_bmp, border_color,
1460 gui->x + ctl->base.x,
1461 gui->y + ctl->base.y, 2, ctl->base.h,
1464 retroflat_2d_rect( gui->draw_bmp, shadow_color,
1465 gui->x + ctl->base.x,
1466 gui->y + ctl->base.y + ctl->base.h - 1,
1470 retroflat_2d_rect( gui->draw_bmp, shadow_color,
1471 gui->x + ctl->base.x + ctl->base.w - 1,
1472 gui->y + ctl->base.y, 2, ctl->base.h,
1477 assert( NULL == ctl->TEXTBOX.text );
1478 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
1479 if( NULL == ctl->TEXTBOX.text ) {
1483#ifdef RETROGXC_PRESENT
1485 gui->
font.cache_idx, RETROGXC_ASSET_TYPE_FONT );
1486 if( (MAUG_MHANDLE)NULL == font_h ) {
1490 font_h = gui->
font.handle;
1493 gui->draw_bmp, ctl->base.fg_color,
1494 ctl->TEXTBOX.text, ctl->TEXTBOX.text_cur, font_h,
1499 retrofont_string_sz(
1500 gui->draw_bmp, ctl->TEXTBOX.text, ctl->TEXTBOX.text_cur, font_h,
1503 if( cursor_x + RETROGUI_CTL_TEXT_CUR_WH >= ctl->base.w ) {
1506 cursor_y += RETROGUI_CTL_TEXT_CUR_WH;
1510 retroflat_2d_rect( gui->draw_bmp,
1514 RETROGUI_CTL_TEXT_CUR_WH, RETROGUI_CTL_TEXT_CUR_WH,
1520 if( (-1 * RETROGUI_CTL_TEXT_BLINK_FRAMES) > --(ctl->TEXTBOX.blink_frames) ) {
1521 ctl->TEXTBOX.blink_frames = RETROGUI_CTL_TEXT_BLINK_FRAMES;
1524 if( NULL != ctl->TEXTBOX.text ) {
1526#ifdef RETROGXC_PRESENT
1528 gui->
font.cache_idx, RETROGXC_ASSET_TYPE_FONT );
1529 if( (MAUG_MHANDLE)NULL == font_h ) {
1533 font_h = gui->
font.handle;
1535 retrofont_string_indent(
1536 gui->draw_bmp, ctl->base.fg_color,
1537 &(ctl->TEXTBOX.text[ctl->TEXTBOX.text_cur]),
1539 strlen( ctl->TEXTBOX.text ) - ctl->TEXTBOX.text_cur, font_h,
1543 ctl->base.w, ctl->base.h,
1544 cursor_x + RETROGUI_CTL_TEXT_CUR_WH, 0 );
1546 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
1549 gui->flags |= RETROGUI_FLAGS_DIRTY;
1561# if defined( RETROGUI_NATIVE_WIN )
1563 ctl->base.hwnd = CreateWindow(
1564 "EDIT", 0, WS_CHILD | WS_VISIBLE | WS_BORDER,
1565 gui->x + ctl->base.x, gui->y + ctl->base.y, ctl->base.w, ctl->base.h,
1566 g_retroflat_state->window, (HMENU)(ctl->base.idc),
1567 g_retroflat_instance, NULL );
1568 if( (HWND)NULL == ctl->base.hwnd ) {
1570 "Could not create textbox: " RETROGUI_IDC_FMT, ctl->base.idc );
1571 retval = MERROR_GUI;
1577#if RETROGUI_TRACE_LVL > 0
1578 debug_printf( RETROGUI_TRACE_LVL,
1579 "clearing textbox " RETROGUI_IDC_FMT
" buffer...", ctl->base.idc );
1581 assert( (MAUG_MHANDLE)NULL == ctl->TEXTBOX.text_h );
1582 maug_malloc_test( ctl->TEXTBOX.text_h, RETROGUI_CTL_TEXT_SZ_MAX + 1, 1 );
1583 ctl->TEXTBOX.text_sz_max = RETROGUI_CTL_TEXT_SZ_MAX;
1585 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
1586 maug_cleanup_if_null_alloc(
char*, ctl->TEXTBOX.text );
1587#if RETROGUI_TRACE_LVL > 0
1588 debug_printf( RETROGUI_TRACE_LVL,
1589 "clearing textbox " RETROGUI_IDC_FMT
" buffer...", ctl->base.idc );
1591 maug_mzero( ctl->TEXTBOX.text, RETROGUI_CTL_TEXT_SZ_MAX + 1 );
1592 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
1621static void retrogui_destroy_TEXTBOX(
union RETROGUI_CTL* ctl ) {
1622 if( (MAUG_MHANDLE)NULL != ctl->TEXTBOX.text_h ) {
1623 maug_mfree( ctl->TEXTBOX.text_h );
1630#if RETROGUI_TRACE_LVL > 0
1631 debug_printf( RETROGUI_TRACE_LVL,
1632 "initializing textbox " RETROGUI_IDC_FMT
"...", ctl->base.idc );
1635 ctl->base.bg_color = RETROFLAT_COLOR_WHITE;
1636 ctl->base.sel_bg = RETROFLAT_COLOR_WHITE;
1637 if( 2 < retroflat_screen_colors() ) {
1638 ctl->base.sel_fg = RETROFLAT_COLOR_BLUE;
1641 ctl->base.sel_fg = RETROFLAT_COLOR_BLACK;
1642 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
1657 return RETROGUI_IDC_NONE;
1664 return RETROGUI_IDC_NONE;
1667static void retrogui_redraw_LABEL(
1671 MAUG_MHANDLE font_h = (MAUG_MHANDLE)NULL;
1673# if defined( RETROGUI_NATIVE_WIN )
1679 assert( NULL == ctl->LABEL.label );
1680 maug_mlock( ctl->LABEL.label_h, ctl->LABEL.label );
1681 if( NULL == ctl->LABEL.label ) {
1682 error_printf(
"could not lock LABEL text!" );
1690 if( 0 < ctl->LABEL.show_ticks ) {
1692 ctl->LABEL.show_ticks--;
1693 show_sz = ctl->LABEL.shown_sz;
1694 if( ctl->LABEL.shown_sz < ctl->LABEL.label_sz ) {
1695 gui->flags |= RETROGUI_FLAGS_DIRTY;
1700 ctl->LABEL.show_ticks =
1708 if( show_sz > ctl->LABEL.label_sz ) {
1710 show_sz = ctl->LABEL.label_sz;
1713 gui->flags |= RETROGUI_FLAGS_DIRTY;
1717 ctl->LABEL.shown_sz = show_sz;
1721 show_sz = ctl->LABEL.label_sz;
1724#ifdef RETROGXC_PRESENT
1726 gui->
font.cache_idx, RETROGXC_ASSET_TYPE_FONT );
1727 if( (MAUG_MHANDLE)NULL == font_h ) {
1731 font_h = gui->
font.handle;
1734 gui->draw_bmp, ctl->base.fg_color, ctl->LABEL.label, show_sz, font_h,
1737 ctl->LABEL.font_flags );
1741 if( NULL != ctl->LABEL.label ) {
1742 maug_munlock( ctl->LABEL.label_h, ctl->LABEL.label );
1753# if defined( RETROGUI_NATIVE_WIN )
1758 char* label_tmp = NULL;
1760#if RETROGUI_TRACE_LVL > 0
1761 debug_printf( RETROGUI_TRACE_LVL,
"pushing LABEL control..." );
1765 label, ctl->LABEL.label, ctl->LABEL, label_tmp, ctl->LABEL.label_sz );
1766 ctl->LABEL.label = NULL;
1767 ctl->LABEL.shown_sz = 1;
1768 ctl->LABEL.show_ticks =
1800static void retrogui_destroy_LABEL(
union RETROGUI_CTL* ctl ) {
1801 if( (MAUG_MHANDLE)NULL != ctl->LABEL.label_h ) {
1802 maug_mfree( ctl->LABEL.label_h );
1809#if RETROGUI_TRACE_LVL > 0
1810 debug_printf( RETROGUI_TRACE_LVL,
1811 "initializing label " RETROGUI_IDC_FMT
"...", ctl->base.idc );
1814 if( 2 < retroflat_screen_colors() ) {
1817 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
1819 ctl->base.bg_color = RETROFLAT_COLOR_WHITE;
1831 return RETROGUI_IDC_NONE;
1838 return RETROGUI_IDC_NONE;
1841static void retrogui_redraw_IMAGE(
1844# if defined( RETROGUI_NATIVE_WIN )
1848# if defined( RETROGXC_PRESENT )
1849 if( 0 <= ctl->IMAGE.image_cache_id ) {
1852#if RETROGUI_TRACE_LVL > 0
1853 debug_printf( RETROGUI_TRACE_LVL,
1854 "redrawing image ctl " RETROGUI_IDC_FMT
1855 ", cache ID " SSIZE_T_FMT
"...",
1856 ctl->base.idc, ctl->IMAGE.image_cache_id );
1858 retrogxc_blit_bitmap(
1860 ctl->IMAGE.image_cache_id,
1861 ctl->IMAGE.src_x, ctl->IMAGE.src_y,
1862 gui->x + ctl->base.x, gui->y + ctl->base.y, ctl->base.w, ctl->base.h,
1863 ctl->IMAGE.instance );
1866 if( retroflat_2d_bitmap_ok( &(ctl->IMAGE.image) ) ) {
1868 retroflat_2d_blit_bitmap(
1870 &(ctl->IMAGE.image),
1871 ctl->IMAGE.src_x, ctl->IMAGE.src_y,
1872 gui->x + ctl->base.x, gui->y + ctl->base.y, ctl->base.w, ctl->base.h,
1873 ctl->IMAGE.instance );
1884# if defined( RETROGUI_NATIVE_WIN )
1890#if RETROGUI_TRACE_LVL > 0
1891 debug_printf( RETROGUI_TRACE_LVL,
"pushing IMAGE control..." );
1894 assert( !retroflat_2d_bitmap_ok( &(ctl->IMAGE.image) ) );
1914# ifdef RETROGXC_PRESENT
1915 retval = retrogxc_bitmap_wh( ctl->IMAGE.image_cache_id, p_w, p_h );
1916 maug_cleanup_if_not_ok();
1920 0 == *p_w && 0 == *p_h &&
1921 !retroflat_2d_bitmap_ok( &(ctl->IMAGE.image) )
1923 error_printf(
"image not assigned!" );
1924 retval = MERROR_GUI;
1928 *p_w = retroflat_2d_bitmap_w( &(ctl->IMAGE.image) );
1929 *p_h = retroflat_2d_bitmap_h( &(ctl->IMAGE.image) );
1946static void retrogui_destroy_IMAGE(
union RETROGUI_CTL* ctl ) {
1947 if( retroflat_2d_bitmap_ok( &(ctl->IMAGE.image) ) ) {
1948 retroflat_2d_destroy_bitmap( &(ctl->IMAGE.image) );
1955#if RETROGUI_TRACE_LVL > 0
1956 debug_printf( RETROGUI_TRACE_LVL,
1957 "initializing IMAGE " RETROGUI_IDC_FMT
"...", ctl->base.idc );
1984static void retrogui_redraw_FILLBAR(
1989 if( 0 == ctl->FILLBAR.cur ) {
1992 fill_w = ctl->base.w * ctl->FILLBAR.cur / ctl->FILLBAR.max;
1996 gui->draw_bmp, ctl->base.bg_color,
1997 gui->x + ctl->base.x + fill_w,
1998 gui->y + ctl->base.y,
2002 gui->draw_bmp, ctl->base.fg_color,
2003 gui->x + ctl->base.x,
2004 gui->y + ctl->base.y,
2013# if defined( RETROGUI_NATIVE_WIN )
2029 assert( NULL != ctl );
2043# if defined( RETROGUI_NATIVE_WIN )
2046 assert( NULL != ctl );
2061static void retrogui_destroy_FILLBAR(
union RETROGUI_CTL* ctl ) {
2067#if RETROGUI_TRACE_LVL > 0
2068 debug_printf( RETROGUI_TRACE_LVL,
2069 "initializing fillbar " RETROGUI_IDC_FMT
"...", ctl->base.idc );
2072 if( 2 < retroflat_screen_colors() ) {
2074 ctl->base.bg_color = RETROFLAT_COLOR_GRAY;
2076 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
2077 ctl->base.bg_color = RETROFLAT_COLOR_WHITE;
2091 assert( mdata_vector_is_locked( &((gui)->ctls) ) );
2093 for( i = 0 ; mdata_vector_ct( &(gui->ctls) ) > i ; i++ ) {
2094 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
2095 if( idc == ctl->base.idc ) {
2102 error_printf(
"could not find GUI item IDC " RETROGUI_IDC_FMT, idc );
2118 assert( mdata_vector_is_locked( &((gui)->ctls) ) );
2120#if RETROGUI_TRACE_LVL > 0
2121 debug_printf( RETROGUI_TRACE_LVL,
2122 "sizing control " RETROGUI_IDC_FMT
" to: " SIZE_T_FMT
"x" SIZE_T_FMT,
2123 idc, max_w, max_h );
2126 ctl = _retrogui_get_ctl_by_idc( gui, idc );
2129 error_printf(
"could not size item!" );
2130 retval = MERROR_GUI;
2134 #define RETROGUI_CTL_TABLE_SZ( idx, c_name, c_fields ) \
2135 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2137 retval = retrogui_sz_ ## c_name( gui, ctl, p_w, p_h, max_w, max_h ); \
2138 maug_cleanup_if_not_ok();
2141 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_SZ )
2144#if RETROGUI_TRACE_LVL > 0
2145 debug_printf( RETROGUI_TRACE_LVL,
2146 "sized control " RETROGUI_IDC_FMT
" at " SIZE_T_FMT
"x" SIZE_T_FMT
"...",
2147 ctl->base.idc, ctl->base.w, ctl->base.h );
2158 struct RETROGUI* gui, RETROFLAT_IN_KEY* p_input,
2168 if( 0 == mdata_vector_ct( &(gui->ctls) ) ) {
2169 return RETROGUI_IDC_NONE;
2172 assert( !mdata_vector_is_locked( &((gui)->ctls) ) );
2173 mdata_vector_lock( &(gui->ctls) );
2175# if defined( RETROGUI_NATIVE_WIN )
2177 if( 0 == g_retroflat_state->last_idc ) {
2182 ctl = retrogui_get_ctl_by_idc( gui, g_retroflat_state->last_idc );
2183 g_retroflat_state->last_idc = 0;
2185#if RETROGUI_TRACE_LVL > 0
2186 debug_printf( RETROGUI_TRACE_LVL,
2187 "invalid IDC: " RETROGUI_IDC_FMT, gui->
focus_idc );
2192# ifndef RETROGUI_NO_TEXTBOX
2193 if( RETROGUI_CTL_TYPE_TEXTBOX == ctl->base.type ) {
2194 if( SendMessage( ctl->base.hwnd, EM_GETMODIFY, 0, 0 ) ) {
2195 SendMessage( ctl->base.hwnd, EM_SETMODIFY, 0, 0 );
2196#if RETROGUI_TRACE_LVL > 0
2197 debug_printf( RETROGUI_TRACE_LVL,
"mod: %d",
2198 SendMessage( ctl->base.hwnd, EM_GETMODIFY, 0, 0 ) );
2208# define RETROGUI_CTL_TABLE_CLICK( idx, c_name, c_fields ) \
2209 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2210 gui->flags |= RETROGUI_FLAGS_DIRTY; \
2211 idc_out = retrogui_click_ ## c_name( gui, ctl, p_input, input_evt );
2213# define RETROGUI_CTL_TABLE_KEY( idx, c_name, c_fields ) \
2214 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2215 gui->flags |= RETROGUI_FLAGS_DIRTY; \
2216 idc_out = retrogui_key_ ## c_name( gui, ctl, p_input, input_evt );
2218 if( 0 != *p_input ) {
2219#if RETROGUI_TRACE_LVL > 0
2220 debug_printf( RETROGUI_TRACE_LVL,
2221 "focus " RETROGUI_IDC_FMT
" input: %d", gui->
focus_idc, *p_input );
2226 if( retroflat_get_ms() < gui->debounce_next ) {
2227#if RETROGUI_TRACE_LVL > 0
2228 debug_printf( RETROGUI_TRACE_LVL,
2229 "debo! %d vs %d", retroflat_get_ms(), gui->debounce_next );
2232#if RETROGUI_TRACE_LVL > 0
2233 }
else if( 0 != *p_input ) {
2234 debug_printf( RETROGUI_TRACE_LVL,
"no debo!" );
2238 if( 0 == *p_input ) {
2246 if( RETROGUI_IDC_NONE < gui->focus_idc ) {
2247#if RETROGUI_TRACE_LVL > 0
2248 debug_printf( RETROGUI_TRACE_LVL,
2249 "activate on focus IDC: " RETROGUI_IDC_FMT, gui->
focus_idc );
2253 gui->flags |= RETROGUI_FLAGS_DIRTY;
2259 retrogui_focus_next( gui );
2261#if RETROGUI_TRACE_LVL > 0
2262 debug_printf( RETROGUI_TRACE_LVL,
"next: " RETROGUI_IDC_FMT, gui->
focus_idc );
2271 retrogui_focus_prev( gui );
2273#if RETROGUI_TRACE_LVL > 0
2274 debug_printf( RETROGUI_TRACE_LVL,
"prev: " RETROGUI_IDC_FMT, gui->
focus_idc );
2280# ifndef RETROGUI_NO_MOUSE
2282 RETROFLAT_MOUSE_B_LEFT == *p_input ||
2283 RETROFLAT_MOUSE_B_RIGHT == *p_input
2288#if RETROGUI_TRACE_LVL > 0
2289 debug_printf( RETROGUI_TRACE_LVL,
"resetting focus for mouse click..." );
2293 mouse_x = input_evt->
mouse_x - gui->x;
2294 mouse_y = input_evt->
mouse_y - gui->y;
2296 for( i = 0 ; mdata_vector_ct( &(gui->ctls) ) > i ; i++ ) {
2297 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
2299 mouse_x < ctl->base.x ||
2300 mouse_y < ctl->base.y ||
2301 mouse_x > ctl->base.x + ctl->base.w ||
2302 mouse_y > ctl->base.y + ctl->base.h
2307 if( gui->idc_prev == ctl->base.idc ) {
2310 idc_out = RETROGUI_IDC_NONE;
2314 gui->idc_prev = ctl->base.idc;
2316#if RETROGUI_TRACE_LVL > 0
2317 debug_printf( RETROGUI_TRACE_LVL,
2318 "setting focus to clicked control: " RETROGUI_IDC_FMT,
2324 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_CLICK )
2332 if( RETROGUI_IDC_NONE == gui->
focus_idc ) {
2333 error_printf(
"no control has focus!" );
2339 ctl = _retrogui_get_ctl_by_idc( gui, gui->
focus_idc );
2344#if RETROGUI_TRACE_LVL > 0
2345 debug_printf( RETROGUI_TRACE_LVL,
2346 "invalid focus IDC: " RETROGUI_IDC_FMT, gui->
focus_idc );
2352 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_KEY )
2357 gui->debounce_next = retroflat_get_ms() + gui->debounce_max;
2363 if( MERROR_OK != retval ) {
2364 idc_out = merror_retval_to_sz( retval );
2367 mdata_vector_unlock( &(gui->ctls) );
2380#if RETROGUI_TRACE_LVL > 0
2381 debug_printf( RETROGUI_TRACE_LVL,
"redrawing controls..." );
2384#ifndef RETROWIN_NO_BITMAP
2385 if( RETROGUI_FLAGS_DIRTY != (RETROGUI_FLAGS_DIRTY & gui->flags) ) {
2391 if( 0 == mdata_vector_ct( &(gui->ctls) ) ) {
2395 if( !retrogxc_cachable_is_loaded( &(gui->
font) ) ) {
2396 error_printf(
"no font has been defined for GUI %p!", gui );
2400 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
2401 mdata_vector_lock( &(gui->ctls) );
2406 RETROFLAT_COLOR_BLACK != gui->bg_color &&
2407 0 < gui->w && 0 < gui->h
2409 retroflat_2d_rect( gui->draw_bmp,
2414 gui->flags &= ~RETROGUI_FLAGS_DIRTY;
2416 #define RETROGUI_CTL_TABLE_REDRAW( idx, c_name, c_fields ) \
2417 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2418 retrogui_redraw_ ## c_name( gui, ctl );
2421 for( i = 0 ; mdata_vector_ct( &(gui->ctls) ) > i ; i++ ) {
2422 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
2424 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_REDRAW )
2428#if RETROGUI_TRACE_LVL > 0
2429 debug_printf( RETROGUI_TRACE_LVL,
"redrawing controls complete!" );
2436 mdata_vector_unlock( &(gui->ctls) );
2453 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
2454 mdata_vector_lock( &(gui->ctls) );
2458#if RETROGUI_TRACE_LVL > 0
2459 debug_printf( RETROGUI_TRACE_LVL,
2460 "moving control " RETROGUI_IDC_FMT
" to: " SIZE_T_FMT
", " SIZE_T_FMT,
2464 ctl = _retrogui_get_ctl_by_idc( gui, idc );
2467 error_printf(
"could not position control!" );
2468 retval = MERROR_GUI;
2472 #define RETROGUI_CTL_TABLE_POS( idx, c_name, c_fields ) \
2473 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2475 retval = retrogui_pos_ ## c_name( gui, ctl, x, y, w, h ); \
2476 maug_cleanup_if_not_ok();
2479 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_POS )
2482#if RETROGUI_TRACE_LVL > 0
2483 debug_printf( RETROGUI_TRACE_LVL,
2484 "moved control " RETROGUI_IDC_FMT
" to " SIZE_T_FMT
", " SIZE_T_FMT
2485 " and sized to " SIZE_T_FMT
"x" SIZE_T_FMT
"...",
2486 ctl->base.idc, gui->x + ctl->base.x, gui->y + ctl->base.y,
2487 ctl->base.w, ctl->base.h );
2491 gui->flags |= RETROGUI_FLAGS_DIRTY;
2496 mdata_vector_unlock( &(gui->ctls) );
2511 assert( 0 < ctl->base.idc );
2515#if RETROGUI_TRACE_LVL > 0
2516 debug_printf( RETROGUI_TRACE_LVL,
2517 "gui->ctls_ct: " SIZE_T_FMT, mdata_vector_ct( &(gui->ctls) ) );
2521 RETROGUI_CTL_TYPE_IMAGE != ctl->base.type &&
2522 RETROFLAT_COLOR_NULL == ctl->base.bg_color
2525 "invalid background color specified for control " RETROGUI_IDC_FMT
"!",
2527 retval = MERROR_GUI;
2533 RETROGUI_CTL_TYPE_IMAGE != ctl->base.type &&
2534 RETROFLAT_COLOR_NULL == ctl->base.fg_color
2537 "invalid foreground color specified for control " RETROGUI_IDC_FMT
"!",
2539 retval = MERROR_GUI;
2545#ifdef RETROGUI_TRACE_TOKENS
2546 debug_printf( RETROGUI_TRACE_LVL,
2547 "pushing %s " RETROGUI_IDC_FMT
" to slot " SIZE_T_FMT
"...",
2548 gc_retrogui_ctl_names[ctl->base.type], ctl->base.idc,
2549 mdata_vector_ct( &(gui->ctls) ) );
2550#elif RETROGUI_TRACE_LVL > 0
2551 debug_printf( RETROGUI_TRACE_LVL,
2552 "pushing control type %d, " RETROGUI_IDC_FMT
" to slot " SIZE_T_FMT
"...",
2553 ctl->base.type, ctl->base.idc, mdata_vector_ct( &(gui->ctls) ) );
2556 mdata_vector_append( &(gui->ctls), ctl,
sizeof(
union RETROGUI_CTL ) );
2558 gui->flags |= RETROGUI_FLAGS_DIRTY;
2563 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
2564 mdata_vector_lock( &(gui->ctls) );
2569 ctl = mdata_vector_get_last( &(gui->ctls),
2571 assert( NULL != ctl );
2573#if RETROGUI_TRACE_LVL > 0
2574# define RETROGUI_CTL_TABLE_PUSH( idx, c_name, c_fields ) \
2575 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2576 debug_printf( RETROGUI_TRACE_LVL, \
2577 "running " #c_name " push hook..." ); \
2578 retval = retrogui_push_ ## c_name( ctl ); \
2579 maug_cleanup_if_not_ok();
2581# define RETROGUI_CTL_TABLE_PUSH( idx, c_name, c_fields ) \
2582 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2583 retval = retrogui_push_ ## c_name( ctl ); \
2584 maug_cleanup_if_not_ok();
2588 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_PUSH )
2594 if( 0 == ctl->base.w || 0 == ctl->base.h ) {
2595#ifdef RETROGUI_TRACE_TOKENS
2596 debug_printf( RETROGUI_TRACE_LVL,
2597 "determining size for new %s control " RETROGUI_IDC_FMT
"...",
2598 gc_retrogui_ctl_names[ctl->base.type], ctl->base.idc );
2599#elif RETROGUI_TRACE_LVL > 0
2600 debug_printf( RETROGUI_TRACE_LVL,
2601 "determining size for new control type %d, " RETROGUI_IDC_FMT
"...",
2602 ctl->base.type, ctl->base.idc );
2604 retval = _retrogui_sz_ctl(
2605 gui, ctl->base.idc, &(ctl->base.w), &(ctl->base.h), 0, 0 );
2606 maug_cleanup_if_not_ok();
2610#if RETROGUI_TRACE_LVL > 0
2611 debug_printf( RETROGUI_TRACE_LVL,
2612 "setting focus to control: " RETROGUI_IDC_FMT, ctl->base.idc );
2620 mdata_vector_unlock( &(gui->ctls) );
2633 if( mdata_vector_is_locked( &((gui)->ctls) ) ) {
2634 error_printf(
"GUI is locked!" );
2638 assert( !mdata_vector_is_locked( &((gui)->ctls) ) );
2639 mdata_vector_lock( &(gui->ctls) );
2641 #define RETROGUI_CTL_TABLE_FREE_CTL( idx, c_name, c_fields ) \
2642 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2643 retrogui_destroy_ ## c_name( ctl );
2645 for( i = 0 ; mdata_vector_ct( &(gui->ctls) ) > i ; i++ ) {
2646 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
2647 if( idc != ctl->base.idc ) {
2653 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_FREE_CTL )
2657 mdata_vector_unlock( &(gui->ctls) );
2658 mdata_vector_remove( &(gui->ctls), i );
2659 mdata_vector_lock( &(gui->ctls) );
2663 mdata_vector_unlock( &(gui->ctls) );
2677#ifdef RETROGXC_PRESENT
2679 RETROFLAT_STATE_FLAG_USE_GXC ==
2680 (RETROFLAT_STATE_FLAG_USE_GXC & g_retroflat_state->retroflat_flags)
2682 gui->
font.cache_idx = retrogxc_load_font( font_path, 0, 33, 93 );
2684 gui->
font.cache_idx, (ssize_t)0, SSIZE_T_FMT, MERROR_GUI );
2688 RETROGUI_FLAGS_FONT_OWNED == (RETROGUI_FLAGS_FONT_OWNED & gui->flags) &&
2689 (MAUG_MHANDLE)NULL != gui->
font.handle
2691 debug_printf( RETROGUI_TRACE_LVL,
"freeing existing GUI font..." );
2692 maug_mfree( gui->
font.handle );
2695 maug_cleanup_if_not_ok();
2696#ifdef RETROGXC_PRESENT
2700 gui->flags |= RETROGUI_FLAGS_FONT_OWNED;
2707#ifndef RETROGUI_NO_TEXTBOX
2716 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
2717 mdata_vector_lock( &(gui->ctls) );
2721 ctl = _retrogui_get_ctl_by_idc( gui, idc );
2724 error_printf(
"could not get control text!" );
2725 retval = MERROR_GUI;
2729 if( RETROGUI_CTL_TYPE_TEXTBOX == ctl->base.type ) {
2730# if defined( RETROGUI_NATIVE_WIN )
2733 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
2734 maug_cleanup_if_null_lock(
char*, ctl->TEXTBOX.text );
2736 maug_strncpy( buffer, ctl->TEXTBOX.text, buffer_sz );
2738 }
else if( RETROGUI_CTL_TYPE_LABEL == ctl->base.type ) {
2739# if defined( RETROGUI_NATIVE_WIN )
2742 maug_mlock( ctl->LABEL.label_h, ctl->LABEL.label );
2743 maug_cleanup_if_null_lock(
char*, ctl->LABEL.label );
2745 maug_strncpy( buffer, ctl->LABEL.label, buffer_sz );
2752 if( RETROGUI_CTL_TYPE_TEXTBOX == ctl->base.type ) {
2753 if( NULL != ctl->TEXTBOX.text ) {
2754 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
2757 }
else if( RETROGUI_CTL_TYPE_LABEL == ctl->base.type ) {
2758 if( NULL != ctl->LABEL.label ) {
2759 maug_munlock( ctl->LABEL.label_h, ctl->LABEL.label );
2764 mdata_vector_unlock( &(gui->ctls) );
2780 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
2781 mdata_vector_lock( &(gui->ctls) );
2785 ctl = _retrogui_get_ctl_by_idc( gui, idc );
2788 error_printf(
"could not get control selection!" );
2789 retval = MERROR_GUI;
2793 assert( RETROGUI_CTL_TYPE_LISTBOX == ctl->base.type );
2795# if defined( RETROGUI_NATIVE_WIN )
2796 idx = SendMessage( ctl->base.hwnd, LB_GETCARETINDEX, 0, 0 );
2798 idx = ctl->LISTBOX.sel_idx;
2804 mdata_vector_unlock( &(gui->ctls) );
2807 if( MERROR_OK != retval ) {
2823 assert( !mdata_vector_is_locked( &((gui)->ctls) ) );
2824 mdata_vector_lock( &(gui->ctls) );
2826#if RETROGUI_TRACE_LVL > 0
2827 debug_printf( RETROGUI_TRACE_LVL,
2828 "setting control " RETROGUI_IDC_FMT
" color %u to: %d",
2829 idc, color_key, color_val );
2833 ctl = _retrogui_get_ctl_by_idc( gui, idc );
2836 error_printf(
"could not set control color!" );
2837 retval = MERROR_GUI;
2841 switch( color_key ) {
2848 error_printf(
"invalid color key specified: %u", color_key );
2854 mdata_vector_unlock( &(gui->ctls) );
2863 const char* fmt, ...
2866 char* label_tmp = NULL;
2867 char* buffer = NULL;
2869 MAUG_MHANDLE buffer_h = (MAUG_MHANDLE)NULL;
2872 assert( !mdata_vector_is_locked( &((gui)->ctls) ) );
2873 mdata_vector_lock( &(gui->ctls) );
2875#if RETROGUI_TRACE_LVL > 0
2876 debug_printf( RETROGUI_TRACE_LVL,
2877 "setting control " RETROGUI_IDC_FMT
" text to: %s", idc, fmt );
2881 ctl = _retrogui_get_ctl_by_idc( gui, idc );
2884 error_printf(
"could not set control text!" );
2885 retval = MERROR_GUI;
2890 maug_malloc_test( buffer_h, 1, buffer_sz + 1 );
2893 maug_mlock( buffer_h, buffer );
2894 maug_cleanup_if_null_lock(
char*, buffer );
2895 maug_mzero( buffer, buffer_sz + 1 );
2899 maug_mzero( buffer, buffer_sz + 1);
2903 va_start( args, fmt );
2904 maug_vsnprintf( buffer, buffer_sz, fmt, args );
2909 if( RETROGUI_CTL_TYPE_BUTTON == ctl->base.type ) {
2910 assert( NULL == ctl->BUTTON.label );
2911 _retrogui_copy_str( label, buffer, ctl->BUTTON, label_tmp, buffer_sz );
2912 }
else if( RETROGUI_CTL_TYPE_LABEL == ctl->base.type ) {
2913 assert( NULL == ctl->LABEL.label );
2915 label, buffer, ctl->LABEL, label_tmp, buffer_sz );
2916 ctl->LABEL.shown_sz = 1;
2917 ctl->LABEL.show_ticks =
2923#ifndef RETROGUI_NO_TEXTBOX
2924 }
else if( RETROGUI_CTL_TYPE_TEXTBOX == ctl->base.type ) {
2929 if( buffer_sz > ctl->TEXTBOX.text_sz_max ) {
2930#if RETROGUI_TRACE_LVL > 0
2931 debug_printf( RETROGUI_TRACE_LVL,
2932 "string size different; creating new buffer..." );
2934 if( (MAUG_MHANDLE)NULL != ctl->TEXTBOX.text_h ) {
2936 maug_mfree( ctl->TEXTBOX.text_h );
2940 maug_malloc_test( ctl->TEXTBOX.text_h, buffer_sz + 1, 1 );
2942 ctl->TEXTBOX.text_sz_max = buffer_sz;
2944 ctl->TEXTBOX.text_sz = buffer_sz;
2945 ctl->TEXTBOX.text_cur = 0;
2946 maug_mlock( ctl->TEXTBOX.text_h, label_tmp );
2947 maug_cleanup_if_null_lock(
char*, label_tmp );
2950 maug_mzero( label_tmp, buffer_sz + 1 );
2951#if RETROGUI_TRACE_LVL > 0
2952 debug_printf( RETROGUI_TRACE_LVL,
2953 "zeroed str sz for \"%s\": " SIZE_T_FMT, buffer, buffer_sz + 1 );
2955 maug_strncpy( label_tmp, buffer, buffer_sz );
2956#if RETROGUI_TRACE_LVL > 0
2957 debug_printf( RETROGUI_TRACE_LVL,
"copied str as: \"%s\"", label_tmp );
2959 maug_munlock( ctl->TEXTBOX.text_h, label_tmp );
2963 error_printf(
"invalid control type! no label!" );
2968 gui->flags |= RETROGUI_FLAGS_DIRTY;
2972 if( NULL != buffer ) {
2973 maug_munlock( buffer_h, buffer );
2976 if( (MAUG_MHANDLE)NULL != buffer_h ) {
2977 maug_mfree( buffer_h );
2980 mdata_vector_unlock( &(gui->ctls) );
2994 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
2995 mdata_vector_lock( &(gui->ctls) );
2999#if RETROGUI_TRACE_LVL > 0
3000 debug_printf( RETROGUI_TRACE_LVL,
3001 "setting control " RETROGUI_IDC_FMT
" image to: %s", idc, path );
3005 ctl = _retrogui_get_ctl_by_idc( gui, idc );
3008 error_printf(
"could not set control image!" );
3009 retval = MERROR_GUI;
3014 if( RETROGUI_CTL_TYPE_IMAGE == ctl->base.type ) {
3016# ifdef RETROGXC_PRESENT
3017 ctl->IMAGE.image_cache_id = -1;
3019 if( retroflat_2d_bitmap_ok( &(ctl->IMAGE.image) ) ) {
3020 retroflat_2d_destroy_bitmap( &(ctl->IMAGE.image) );
3024 if( NULL != path &&
'\0' != path[0] ) {
3025# if defined( RETROGXC_PRESENT )
3026 ctl->IMAGE.image_cache_id = retrogxc_load_bitmap( path, flags );
3028 retroflat_2d_load_bitmap( path, &(ctl->IMAGE.image), flags );
3032 error_printf(
"invalid control type! no image!" );
3037 gui->flags |= RETROGUI_FLAGS_DIRTY;
3042 mdata_vector_unlock( &(gui->ctls) );
3059 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
3060 mdata_vector_lock( &(gui->ctls) );
3064#if RETROGUI_TRACE_LVL > 0
3065 debug_printf( RETROGUI_TRACE_LVL,
3066 "setting control " RETROGUI_IDC_FMT
" image to: %p", idc, blit );
3070 ctl = _retrogui_get_ctl_by_idc( gui, idc );
3073 error_printf(
"could not set control image!" );
3074 retval = MERROR_GUI;
3079 if( RETROGUI_CTL_TYPE_IMAGE == ctl->base.type ) {
3080 if( NULL != blit ) {
3082# if defined( RETROGXC_PRESENT )
3083 ctl->IMAGE.image_cache_id = -1;
3086 ctl_img_w = retroflat_2d_bitmap_w( &(ctl->IMAGE.image) );
3087 ctl_img_h = retroflat_2d_bitmap_h( &(ctl->IMAGE.image) );
3088 blit_w = retroflat_2d_bitmap_w( blit );
3089 blit_h = retroflat_2d_bitmap_h( blit );
3093 retroflat_2d_bitmap_ok( &(ctl->IMAGE.image) ) &&
3094 (blit_w < ctl_img_w || blit_h < ctl_img_h)
3096 retroflat_2d_destroy_bitmap( &(ctl->IMAGE.image) );
3099#if RETROGUI_TRACE_LVL > 0
3100 debug_printf( RETROGUI_TRACE_LVL,
3101 "creating control " RETROGUI_IDC_FMT
" image: %u, %u",
3102 idc, blit_w, blit_h );
3106 retval = retroflat_2d_create_bitmap(
3107 blit_w, blit_h, &(ctl->IMAGE.image), 0 );
3108 maug_cleanup_if_not_ok();
3110 retroflat_2d_lock_bitmap( &(ctl->IMAGE.image) );
3112#if RETROGUI_TRACE_LVL > 0
3113 debug_printf( RETROGUI_TRACE_LVL,
3114 "blitting control " RETROGUI_IDC_FMT
" image from: %p", idc, blit );
3118 retroflat_2d_blit_bitmap(
3119 &(ctl->IMAGE.image),
3121 0, 0, 0, 0, blit_w, blit_h,
3122 ctl->IMAGE.instance );
3123 retroflat_2d_release_bitmap( &(ctl->IMAGE.image) );
3128 error_printf(
"invalid control type! no image!" );
3133 gui->flags |= RETROGUI_FLAGS_DIRTY;
3138 mdata_vector_unlock( &(gui->ctls) );
3154 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
3155 mdata_vector_lock( &(gui->ctls) );
3159#if RETROGUI_TRACE_LVL > 0
3160 debug_printf( RETROGUI_TRACE_LVL,
3161 "setting control " RETROGUI_IDC_FMT
" level to: %u", idc, level );
3165 ctl = _retrogui_get_ctl_by_idc( gui, idc );
3168 error_printf(
"could not set control level!" );
3169 retval = MERROR_GUI;
3174 if( RETROGUI_CTL_TYPE_FILLBAR == ctl->base.type ) {
3175 ctl->FILLBAR.cur = level;
3177 ctl->FILLBAR.max = max;
3180 error_printf(
"invalid control type! no level!" );
3185 gui->flags |= RETROGUI_FLAGS_DIRTY;
3190 mdata_vector_unlock( &(gui->ctls) );
3203 if( RETROGUI_IDC_NONE >= idc ) {
3204 error_printf(
"invalid IDC: %d", idc );
3205 retval = MERROR_GUI;
3209#if RETROGUI_TRACE_LVL > 0
3210 debug_printf( RETROGUI_TRACE_LVL,
3211 "initializing control base " RETROGUI_IDC_FMT
"...", idc );
3216 ctl->base.type = type;
3217 ctl->base.idc = idc;
3218 ctl->base.fg_color = RETROFLAT_COLOR_NULL;
3219 ctl->base.bg_color = RETROFLAT_COLOR_NULL;
3220 ctl->base.sel_fg = RETROFLAT_COLOR_NULL;
3221 ctl->base.sel_bg = RETROFLAT_COLOR_NULL;
3223 #define RETROGUI_CTL_TABLE_INITS( idx, c_name, c_fields ) \
3224 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
3225 retrogui_init_ ## c_name( ctl );
3228 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_INITS )
3231# ifdef RETROGXC_PRESENT
3232 if( RETROGUI_CTL_TYPE_IMAGE == type ) {
3233 ctl->IMAGE.image_cache_id = -1;
3249 if( mdata_vector_is_locked( &((gui)->ctls) ) ) {
3250 error_printf(
"GUI is locked!" );
3254 if( 0 == mdata_vector_ct( &(gui->ctls) ) ) {
3258 assert( !mdata_vector_is_locked( &((gui)->ctls) ) );
3259 mdata_vector_lock( &(gui->ctls) );
3261 #define RETROGUI_CTL_TABLE_FREE( idx, c_name, c_fields ) \
3262 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
3263 retrogui_destroy_ ## c_name( ctl );
3265 for( i = 0 ; mdata_vector_ct( &(gui->ctls) ) > i ; i++ ) {
3266 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
3268 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_FREE )
3272 mdata_vector_unlock( &(gui->ctls) );
3274# ifndef RETROGXC_PRESENT
3275 if( RETROGUI_FLAGS_FONT_OWNED == (RETROGUI_FLAGS_FONT_OWNED & gui->flags) ) {
3276 maug_mfree( gui->
font.handle );
3282 mdata_vector_free( &(gui->ctls) );
3290 struct RETROGUI* gui,
size_t start, ssize_t incr
3296 ssize_t i_before = -1;
3299 if( 0 == mdata_vector_ct( &(gui->ctls) ) ) {
3303 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
3304 mdata_vector_lock( &(gui->ctls) );
3310 i = start ; mdata_vector_ct( &(gui->ctls) ) > i && 0 <= i ; i += incr
3312 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
3315 }
else if( RETROGUI_IDC_NONE == gui->
focus_idc || 0 <= i_before ) {
3317 idc_out = ctl->base.idc;
3318#if RETROGUI_TRACE_LVL > 0
3319 debug_printf( RETROGUI_TRACE_LVL,
3320 "moving focus to control: " RETROGUI_IDC_FMT, idc_out );
3325 }
else if( ctl->base.idc == gui->
focus_idc ) {
3337 for( i = mdata_vector_ct( &(gui->ctls) ) - 1 ; 0 <= i ; i-- ) {
3338 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
3341#if RETROGUI_TRACE_LVL > 0
3343 RETROGUI_TRACE_LVL,
"skipping: " RETROGUI_IDC_FMT, i );
3347 idc_out = ctl->base.idc;
3348#if RETROGUI_TRACE_LVL > 0
3349 debug_printf( RETROGUI_TRACE_LVL,
3350 "moving focus to control: " RETROGUI_IDC_FMT, idc_out );
3357 }
else if( mdata_vector_ct( &(gui->ctls) ) <= i ) {
3359 for( i = 0 ; mdata_vector_ct( &(gui->ctls) ) > i ; i++ ) {
3360 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
3363#if RETROGUI_TRACE_LVL > 0
3365 RETROGUI_TRACE_LVL,
"skipping: " RETROGUI_IDC_FMT, i );
3369 idc_out = ctl->base.idc;
3370#if RETROGUI_TRACE_LVL > 0
3371 debug_printf( RETROGUI_TRACE_LVL,
3372 "moving focus to control: " RETROGUI_IDC_FMT, idc_out );
3380 error_printf(
"invalid focus: " RETROGUI_IDC_FMT, i );
3387 gui->flags |= RETROGUI_FLAGS_DIRTY;
3389 if( MERROR_OK != retval ) {
3390 idc_out = merror_retval_to_sz( retval );
3394 mdata_vector_unlock( &(gui->ctls) );
3397#if RETROGUI_TRACE_LVL > 0
3399 RETROGUI_TRACE_LVL,
"selected IDC: " RETROGUI_IDC_FMT, idc_out );
3410 maug_mzero( gui,
sizeof(
struct RETROGUI ) );
3412 gui->bg_color = RETROFLAT_COLOR_BLACK;
3414 gui->debounce_max = RETROGUI_DEBOUNCE_MAX_DEFAULT;
3416#if RETROGUI_TRACE_LVL > 0
3417 debug_printf( RETROGUI_TRACE_LVL,
"initialized GUI" );
3425#define RETROGUI_CTL_TABLE_CONSTS( idx, c_name, c_fields ) \
3426 extern MAUG_CONST uint8_t SEG_MCONST RETROGUI_CTL_TYPE_ ## c_name;
3428RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_CONSTS )
3430#ifdef RETROGUI_TRACE_TOKENS
3431extern 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:138
int8_t RETROFLAT_COLOR
Defines an index in the platform-specific color-table.
Definition retroflt.h:328
#define RETROFLAT_DRAW_FLAG_FILL
Flag for retroflat_rect() or retroflat_ellipse(), indicating drawn shape should be filled.
Definition retroflt.h:376
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:456
int16_t retroflat_pxxy_t
Type used for surface pixel coordinates.
Definition retroflt.h:925
#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_CTL...
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_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_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.
#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
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
MAUG_MHANDLE retrogxc_get_asset(size_t asset_idx, retrogxc_asset_type_t asset_type)
Retrive an asset for which we have a prior cached index.
#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
Fields common to ALL RETROGUI_CTL types.
Definition retrogui.h:415
Definition retrogui.h:468
union RETROGXC_CACHABLE font
Font used to draw any attached RETROGUI_CTL.
Definition retrogui.h:489
retrogui_idc_t focus_idc
Unique identifying index for current highlighted RETROGUI_CTL.
Definition retrogui.h:478
Definition retrogui.h:450