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;
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;
1106static void retrogui_redraw_BUTTON(
1116 MAUG_MHANDLE font_h = (MAUG_MHANDLE)NULL;
1118 if( ctl->base.idc == gui->
focus ) {
1120 fg_color = ctl->base.sel_fg;
1123 if( ctl->base.idc == gui->
focus ) {
1125 bg_color = ctl->base.sel_bg;
1129 if( 2 >= retroflat_screen_colors() ) {
1130 push_shadow_color = RETROFLAT_COLOR_BLACK;
1131 border_color = RETROFLAT_COLOR_BLACK;
1135 gui->draw_bmp, bg_color, gui->x + ctl->base.x, gui->y + ctl->base.y,
1138 retroflat_2d_rect( gui->draw_bmp, border_color,
1139 gui->x + ctl->base.x, gui->y + ctl->base.y,
1140 ctl->base.w, ctl->base.h, 0 );
1145 if( 0 < ctl->BUTTON.push_frames ) {
1147 gui->draw_bmp, push_shadow_color,
1148 gui->x + ctl->base.x + 1, gui->y + ctl->base.y + 1,
1149 gui->x + ctl->base.x + ctl->base.w - 2, gui->y + ctl->base.y + 1, 0 );
1151 gui->draw_bmp, push_shadow_color,
1152 gui->x + ctl->base.x + 1, gui->y + ctl->base.y + 2,
1153 gui->x + ctl->base.x + 1, gui->y + ctl->base.y + ctl->base.h - 3, 0 );
1155 gui->flags |= RETROGUI_FLAGS_DIRTY;
1156 ctl->BUTTON.push_frames--;
1161 gui->draw_bmp, RETROFLAT_COLOR_WHITE,
1162 gui->x + ctl->base.x + 1, gui->y + ctl->base.y + 1,
1163 gui->x + ctl->base.x + ctl->base.w - 2, gui->y + ctl->base.y + 1, 0 );
1165 gui->draw_bmp, RETROFLAT_COLOR_WHITE,
1166 gui->x + ctl->base.x + 1, gui->y + ctl->base.y + 2,
1167 gui->x + ctl->base.x + 1, gui->y + ctl->base.y + ctl->base.h - 3, 0 );
1170 maug_mlock( ctl->BUTTON.label_h, ctl->BUTTON.label );
1171 if( NULL == ctl->BUTTON.label ) {
1172 error_printf(
"could not lock BUTTON label!" );
1177#ifdef RETROGXC_PRESENT
1179 gui->
font.cache_idx, RETROGXC_ASSET_TYPE_FONT );
1180 if( (MAUG_MHANDLE)NULL == font_h ) {
1184 font_h = gui->
font.handle;
1186 retrofont_string_sz(
1187 gui->draw_bmp, ctl->BUTTON.label, 0, font_h,
1188 ctl->base.w, ctl->base.h, &w, &h, ctl->BUTTON.font_flags );
1191 gui->draw_bmp, fg_color, ctl->BUTTON.label, 0, font_h,
1192 gui->x + ctl->base.x + ((ctl->base.w >> 1) - (w >> 1)) + text_offset,
1193 gui->y + ctl->base.y + ((ctl->base.h >> 1) - (h >> 1)) + text_offset,
1195 ctl->base.w, ctl->base.h, ctl->BUTTON.font_flags );
1197 maug_munlock( ctl->BUTTON.label_h, ctl->BUTTON.label );
1207# if defined( RETROGUI_NATIVE_WIN )
1209 ctl->base.hwnd = CreateWindow(
1210 "BUTTON", ctl->BUTTON.label, WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
1211 gui->x + ctl->base.x, gui->y + ctl->base.y, ctl->base.w, ctl->base.h,
1212 g_retroflat_state->window, (HMENU)(ctl->base.idc),
1213 g_retroflat_instance, NULL );
1214 if( (HWND)NULL == ctl->base.hwnd ) {
1216 "Could not create button " RETROGUI_IDC_FMT
": %s",
1217 ctl->base.idc, ctl->BUTTON.label );
1218 retval = MERROR_GUI;
1223 char* label_tmp = NULL;
1225#if RETROGUI_TRACE_LVL > 0
1226 debug_printf( RETROGUI_TRACE_LVL,
"pushing BUTTON control..." );
1230 label, ctl->BUTTON.label, ctl->BUTTON, label_tmp, ctl->BUTTON.label_sz );
1231 ctl->BUTTON.label = NULL;
1245 MAUG_MHANDLE font_h = (MAUG_MHANDLE)NULL;
1247 assert( NULL != ctl );
1248 assert( NULL == ctl->BUTTON.label );
1249 assert( (MAUG_MHANDLE)NULL != ctl->BUTTON.label_h );
1251 maug_mlock( ctl->BUTTON.label_h, ctl->BUTTON.label );
1252 maug_cleanup_if_null_lock(
char*, ctl->BUTTON.label );
1255#ifdef RETROGXC_PRESENT
1257 gui->
font.cache_idx, RETROGXC_ASSET_TYPE_FONT );
1258 maug_cleanup_if_null_alloc( MAUG_MHANDLE, font_h );
1260 font_h = gui->
font.handle;
1262 retrofont_string_sz(
1263 NULL, ctl->BUTTON.label, 0, font_h,
1264 max_w - 8, max_h - 8, p_w, p_h, ctl->BUTTON.font_flags );
1267 *p_w += RETROGUI_BTN_LBL_PADDED_X;
1268 *p_h += RETROGUI_BTN_LBL_PADDED_Y;
1272 maug_munlock( ctl->BUTTON.label_h, ctl->BUTTON.label );
1284# if defined( RETROGUI_NATIVE_WIN )
1287 assert( NULL != ctl );
1302static void retrogui_destroy_BUTTON(
union RETROGUI_CTL* ctl ) {
1303 if( (MAUG_MHANDLE)NULL != ctl->BUTTON.label_h ) {
1304 maug_mfree( ctl->BUTTON.label_h );
1311#if RETROGUI_TRACE_LVL > 0
1312 debug_printf( RETROGUI_TRACE_LVL,
1313 "initializing button " RETROGUI_IDC_FMT
"...", ctl->base.idc );
1316 if( 2 < retroflat_screen_colors() ) {
1318 ctl->base.bg_color = RETROFLAT_COLOR_GRAY;
1319 ctl->base.sel_fg = RETROFLAT_COLOR_BLUE;
1320 ctl->base.sel_bg = RETROFLAT_COLOR_GRAY;
1322 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
1323 ctl->base.bg_color = RETROFLAT_COLOR_WHITE;
1324 ctl->base.sel_fg = RETROFLAT_COLOR_WHITE;
1325 ctl->base.sel_bg = RETROFLAT_COLOR_BLACK;
1331#ifndef RETROGUI_NO_TEXTBOX
1352# if defined( RETROGUI_NATIVE_WIN )
1356 c = retroflat_vk_to_ascii( *p_input, input_evt->key_flags );
1361 RETROFLAT_KEY_RIGHT != *p_input &&
1362 RETROFLAT_KEY_LEFT != *p_input
1368 assert( NULL == ctl->TEXTBOX.text );
1369 assert( (MAUG_MHANDLE)NULL != ctl->TEXTBOX.text_h );
1370 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
1371 if( NULL == ctl->TEXTBOX.text ) {
1372 error_printf(
"could not lock TEXTBOX text handle!" );
1376 switch( *p_input ) {
1377 case RETROFLAT_KEY_BKSP:
1379 ctl->TEXTBOX.text, ctl->TEXTBOX.text_cur, ctl->TEXTBOX.text_sz )
1382 case RETROFLAT_KEY_ENTER:
1383 idc_out = ctl->base.idc;
1386 case RETROFLAT_KEY_LEFT:
1387 if( 0 < ctl->TEXTBOX.text_cur ) {
1388 ctl->TEXTBOX.text_cur--;
1392 case RETROFLAT_KEY_RIGHT:
1393 if( ctl->TEXTBOX.text_sz > ctl->TEXTBOX.text_cur ) {
1394 ctl->TEXTBOX.text_cur++;
1399 assert( ctl->TEXTBOX.text_sz < ctl->TEXTBOX.text_sz_max );
1400 debug_printf( 1,
"cur: %d, sz: %d, sz_max: %d",
1401 ctl->TEXTBOX.text_cur, ctl->TEXTBOX.text_sz, ctl->TEXTBOX.text_sz_max );
1404 ctl->TEXTBOX.text_cur,
1405 ctl->TEXTBOX.text_sz,
1406 ctl->TEXTBOX.text_sz_max );
1414 if( NULL != ctl->TEXTBOX.text ) {
1415 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
1423static void retrogui_redraw_TEXTBOX(
1430 MAUG_MHANDLE font_h = (MAUG_MHANDLE)NULL;
1433 if( 2 >= retroflat_screen_colors() ) {
1434 shadow_color = RETROFLAT_COLOR_BLACK;
1435 border_color = RETROFLAT_COLOR_BLACK;
1438# if defined( RETROGUI_NATIVE_WIN )
1442 retroflat_2d_rect( gui->draw_bmp, ctl->base.bg_color,
1443 gui->x + ctl->base.x, gui->y + ctl->base.y,
1448 retroflat_2d_rect( gui->draw_bmp, border_color,
1449 gui->x + ctl->base.x,
1450 gui->y + ctl->base.y, ctl->base.w, 2,
1453 retroflat_2d_rect( gui->draw_bmp, border_color,
1454 gui->x + ctl->base.x,
1455 gui->y + ctl->base.y, 2, ctl->base.h,
1458 retroflat_2d_rect( gui->draw_bmp, shadow_color,
1459 gui->x + ctl->base.x,
1460 gui->y + ctl->base.y + ctl->base.h - 1,
1464 retroflat_2d_rect( gui->draw_bmp, shadow_color,
1465 gui->x + ctl->base.x + ctl->base.w - 1,
1466 gui->y + ctl->base.y, 2, ctl->base.h,
1471 assert( NULL == ctl->TEXTBOX.text );
1472 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
1473 if( NULL == ctl->TEXTBOX.text ) {
1477#ifdef RETROGXC_PRESENT
1479 gui->
font.cache_idx, RETROGXC_ASSET_TYPE_FONT );
1480 if( (MAUG_MHANDLE)NULL == font_h ) {
1484 font_h = gui->
font.handle;
1487 gui->draw_bmp, ctl->base.fg_color,
1488 ctl->TEXTBOX.text, ctl->TEXTBOX.text_cur, font_h,
1493 retrofont_string_sz(
1494 gui->draw_bmp, ctl->TEXTBOX.text, ctl->TEXTBOX.text_cur, font_h,
1497 if( cursor_x + RETROGUI_CTL_TEXT_CUR_WH >= ctl->base.w ) {
1500 cursor_y += RETROGUI_CTL_TEXT_CUR_WH;
1504 retroflat_2d_rect( gui->draw_bmp,
1508 RETROGUI_CTL_TEXT_CUR_WH, RETROGUI_CTL_TEXT_CUR_WH,
1511 gui->
focus == ctl->base.idc &&
1514 if( (-1 * RETROGUI_CTL_TEXT_BLINK_FRAMES) > --(ctl->TEXTBOX.blink_frames) ) {
1515 ctl->TEXTBOX.blink_frames = RETROGUI_CTL_TEXT_BLINK_FRAMES;
1518 if( NULL != ctl->TEXTBOX.text ) {
1520#ifdef RETROGXC_PRESENT
1522 gui->
font.cache_idx, RETROGXC_ASSET_TYPE_FONT );
1523 if( (MAUG_MHANDLE)NULL == font_h ) {
1527 font_h = gui->
font.handle;
1529 retrofont_string_indent(
1530 gui->draw_bmp, ctl->base.fg_color,
1531 &(ctl->TEXTBOX.text[ctl->TEXTBOX.text_cur]),
1533 strlen( ctl->TEXTBOX.text ) - ctl->TEXTBOX.text_cur, font_h,
1537 ctl->base.w, ctl->base.h,
1538 cursor_x + RETROGUI_CTL_TEXT_CUR_WH, 0 );
1540 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
1543 gui->flags |= RETROGUI_FLAGS_DIRTY;
1555# if defined( RETROGUI_NATIVE_WIN )
1557 ctl->base.hwnd = CreateWindow(
1558 "EDIT", 0, WS_CHILD | WS_VISIBLE | WS_BORDER,
1559 gui->x + ctl->base.x, gui->y + ctl->base.y, ctl->base.w, ctl->base.h,
1560 g_retroflat_state->window, (HMENU)(ctl->base.idc),
1561 g_retroflat_instance, NULL );
1562 if( (HWND)NULL == ctl->base.hwnd ) {
1564 "Could not create textbox: " RETROGUI_IDC_FMT, ctl->base.idc );
1565 retval = MERROR_GUI;
1571#if RETROGUI_TRACE_LVL > 0
1572 debug_printf( RETROGUI_TRACE_LVL,
1573 "clearing textbox " RETROGUI_IDC_FMT
" buffer...", ctl->base.idc );
1575 assert( (MAUG_MHANDLE)NULL == ctl->TEXTBOX.text_h );
1576 maug_malloc_test( ctl->TEXTBOX.text_h, RETROGUI_CTL_TEXT_SZ_MAX + 1, 1 );
1577 ctl->TEXTBOX.text_sz_max = RETROGUI_CTL_TEXT_SZ_MAX;
1579 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
1580 maug_cleanup_if_null_alloc(
char*, ctl->TEXTBOX.text );
1581#if RETROGUI_TRACE_LVL > 0
1582 debug_printf( RETROGUI_TRACE_LVL,
1583 "clearing textbox " RETROGUI_IDC_FMT
" buffer...", ctl->base.idc );
1585 maug_mzero( ctl->TEXTBOX.text, RETROGUI_CTL_TEXT_SZ_MAX + 1 );
1586 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
1615static void retrogui_destroy_TEXTBOX(
union RETROGUI_CTL* ctl ) {
1616 if( (MAUG_MHANDLE)NULL != ctl->TEXTBOX.text_h ) {
1617 maug_mfree( ctl->TEXTBOX.text_h );
1624#if RETROGUI_TRACE_LVL > 0
1625 debug_printf( RETROGUI_TRACE_LVL,
1626 "initializing textbox " RETROGUI_IDC_FMT
"...", ctl->base.idc );
1629 ctl->base.bg_color = RETROFLAT_COLOR_WHITE;
1630 ctl->base.sel_bg = RETROFLAT_COLOR_WHITE;
1631 if( 2 < retroflat_screen_colors() ) {
1632 ctl->base.sel_fg = RETROFLAT_COLOR_BLUE;
1635 ctl->base.sel_fg = RETROFLAT_COLOR_BLACK;
1636 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
1651 return RETROGUI_IDC_NONE;
1658 return RETROGUI_IDC_NONE;
1661static void retrogui_redraw_LABEL(
1665 MAUG_MHANDLE font_h = (MAUG_MHANDLE)NULL;
1667# if defined( RETROGUI_NATIVE_WIN )
1673 assert( NULL == ctl->LABEL.label );
1674 maug_mlock( ctl->LABEL.label_h, ctl->LABEL.label );
1675 if( NULL == ctl->LABEL.label ) {
1676 error_printf(
"could not lock LABEL text!" );
1684 if( 0 < ctl->LABEL.show_ticks ) {
1686 ctl->LABEL.show_ticks--;
1687 show_sz = ctl->LABEL.shown_sz;
1688 if( ctl->LABEL.shown_sz < ctl->LABEL.label_sz ) {
1689 gui->flags |= RETROGUI_FLAGS_DIRTY;
1694 ctl->LABEL.show_ticks =
1702 if( show_sz > ctl->LABEL.label_sz ) {
1704 show_sz = ctl->LABEL.label_sz;
1707 gui->flags |= RETROGUI_FLAGS_DIRTY;
1711 ctl->LABEL.shown_sz = show_sz;
1715 show_sz = ctl->LABEL.label_sz;
1718#ifdef RETROGXC_PRESENT
1720 gui->
font.cache_idx, RETROGXC_ASSET_TYPE_FONT );
1721 if( (MAUG_MHANDLE)NULL == font_h ) {
1725 font_h = gui->
font.handle;
1728 gui->draw_bmp, ctl->base.fg_color, ctl->LABEL.label, show_sz, font_h,
1731 ctl->LABEL.font_flags );
1735 if( NULL != ctl->LABEL.label ) {
1736 maug_munlock( ctl->LABEL.label_h, ctl->LABEL.label );
1747# if defined( RETROGUI_NATIVE_WIN )
1752 char* label_tmp = NULL;
1754#if RETROGUI_TRACE_LVL > 0
1755 debug_printf( RETROGUI_TRACE_LVL,
"pushing LABEL control..." );
1759 label, ctl->LABEL.label, ctl->LABEL, label_tmp, ctl->LABEL.label_sz );
1760 ctl->LABEL.label = NULL;
1761 ctl->LABEL.shown_sz = 1;
1762 ctl->LABEL.show_ticks =
1794static void retrogui_destroy_LABEL(
union RETROGUI_CTL* ctl ) {
1795 if( (MAUG_MHANDLE)NULL != ctl->LABEL.label_h ) {
1796 maug_mfree( ctl->LABEL.label_h );
1803#if RETROGUI_TRACE_LVL > 0
1804 debug_printf( RETROGUI_TRACE_LVL,
1805 "initializing label " RETROGUI_IDC_FMT
"...", ctl->base.idc );
1808 if( 2 < retroflat_screen_colors() ) {
1811 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
1813 ctl->base.bg_color = RETROFLAT_COLOR_WHITE;
1825 return RETROGUI_IDC_NONE;
1832 return RETROGUI_IDC_NONE;
1835static void retrogui_redraw_IMAGE(
1838# if defined( RETROGUI_NATIVE_WIN )
1842# if defined( RETROGXC_PRESENT )
1843 if( 0 <= ctl->IMAGE.image_cache_id ) {
1846#if RETROGUI_TRACE_LVL > 0
1847 debug_printf( RETROGUI_TRACE_LVL,
1848 "redrawing image ctl " RETROGUI_IDC_FMT
1849 ", cache ID " SSIZE_T_FMT
"...",
1850 ctl->base.idc, ctl->IMAGE.image_cache_id );
1852 retrogxc_blit_bitmap(
1854 ctl->IMAGE.image_cache_id,
1855 ctl->IMAGE.src_x, ctl->IMAGE.src_y,
1856 gui->x + ctl->base.x, gui->y + ctl->base.y, ctl->base.w, ctl->base.h,
1857 ctl->IMAGE.instance );
1860 if( retroflat_2d_bitmap_ok( &(ctl->IMAGE.image) ) ) {
1862 retroflat_2d_blit_bitmap(
1864 &(ctl->IMAGE.image),
1865 ctl->IMAGE.src_x, ctl->IMAGE.src_y,
1866 gui->x + ctl->base.x, gui->y + ctl->base.y, ctl->base.w, ctl->base.h,
1867 ctl->IMAGE.instance );
1878# if defined( RETROGUI_NATIVE_WIN )
1884#if RETROGUI_TRACE_LVL > 0
1885 debug_printf( RETROGUI_TRACE_LVL,
"pushing IMAGE control..." );
1888 assert( !retroflat_2d_bitmap_ok( &(ctl->IMAGE.image) ) );
1908# ifdef RETROGXC_PRESENT
1909 retval = retrogxc_bitmap_wh( ctl->IMAGE.image_cache_id, p_w, p_h );
1910 maug_cleanup_if_not_ok();
1914 0 == *p_w && 0 == *p_h &&
1915 !retroflat_2d_bitmap_ok( &(ctl->IMAGE.image) )
1917 error_printf(
"image not assigned!" );
1918 retval = MERROR_GUI;
1922 *p_w = retroflat_2d_bitmap_w( &(ctl->IMAGE.image) );
1923 *p_h = retroflat_2d_bitmap_h( &(ctl->IMAGE.image) );
1940static void retrogui_destroy_IMAGE(
union RETROGUI_CTL* ctl ) {
1941 if( retroflat_2d_bitmap_ok( &(ctl->IMAGE.image) ) ) {
1942 retroflat_2d_destroy_bitmap( &(ctl->IMAGE.image) );
1949#if RETROGUI_TRACE_LVL > 0
1950 debug_printf( RETROGUI_TRACE_LVL,
1951 "initializing IMAGE " RETROGUI_IDC_FMT
"...", ctl->base.idc );
1978static void retrogui_redraw_FILLBAR(
1983 if( 0 == ctl->FILLBAR.cur ) {
1986 fill_w = ctl->base.w * ctl->FILLBAR.cur / ctl->FILLBAR.max;
1990 gui->draw_bmp, ctl->base.bg_color,
1991 gui->x + ctl->base.x + fill_w,
1992 gui->y + ctl->base.y,
1996 gui->draw_bmp, ctl->base.fg_color,
1997 gui->x + ctl->base.x,
1998 gui->y + ctl->base.y,
2007# if defined( RETROGUI_NATIVE_WIN )
2023 assert( NULL != ctl );
2037# if defined( RETROGUI_NATIVE_WIN )
2040 assert( NULL != ctl );
2055static void retrogui_destroy_FILLBAR(
union RETROGUI_CTL* ctl ) {
2061#if RETROGUI_TRACE_LVL > 0
2062 debug_printf( RETROGUI_TRACE_LVL,
2063 "initializing fillbar " RETROGUI_IDC_FMT
"...", ctl->base.idc );
2066 if( 2 < retroflat_screen_colors() ) {
2068 ctl->base.bg_color = RETROFLAT_COLOR_GRAY;
2070 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
2071 ctl->base.bg_color = RETROFLAT_COLOR_WHITE;
2085 assert( mdata_vector_is_locked( &((gui)->ctls) ) );
2087 for( i = 0 ; mdata_vector_ct( &(gui->ctls) ) > i ; i++ ) {
2088 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
2089 if( idc == ctl->base.idc ) {
2096 error_printf(
"could not find GUI item IDC " RETROGUI_IDC_FMT, idc );
2112 assert( mdata_vector_is_locked( &((gui)->ctls) ) );
2114#if RETROGUI_TRACE_LVL > 0
2115 debug_printf( RETROGUI_TRACE_LVL,
2116 "sizing control " RETROGUI_IDC_FMT
" to: " SIZE_T_FMT
"x" SIZE_T_FMT,
2117 idc, max_w, max_h );
2120 ctl = _retrogui_get_ctl_by_idc( gui, idc );
2123 error_printf(
"could not size item!" );
2124 retval = MERROR_GUI;
2128 #define RETROGUI_CTL_TABLE_SZ( idx, c_name, c_fields ) \
2129 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2131 retval = retrogui_sz_ ## c_name( gui, ctl, p_w, p_h, max_w, max_h ); \
2132 maug_cleanup_if_not_ok();
2135 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_SZ )
2138#if RETROGUI_TRACE_LVL > 0
2139 debug_printf( RETROGUI_TRACE_LVL,
2140 "sized control " RETROGUI_IDC_FMT
" at " SIZE_T_FMT
"x" SIZE_T_FMT
"...",
2141 ctl->base.idc, ctl->base.w, ctl->base.h );
2152 struct RETROGUI* gui, RETROFLAT_IN_KEY* p_input,
2162 if( 0 == mdata_vector_ct( &(gui->ctls) ) ) {
2163 return RETROGUI_IDC_NONE;
2166 assert( !mdata_vector_is_locked( &((gui)->ctls) ) );
2167 mdata_vector_lock( &(gui->ctls) );
2169# if defined( RETROGUI_NATIVE_WIN )
2171 if( 0 == g_retroflat_state->last_idc ) {
2176 ctl = retrogui_get_ctl_by_idc( gui, g_retroflat_state->last_idc );
2177 g_retroflat_state->last_idc = 0;
2179#if RETROGUI_TRACE_LVL > 0
2180 debug_printf( RETROGUI_TRACE_LVL,
2181 "invalid IDC: " RETROGUI_IDC_FMT, gui->
focus );
2186# ifndef RETROGUI_NO_TEXTBOX
2187 if( RETROGUI_CTL_TYPE_TEXTBOX == ctl->base.type ) {
2188 if( SendMessage( ctl->base.hwnd, EM_GETMODIFY, 0, 0 ) ) {
2189 SendMessage( ctl->base.hwnd, EM_SETMODIFY, 0, 0 );
2190#if RETROGUI_TRACE_LVL > 0
2191 debug_printf( RETROGUI_TRACE_LVL,
"mod: %d",
2192 SendMessage( ctl->base.hwnd, EM_GETMODIFY, 0, 0 ) );
2202# define RETROGUI_CTL_TABLE_CLICK( idx, c_name, c_fields ) \
2203 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2204 gui->flags |= RETROGUI_FLAGS_DIRTY; \
2205 idc_out = retrogui_click_ ## c_name( gui, ctl, p_input, input_evt );
2207# define RETROGUI_CTL_TABLE_KEY( idx, c_name, c_fields ) \
2208 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2209 gui->flags |= RETROGUI_FLAGS_DIRTY; \
2210 idc_out = retrogui_key_ ## c_name( gui, ctl, p_input, input_evt );
2212 if( 0 != *p_input ) {
2213#if RETROGUI_TRACE_LVL > 0
2214 debug_printf( RETROGUI_TRACE_LVL,
2215 "focus " RETROGUI_IDC_FMT
" input: %d", gui->
focus, *p_input );
2220 if( retroflat_get_ms() < gui->debounce_next ) {
2221#if RETROGUI_TRACE_LVL > 0
2222 debug_printf( RETROGUI_TRACE_LVL,
2223 "debo! %d vs %d", retroflat_get_ms(), gui->debounce_next );
2228 if( 0 == *p_input ) {
2236 if( 0 <= gui->
focus ) {
2237 idc_out = gui->
focus;
2239 gui->flags |= RETROGUI_FLAGS_DIRTY;
2245 retrogui_focus_next( gui );
2247#if RETROGUI_TRACE_LVL > 0
2248 debug_printf( RETROGUI_TRACE_LVL,
"next: " RETROGUI_IDC_FMT, gui->
focus );
2257 retrogui_focus_prev( gui );
2259#if RETROGUI_TRACE_LVL > 0
2260 debug_printf( RETROGUI_TRACE_LVL,
"prev: " RETROGUI_IDC_FMT, gui->
focus );
2266# ifndef RETROGUI_NO_MOUSE
2268 RETROFLAT_MOUSE_B_LEFT == *p_input ||
2269 RETROFLAT_MOUSE_B_RIGHT == *p_input
2274#if RETROGUI_TRACE_LVL > 0
2275 debug_printf( RETROGUI_TRACE_LVL,
"resetting focus for mouse click..." );
2277 gui->
focus = RETROGUI_IDC_NONE;
2279 mouse_x = input_evt->
mouse_x - gui->x;
2280 mouse_y = input_evt->
mouse_y - gui->y;
2282 for( i = 0 ; mdata_vector_ct( &(gui->ctls) ) > i ; i++ ) {
2283 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
2285 mouse_x < ctl->base.x ||
2286 mouse_y < ctl->base.y ||
2287 mouse_x > ctl->base.x + ctl->base.w ||
2288 mouse_y > ctl->base.y + ctl->base.h
2293 if( gui->idc_prev == ctl->base.idc ) {
2296 idc_out = RETROGUI_IDC_NONE;
2300 gui->idc_prev = ctl->base.idc;
2302#if RETROGUI_TRACE_LVL > 0
2303 debug_printf( RETROGUI_TRACE_LVL,
2304 "setting focus to clicked control: " RETROGUI_IDC_FMT,
2307 gui->
focus = ctl->base.idc;
2310 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_CLICK )
2318 if( RETROGUI_IDC_NONE == gui->
focus ) {
2324 ctl = _retrogui_get_ctl_by_idc( gui, gui->
focus );
2329#if RETROGUI_TRACE_LVL > 0
2330 debug_printf( RETROGUI_TRACE_LVL,
2331 "invalid focus IDC: " RETROGUI_IDC_FMT, gui->
focus );
2337 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_KEY )
2342 gui->debounce_next = retroflat_get_ms() + gui->debounce_max;
2348 if( MERROR_OK != retval ) {
2349 idc_out = RETROGUI_IDC_NONE;
2352 mdata_vector_unlock( &(gui->ctls) );
2365#if RETROGUI_TRACE_LVL > 0
2366 debug_printf( RETROGUI_TRACE_LVL,
"redrawing controls..." );
2369#ifndef RETROWIN_NO_BITMAP
2370 if( RETROGUI_FLAGS_DIRTY != (RETROGUI_FLAGS_DIRTY & gui->flags) ) {
2376 if( 0 == mdata_vector_ct( &(gui->ctls) ) ) {
2380 if( !retrogxc_cachable_is_loaded( &(gui->
font) ) ) {
2381 error_printf(
"no font has been defined for GUI %p!", gui );
2385 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
2386 mdata_vector_lock( &(gui->ctls) );
2391 RETROFLAT_COLOR_BLACK != gui->bg_color &&
2392 0 < gui->w && 0 < gui->h
2394 retroflat_2d_rect( gui->draw_bmp,
2399 gui->flags &= ~RETROGUI_FLAGS_DIRTY;
2401 #define RETROGUI_CTL_TABLE_REDRAW( idx, c_name, c_fields ) \
2402 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2403 retrogui_redraw_ ## c_name( gui, ctl );
2406 for( i = 0 ; mdata_vector_ct( &(gui->ctls) ) > i ; i++ ) {
2407 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
2409 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_REDRAW )
2413#if RETROGUI_TRACE_LVL > 0
2414 debug_printf( RETROGUI_TRACE_LVL,
"redrawing controls complete!" );
2421 mdata_vector_unlock( &(gui->ctls) );
2438 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
2439 mdata_vector_lock( &(gui->ctls) );
2443#if RETROGUI_TRACE_LVL > 0
2444 debug_printf( RETROGUI_TRACE_LVL,
2445 "moving control " RETROGUI_IDC_FMT
" to: " SIZE_T_FMT
", " SIZE_T_FMT,
2449 ctl = _retrogui_get_ctl_by_idc( gui, idc );
2452 error_printf(
"could not position control!" );
2453 retval = MERROR_GUI;
2457 #define RETROGUI_CTL_TABLE_POS( idx, c_name, c_fields ) \
2458 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2460 retval = retrogui_pos_ ## c_name( gui, ctl, x, y, w, h ); \
2461 maug_cleanup_if_not_ok();
2464 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_POS )
2467#if RETROGUI_TRACE_LVL > 0
2468 debug_printf( RETROGUI_TRACE_LVL,
2469 "moved control " RETROGUI_IDC_FMT
" to " SIZE_T_FMT
", " SIZE_T_FMT
2470 " and sized to " SIZE_T_FMT
"x" SIZE_T_FMT
"...",
2471 ctl->base.idc, gui->x + ctl->base.x, gui->y + ctl->base.y,
2472 ctl->base.w, ctl->base.h );
2476 gui->flags |= RETROGUI_FLAGS_DIRTY;
2481 mdata_vector_unlock( &(gui->ctls) );
2496 assert( 0 < ctl->base.idc );
2500#if RETROGUI_TRACE_LVL > 0
2501 debug_printf( RETROGUI_TRACE_LVL,
2502 "gui->ctls_ct: " SIZE_T_FMT, mdata_vector_ct( &(gui->ctls) ) );
2506 RETROGUI_CTL_TYPE_IMAGE != ctl->base.type &&
2507 RETROFLAT_COLOR_NULL == ctl->base.bg_color
2510 "invalid background color specified for control " RETROGUI_IDC_FMT
"!",
2512 retval = MERROR_GUI;
2518 RETROGUI_CTL_TYPE_IMAGE != ctl->base.type &&
2519 RETROFLAT_COLOR_NULL == ctl->base.fg_color
2522 "invalid foreground color specified for control " RETROGUI_IDC_FMT
"!",
2524 retval = MERROR_GUI;
2530#ifdef RETROGUI_TRACE_TOKENS
2531 debug_printf( RETROGUI_TRACE_LVL,
2532 "pushing %s " RETROGUI_IDC_FMT
" to slot " SIZE_T_FMT
"...",
2533 gc_retrogui_ctl_names[ctl->base.type], ctl->base.idc,
2534 mdata_vector_ct( &(gui->ctls) ) );
2535#elif RETROGUI_TRACE_LVL > 0
2536 debug_printf( RETROGUI_TRACE_LVL,
2537 "pushing control type %d, " RETROGUI_IDC_FMT
" to slot " SIZE_T_FMT
"...",
2538 ctl->base.type, ctl->base.idc, mdata_vector_ct( &(gui->ctls) ) );
2541 mdata_vector_append( &(gui->ctls), ctl,
sizeof(
union RETROGUI_CTL ) );
2543 gui->flags |= RETROGUI_FLAGS_DIRTY;
2548 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
2549 mdata_vector_lock( &(gui->ctls) );
2554 ctl = mdata_vector_get_last( &(gui->ctls),
2556 assert( NULL != ctl );
2558#if RETROGUI_TRACE_LVL > 0
2559# define RETROGUI_CTL_TABLE_PUSH( idx, c_name, c_fields ) \
2560 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2561 debug_printf( RETROGUI_TRACE_LVL, \
2562 "running " #c_name " push hook..." ); \
2563 retval = retrogui_push_ ## c_name( ctl ); \
2564 maug_cleanup_if_not_ok();
2566# define RETROGUI_CTL_TABLE_PUSH( idx, c_name, c_fields ) \
2567 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2568 retval = retrogui_push_ ## c_name( ctl ); \
2569 maug_cleanup_if_not_ok();
2573 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_PUSH )
2579 if( 0 == ctl->base.w || 0 == ctl->base.h ) {
2580#ifdef RETROGUI_TRACE_TOKENS
2581 debug_printf( RETROGUI_TRACE_LVL,
2582 "determining size for new %s control " RETROGUI_IDC_FMT
"...",
2583 gc_retrogui_ctl_names[ctl->base.type], ctl->base.idc );
2584#elif RETROGUI_TRACE_LVL > 0
2585 debug_printf( RETROGUI_TRACE_LVL,
2586 "determining size for new control type %d, " RETROGUI_IDC_FMT
"...",
2587 ctl->base.type, ctl->base.idc );
2589 retval = _retrogui_sz_ctl(
2590 gui, ctl->base.idc, &(ctl->base.w), &(ctl->base.h), 0, 0 );
2591 maug_cleanup_if_not_ok();
2595#if RETROGUI_TRACE_LVL > 0
2596 debug_printf( RETROGUI_TRACE_LVL,
2597 "setting focus to control: " RETROGUI_IDC_FMT, ctl->base.idc );
2599 gui->
focus = ctl->base.idc;
2605 mdata_vector_unlock( &(gui->ctls) );
2618 if( mdata_vector_is_locked( &((gui)->ctls) ) ) {
2619 error_printf(
"GUI is locked!" );
2623 assert( !mdata_vector_is_locked( &((gui)->ctls) ) );
2624 mdata_vector_lock( &(gui->ctls) );
2626 #define RETROGUI_CTL_TABLE_FREE_CTL( idx, c_name, c_fields ) \
2627 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
2628 retrogui_destroy_ ## c_name( ctl );
2630 for( i = 0 ; mdata_vector_ct( &(gui->ctls) ) > i ; i++ ) {
2631 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
2632 if( idc != ctl->base.idc ) {
2638 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_FREE_CTL )
2642 mdata_vector_unlock( &(gui->ctls) );
2643 mdata_vector_remove( &(gui->ctls), i );
2644 mdata_vector_lock( &(gui->ctls) );
2648 mdata_vector_unlock( &(gui->ctls) );
2662#ifdef RETROGXC_PRESENT
2664 RETROFLAT_FLAGS_USE_GXC ==
2665 (RETROFLAT_FLAGS_USE_GXC & g_retroflat_state->retroflat_flags)
2667 gui->
font.cache_idx = retrogxc_load_font( font_path, 0, 33, 93 );
2669 gui->
font.cache_idx, (ssize_t)0, SSIZE_T_FMT, MERROR_GUI );
2673 RETROGUI_FLAGS_FONT_OWNED == (RETROGUI_FLAGS_FONT_OWNED & gui->flags) &&
2674 (MAUG_MHANDLE)NULL != gui->
font.handle
2676 debug_printf( RETROGUI_TRACE_LVL,
"freeing existing GUI font..." );
2677 maug_mfree( gui->
font.handle );
2680 maug_cleanup_if_not_ok();
2681#ifdef RETROGXC_PRESENT
2685 gui->flags |= RETROGUI_FLAGS_FONT_OWNED;
2692#ifndef RETROGUI_NO_TEXTBOX
2701 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
2702 mdata_vector_lock( &(gui->ctls) );
2706 ctl = _retrogui_get_ctl_by_idc( gui, idc );
2709 error_printf(
"could not get control text!" );
2710 retval = MERROR_GUI;
2714 if( RETROGUI_CTL_TYPE_TEXTBOX == ctl->base.type ) {
2715# if defined( RETROGUI_NATIVE_WIN )
2718 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
2719 maug_cleanup_if_null_lock(
char*, ctl->TEXTBOX.text );
2721 maug_strncpy( buffer, ctl->TEXTBOX.text, buffer_sz );
2723 }
else if( RETROGUI_CTL_TYPE_LABEL == ctl->base.type ) {
2724# if defined( RETROGUI_NATIVE_WIN )
2727 maug_mlock( ctl->LABEL.label_h, ctl->LABEL.label );
2728 maug_cleanup_if_null_lock(
char*, ctl->LABEL.label );
2730 maug_strncpy( buffer, ctl->LABEL.label, buffer_sz );
2737 if( RETROGUI_CTL_TYPE_TEXTBOX == ctl->base.type ) {
2738 if( NULL != ctl->TEXTBOX.text ) {
2739 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
2742 }
else if( RETROGUI_CTL_TYPE_LABEL == ctl->base.type ) {
2743 if( NULL != ctl->LABEL.label ) {
2744 maug_munlock( ctl->LABEL.label_h, ctl->LABEL.label );
2749 mdata_vector_unlock( &(gui->ctls) );
2765 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
2766 mdata_vector_lock( &(gui->ctls) );
2770 ctl = _retrogui_get_ctl_by_idc( gui, idc );
2773 error_printf(
"could not get control selection!" );
2774 retval = MERROR_GUI;
2778 assert( RETROGUI_CTL_TYPE_LISTBOX == ctl->base.type );
2780# if defined( RETROGUI_NATIVE_WIN )
2781 idx = SendMessage( ctl->base.hwnd, LB_GETCARETINDEX, 0, 0 );
2783 idx = ctl->LISTBOX.sel_idx;
2789 mdata_vector_unlock( &(gui->ctls) );
2792 if( MERROR_OK != retval ) {
2808 assert( !mdata_vector_is_locked( &((gui)->ctls) ) );
2809 mdata_vector_lock( &(gui->ctls) );
2811#if RETROGUI_TRACE_LVL > 0
2812 debug_printf( RETROGUI_TRACE_LVL,
2813 "setting control " RETROGUI_IDC_FMT
" color %u to: %d",
2814 idc, color_key, color_val );
2818 ctl = _retrogui_get_ctl_by_idc( gui, idc );
2821 error_printf(
"could not set control color!" );
2822 retval = MERROR_GUI;
2826 switch( color_key ) {
2833 error_printf(
"invalid color key specified: %u", color_key );
2839 mdata_vector_unlock( &(gui->ctls) );
2848 const char* fmt, ...
2851 char* label_tmp = NULL;
2852 char* buffer = NULL;
2854 MAUG_MHANDLE buffer_h = (MAUG_MHANDLE)NULL;
2857 assert( !mdata_vector_is_locked( &((gui)->ctls) ) );
2858 mdata_vector_lock( &(gui->ctls) );
2860#if RETROGUI_TRACE_LVL > 0
2861 debug_printf( RETROGUI_TRACE_LVL,
2862 "setting control " RETROGUI_IDC_FMT
" text to: %s", idc, fmt );
2866 ctl = _retrogui_get_ctl_by_idc( gui, idc );
2869 error_printf(
"could not set control text!" );
2870 retval = MERROR_GUI;
2875 maug_malloc_test( buffer_h, 1, buffer_sz + 1 );
2878 maug_mlock( buffer_h, buffer );
2879 maug_cleanup_if_null_lock(
char*, buffer );
2880 maug_mzero( buffer, buffer_sz + 1 );
2884 maug_mzero( buffer, buffer_sz + 1);
2888 va_start( args, fmt );
2889 maug_vsnprintf( buffer, buffer_sz, fmt, args );
2894 if( RETROGUI_CTL_TYPE_BUTTON == ctl->base.type ) {
2895 assert( NULL == ctl->BUTTON.label );
2896 _retrogui_copy_str( label, buffer, ctl->BUTTON, label_tmp, buffer_sz );
2897 }
else if( RETROGUI_CTL_TYPE_LABEL == ctl->base.type ) {
2898 assert( NULL == ctl->LABEL.label );
2900 label, buffer, ctl->LABEL, label_tmp, buffer_sz );
2901 ctl->LABEL.shown_sz = 1;
2902 ctl->LABEL.show_ticks =
2908#ifndef RETROGUI_NO_TEXTBOX
2909 }
else if( RETROGUI_CTL_TYPE_TEXTBOX == ctl->base.type ) {
2914 if( buffer_sz > ctl->TEXTBOX.text_sz_max ) {
2915#if RETROGUI_TRACE_LVL > 0
2916 debug_printf( RETROGUI_TRACE_LVL,
2917 "string size different; creating new buffer..." );
2919 if( (MAUG_MHANDLE)NULL != ctl->TEXTBOX.text_h ) {
2921 maug_mfree( ctl->TEXTBOX.text_h );
2925 maug_malloc_test( ctl->TEXTBOX.text_h, buffer_sz + 1, 1 );
2927 ctl->TEXTBOX.text_sz_max = buffer_sz;
2929 ctl->TEXTBOX.text_sz = buffer_sz;
2930 ctl->TEXTBOX.text_cur = 0;
2931 maug_mlock( ctl->TEXTBOX.text_h, label_tmp );
2932 maug_cleanup_if_null_lock(
char*, label_tmp );
2935 maug_mzero( label_tmp, buffer_sz + 1 );
2936#if RETROGUI_TRACE_LVL > 0
2937 debug_printf( RETROGUI_TRACE_LVL,
2938 "zeroed str sz for \"%s\": " SIZE_T_FMT, buffer, buffer_sz + 1 );
2940 maug_strncpy( label_tmp, buffer, buffer_sz );
2941#if RETROGUI_TRACE_LVL > 0
2942 debug_printf( RETROGUI_TRACE_LVL,
"copied str as: \"%s\"", label_tmp );
2944 maug_munlock( ctl->TEXTBOX.text_h, label_tmp );
2948 error_printf(
"invalid control type! no label!" );
2953 gui->flags |= RETROGUI_FLAGS_DIRTY;
2957 if( NULL != buffer ) {
2958 maug_munlock( buffer_h, buffer );
2961 if( (MAUG_MHANDLE)NULL != buffer_h ) {
2962 maug_mfree( buffer_h );
2965 mdata_vector_unlock( &(gui->ctls) );
2979 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
2980 mdata_vector_lock( &(gui->ctls) );
2984#if RETROGUI_TRACE_LVL > 0
2985 debug_printf( RETROGUI_TRACE_LVL,
2986 "setting control " RETROGUI_IDC_FMT
" image to: %s", idc, path );
2990 ctl = _retrogui_get_ctl_by_idc( gui, idc );
2993 error_printf(
"could not set control image!" );
2994 retval = MERROR_GUI;
2999 if( RETROGUI_CTL_TYPE_IMAGE == ctl->base.type ) {
3001# ifdef RETROGXC_PRESENT
3002 ctl->IMAGE.image_cache_id = -1;
3004 if( retroflat_2d_bitmap_ok( &(ctl->IMAGE.image) ) ) {
3005 retroflat_2d_destroy_bitmap( &(ctl->IMAGE.image) );
3009 if( NULL != path &&
'\0' != path[0] ) {
3010# if defined( RETROGXC_PRESENT )
3011 ctl->IMAGE.image_cache_id = retrogxc_load_bitmap( path, flags );
3013 retroflat_2d_load_bitmap( path, &(ctl->IMAGE.image), flags );
3017 error_printf(
"invalid control type! no image!" );
3022 gui->flags |= RETROGUI_FLAGS_DIRTY;
3027 mdata_vector_unlock( &(gui->ctls) );
3044 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
3045 mdata_vector_lock( &(gui->ctls) );
3049#if RETROGUI_TRACE_LVL > 0
3050 debug_printf( RETROGUI_TRACE_LVL,
3051 "setting control " RETROGUI_IDC_FMT
" image to: %p", idc, blit );
3055 ctl = _retrogui_get_ctl_by_idc( gui, idc );
3058 error_printf(
"could not set control image!" );
3059 retval = MERROR_GUI;
3064 if( RETROGUI_CTL_TYPE_IMAGE == ctl->base.type ) {
3065 if( NULL != blit ) {
3067# if defined( RETROGXC_PRESENT )
3068 ctl->IMAGE.image_cache_id = -1;
3071 ctl_img_w = retroflat_2d_bitmap_w( &(ctl->IMAGE.image) );
3072 ctl_img_h = retroflat_2d_bitmap_h( &(ctl->IMAGE.image) );
3073 blit_w = retroflat_2d_bitmap_w( blit );
3074 blit_h = retroflat_2d_bitmap_h( blit );
3078 retroflat_2d_bitmap_ok( &(ctl->IMAGE.image) ) &&
3079 (blit_w < ctl_img_w || blit_h < ctl_img_h)
3081 retroflat_2d_destroy_bitmap( &(ctl->IMAGE.image) );
3084#if RETROGUI_TRACE_LVL > 0
3085 debug_printf( RETROGUI_TRACE_LVL,
3086 "creating control " RETROGUI_IDC_FMT
" image: %u, %u",
3087 idc, blit_w, blit_h );
3091 retval = retroflat_2d_create_bitmap(
3092 blit_w, blit_h, &(ctl->IMAGE.image), 0 );
3093 maug_cleanup_if_not_ok();
3095 retroflat_2d_lock_bitmap( &(ctl->IMAGE.image) );
3097#if RETROGUI_TRACE_LVL > 0
3098 debug_printf( RETROGUI_TRACE_LVL,
3099 "blitting control " RETROGUI_IDC_FMT
" image from: %p", idc, blit );
3103 retroflat_2d_blit_bitmap(
3104 &(ctl->IMAGE.image),
3106 0, 0, 0, 0, blit_w, blit_h,
3107 ctl->IMAGE.instance );
3108 retroflat_2d_release_bitmap( &(ctl->IMAGE.image) );
3113 error_printf(
"invalid control type! no image!" );
3118 gui->flags |= RETROGUI_FLAGS_DIRTY;
3123 mdata_vector_unlock( &(gui->ctls) );
3139 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
3140 mdata_vector_lock( &(gui->ctls) );
3144#if RETROGUI_TRACE_LVL > 0
3145 debug_printf( RETROGUI_TRACE_LVL,
3146 "setting control " RETROGUI_IDC_FMT
" level to: %u", idc, level );
3150 ctl = _retrogui_get_ctl_by_idc( gui, idc );
3153 error_printf(
"could not set control level!" );
3154 retval = MERROR_GUI;
3159 if( RETROGUI_CTL_TYPE_FILLBAR == ctl->base.type ) {
3160 ctl->FILLBAR.cur = level;
3162 ctl->FILLBAR.max = max;
3165 error_printf(
"invalid control type! no level!" );
3170 gui->flags |= RETROGUI_FLAGS_DIRTY;
3175 mdata_vector_unlock( &(gui->ctls) );
3188#if RETROGUI_TRACE_LVL > 0
3189 debug_printf( RETROGUI_TRACE_LVL,
3190 "initializing control base " RETROGUI_IDC_FMT
"...", idc );
3195 ctl->base.type = type;
3196 ctl->base.idc = idc;
3197 ctl->base.fg_color = RETROFLAT_COLOR_NULL;
3198 ctl->base.bg_color = RETROFLAT_COLOR_NULL;
3199 ctl->base.sel_fg = RETROFLAT_COLOR_NULL;
3200 ctl->base.sel_bg = RETROFLAT_COLOR_NULL;
3202 #define RETROGUI_CTL_TABLE_INITS( idx, c_name, c_fields ) \
3203 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
3204 retrogui_init_ ## c_name( ctl );
3207 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_INITS )
3210# ifdef RETROGXC_PRESENT
3211 if( RETROGUI_CTL_TYPE_IMAGE == type ) {
3212 ctl->IMAGE.image_cache_id = -1;
3226 if( mdata_vector_is_locked( &((gui)->ctls) ) ) {
3227 error_printf(
"GUI is locked!" );
3231 if( 0 == mdata_vector_ct( &(gui->ctls) ) ) {
3235 assert( !mdata_vector_is_locked( &((gui)->ctls) ) );
3236 mdata_vector_lock( &(gui->ctls) );
3238 #define RETROGUI_CTL_TABLE_FREE( idx, c_name, c_fields ) \
3239 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
3240 retrogui_destroy_ ## c_name( ctl );
3242 for( i = 0 ; mdata_vector_ct( &(gui->ctls) ) > i ; i++ ) {
3243 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
3245 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_FREE )
3249 mdata_vector_unlock( &(gui->ctls) );
3251# ifndef RETROGXC_PRESENT
3252 if( RETROGUI_FLAGS_FONT_OWNED == (RETROGUI_FLAGS_FONT_OWNED & gui->flags) ) {
3253 maug_mfree( gui->
font.handle );
3259 mdata_vector_free( &(gui->ctls) );
3267 struct RETROGUI* gui,
size_t start, ssize_t incr
3273 ssize_t i_before = -1;
3276 if( 0 == mdata_vector_ct( &(gui->ctls) ) ) {
3280 if( !mdata_vector_is_locked( &((gui)->ctls) ) ) {
3281 mdata_vector_lock( &(gui->ctls) );
3287 i = start ; mdata_vector_ct( &(gui->ctls) ) > i && 0 <= i ; i += incr
3289 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
3292 }
else if( RETROGUI_IDC_NONE == gui->
focus || 0 <= i_before ) {
3294 idc_out = ctl->base.idc;
3295#if RETROGUI_TRACE_LVL > 0
3296 debug_printf( RETROGUI_TRACE_LVL,
3297 "moving focus to control: " RETROGUI_IDC_FMT, idc_out );
3299 gui->
focus = idc_out;
3302 }
else if( ctl->base.idc == gui->
focus ) {
3314 for( i = mdata_vector_ct( &(gui->ctls) ) - 1 ; 0 <= i ; i-- ) {
3315 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
3318#if RETROGUI_TRACE_LVL > 0
3320 RETROGUI_TRACE_LVL,
"skipping: " RETROGUI_IDC_FMT, i );
3324 idc_out = ctl->base.idc;
3325#if RETROGUI_TRACE_LVL > 0
3326 debug_printf( RETROGUI_TRACE_LVL,
3327 "moving focus to control: " RETROGUI_IDC_FMT, idc_out );
3329 gui->
focus = idc_out;
3334 }
else if( mdata_vector_ct( &(gui->ctls) ) <= i ) {
3336 for( i = 0 ; mdata_vector_ct( &(gui->ctls) ) > i ; i++ ) {
3337 ctl = mdata_vector_get( &(gui->ctls), i,
union RETROGUI_CTL );
3340#if RETROGUI_TRACE_LVL > 0
3342 RETROGUI_TRACE_LVL,
"skipping: " RETROGUI_IDC_FMT, i );
3346 idc_out = ctl->base.idc;
3347#if RETROGUI_TRACE_LVL > 0
3348 debug_printf( RETROGUI_TRACE_LVL,
3349 "moving focus to control: " RETROGUI_IDC_FMT, idc_out );
3351 gui->
focus = idc_out;
3357 error_printf(
"invalid focus: " RETROGUI_IDC_FMT, i );
3364 gui->flags |= RETROGUI_FLAGS_DIRTY;
3366 if( MERROR_OK != retval ) {
3367 idc_out = merror_retval_to_sz( retval );
3371 mdata_vector_unlock( &(gui->ctls) );
3374#if RETROGUI_TRACE_LVL > 0
3376 RETROGUI_TRACE_LVL,
"selected IDC: " RETROGUI_IDC_FMT, idc_out );
3387 maug_mzero( gui,
sizeof(
struct RETROGUI ) );
3389 gui->bg_color = RETROFLAT_COLOR_BLACK;
3390 gui->
focus = RETROGUI_IDC_NONE;
3391 gui->debounce_max = RETROGUI_DEBOUNCE_MAX_DEFAULT;
3393#if RETROGUI_TRACE_LVL > 0
3394 debug_printf( RETROGUI_TRACE_LVL,
"initialized GUI" );
3402#define RETROGUI_CTL_TABLE_CONSTS( idx, c_name, c_fields ) \
3403 extern MAUG_CONST uint8_t SEG_MCONST RETROGUI_CTL_TYPE_ ## c_name;
3405RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_CONSTS )
3407#ifdef RETROGUI_TRACE_TOKENS
3408extern 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:474
int16_t retroflat_pxxy_t
Type used for surface pixel coordinates.
Definition retroflt.h:910
#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
Unique identifying index for current highlighted RETROGUI_CTL.
Definition retrogui.h:478
Definition retrogui.h:450