5#define RETROCON_DEBOUNCE_WAIT 3
7#define RETROCON_FLAG_ACTIVE 0x01
9#define RETROCON_IDC_TEXTBOX 1
11#define RETROCON_IDC_CON_BASE 10
13#define RETROCON_IDC_CLOSE (-1)
15#ifndef RETROCON_TRACE_LVL
16# define RETROCON_TRACE_LVL 0
19#ifdef RETROCON_DISABLE
28# define retrocon_init( con, fn, x, y, w, h ) (MERROR_OK)
30# define retrocon_add_command( con, cmd, cb, cb_data ) (MERROR_OK)
32# define retrocon_display( con, display )
34# define retrocon_print_line( con, line )
36# define retrocon_exec_line( con, line, line_sz )
38# define retrocon_debounce( con, c )
40# define retrocon_input( con, p_c, input_evt, p_idc, win_stack )
42# define retrocon_shutdown( con )
51#ifndef RETROCON_TRACE_LVL
52# define RETROCON_TRACE_LVL 0
55#ifndef RETROCON_SBUFFER_SZ_MAX
56# define RETROCON_SBUFFER_SZ_MAX 4096
59#ifndef RETROCON_SBUFFER_LINES_MAX
60# define RETROCON_SBUFFER_LINES_MAX 30
63#ifndef RETROCON_LBUFFER_SZ_MAX
64# define RETROCON_LBUFFER_SZ_MAX 256
67#ifndef RETROCON_ACTIVE_KEY
68# define RETROCON_ACTIVE_KEY RETROFLAT_KEY_GRAVE
71#ifndef RETROCON_CB_NAME_SZ_MAX
72# define RETROCON_CB_NAME_SZ_MAX 32
75#ifndef RETROCON_CB_SZ_MAX
76# define RETROCON_CB_SZ_MAX 128
82 struct RETROCON* con,
const char* line,
size_t line_sz,
void* data );
89 void* callback_data[RETROCON_CB_SZ_MAX];
90 char callback_names[RETROCON_CB_SZ_MAX][RETROCON_CB_NAME_SZ_MAX + 1];
91 retrocon_cb callbacks[RETROCON_CB_SZ_MAX];
100 struct RETROCON* con,
const char* font_name,
101 size_t x,
size_t y,
size_t w,
size_t h );
104 struct RETROCON* con,
const char* cmd, retrocon_cb cb,
void* cb_data );
109 struct RETROCON* con,
char* line,
size_t line_sz );
111int retrocon_debounce(
struct RETROCON* con,
int c );
127 struct RETROCON* con, RETROFLAT_IN_KEY* p_c,
132 struct RETROCON* con, retroflat_blit_t* gui_bmp );
134void retrocon_shutdown(
struct RETROCON* con );
139 struct RETROCON* con,
const char* line,
size_t line_sz,
void* data
142 char* print_line = NULL;
144 print_line = maug_strchr( line,
' ' );
145 if( NULL == print_line ) {
153 retrocon_print_line( con, print_line );
161 struct RETROCON* con,
const char* line,
size_t line_sz,
void* data
171 struct RETROCON* con,
const char* font_name,
172 size_t x,
size_t y,
size_t w,
size_t h
176 size_t ctl_y_iter = 0;
178 debug_printf( RETROCON_TRACE_LVL,
"initializing console..." );
181 maug_cleanup_if_not_ok();
184 maug_cleanup_if_not_ok();
186 con->sbuffer_color = RETROFLAT_COLOR_DARKBLUE;
187 con->lbuffer_color = RETROFLAT_COLOR_DARKBLUE;
194 &ctl, RETROGUI_CTL_TYPE_TEXTBOX, RETROCON_IDC_TEXTBOX );
198 ctl.base.w = con->gui.w - 10;
200 ctl.base.fg_color = RETROFLAT_COLOR_DARKBLUE;
202 retval = retrogui_push_ctl( &(con->gui), &ctl );
203 maug_cleanup_if_not_ok();
205 ctl_y_iter = ctl.base.y + ctl.base.h + 1;
206 while( h - 5 > ctl_y_iter + 8 + 1 ) {
208 &ctl, RETROGUI_CTL_TYPE_LABEL,
209 RETROCON_IDC_CON_BASE + con->sbuffer_lines );
212 ctl.base.y = ctl_y_iter;
213 ctl.base.w = con->gui.w - 10;
215 ctl.base.fg_color = RETROFLAT_COLOR_DARKGRAY;
216 ctl.LABEL.label =
"xxxxxx";
218 retval = retrogui_push_ctl( &(con->gui), &ctl );
219 maug_cleanup_if_not_ok();
221 ctl_y_iter += ctl.base.h + 1;
222 con->sbuffer_lines++;
225 con->gui.
focus_idc = RETROCON_IDC_TEXTBOX;
227 retval = retrocon_add_command( con,
"PRINT", retrocon_cmd_print, NULL );
228 maug_cleanup_if_not_ok();
229 retval = retrocon_add_command( con,
"QUIT", retrocon_cmd_quit, NULL );
230 maug_cleanup_if_not_ok();
238 struct RETROCON* con,
const char* cmd, retrocon_cb cb,
void* cb_data
242 debug_printf( RETROCON_TRACE_LVL,
"adding console command: %s", cmd );
244 maug_cleanup_if_ge_overflow( con->callbacks_sz + 1, RETROCON_CB_SZ_MAX );
247 con->callback_names[con->callbacks_sz], cmd, RETROCON_CB_NAME_SZ_MAX );
249 con->callbacks[con->callbacks_sz] = cb;
251 con->callback_data[con->callbacks_sz] = cb_data;
263 char sbuffer_shift[RETROCON_LBUFFER_SZ_MAX + 1] = { 0 };
270 for( i = con->sbuffer_lines - 1 ; 0 < i ; i-- ) {
271 debug_printf( RETROCON_TRACE_LVL,
272 "copying sbuffer line " SIZE_T_FMT
" to " SIZE_T_FMT
"...",
274 maug_mzero( sbuffer_shift, RETROCON_LBUFFER_SZ_MAX + 1 );
275 retval = retrogui_get_ctl_text(
276 &(con->gui), RETROCON_IDC_CON_BASE + i - 1,
277 sbuffer_shift, RETROCON_LBUFFER_SZ_MAX );
278 maug_cleanup_if_not_ok();
279 retval = retrogui_set_ctl_text(
280 &(con->gui), RETROCON_IDC_CON_BASE + i,
281 RETROCON_LBUFFER_SZ_MAX, sbuffer_shift );
282 maug_cleanup_if_not_ok();
286 retval = retrogui_set_ctl_text(
287 &(con->gui), RETROCON_IDC_CON_BASE,
288 RETROCON_LBUFFER_SZ_MAX, line );
289 maug_cleanup_if_not_ok();
299 struct RETROCON* con,
char* line,
size_t line_sz
303 char line_cap[RETROCON_LBUFFER_SZ_MAX + 1];
306 maug_mzero( line_cap, RETROCON_LBUFFER_SZ_MAX + 1 );
307 maug_strncpy( line_cap, line, RETROCON_LBUFFER_SZ_MAX );
308 maug_str_upper( line_cap, line_sz );
311 for( i = 0 ; con->callbacks_sz > i ; i++ ) {
315 con->callback_names[i], line_cap,
316 maug_strlen( con->callback_names[i] ) )
318 retval = con->callbacks[i](
319 con, line, line_sz, con->callback_data[i] );
324 retrocon_print_line( con,
"COMMAND NOT FOUND!" );
334 struct RETROCON* con, RETROFLAT_IN_KEY* p_c,
339 char lbuffer[RETROCON_LBUFFER_SZ_MAX + 1] = { 0 };
341 *p_idc_out = RETROGUI_IDC_NONE;
343 if( *p_c == RETROCON_ACTIVE_KEY ) {
344 debug_printf( RETROCON_TRACE_LVL,
"active key pressed" );
345 if( RETROCON_FLAG_ACTIVE != (RETROCON_FLAG_ACTIVE & (con)->flags) ) {
346 debug_printf( RETROCON_TRACE_LVL,
"opening console..." );
347 (con)->flags |= RETROCON_FLAG_ACTIVE;
350 if( NULL != win_stack ) {
352 &((con)->gui), win_stack,
355 NULL, (con)->gui.x, (con)->gui.y,
356 (con)->gui.w, (con)->gui.h, RETROWIN_FLAG_BORDER_BLUE );
357 maug_cleanup_if_not_ok();
360 debug_printf( RETROCON_TRACE_LVL,
"console open!" );
362 debug_printf( RETROCON_TRACE_LVL,
"closing console..." );
363 con->flags &= ~RETROCON_FLAG_ACTIVE;
365 if( NULL != win_stack ) {
367 debug_printf( RETROCON_TRACE_LVL,
"console closed!" );
371 *p_idc_out = RETROCON_IDC_CLOSE;
375 }
else if( RETROCON_FLAG_ACTIVE != (RETROCON_FLAG_ACTIVE & (con)->flags) ) {
385 if( RETROCON_IDC_TEXTBOX == *p_idc_out ) {
386 retval = retrogui_get_ctl_text(
387 &(con->gui), RETROCON_IDC_TEXTBOX, lbuffer, RETROCON_LBUFFER_SZ_MAX );
388 maug_cleanup_if_not_ok();
389 retval = retrogui_set_ctl_text(
390 &(con->gui), RETROCON_IDC_TEXTBOX, 1,
"" );
391 maug_cleanup_if_not_ok();
393 if( 0 == maug_strlen( lbuffer ) ) {
399 retval = retrocon_exec_line( con, lbuffer, maug_strlen( lbuffer ) );
404 if( !retrocon_debounce( con, c ) ) {
410 case RETROCON_ACTIVE_KEY:
411 if( RETROCON_FLAG_ACTIVE == (RETROCON_FLAG_ACTIVE & con->flags) ) {
412 con->flags &= ~RETROCON_FLAG_ACTIVE;
414 con->flags |= RETROCON_FLAG_ACTIVE;
423 if( 0 < con->lbuffer_sz ) {
425 con->lbuffer[con->lbuffer_sz] =
'\0';
431 if( 0 == con->lbuffer_sz ) {
437 retval = retrocon_exec_line( con, con->lbuffer, con->lbuffer_sz );
439 con->lbuffer[con->lbuffer_sz] =
'\0';
443 c = retroflat_vk_to_ascii(
444 c, input_evt->key_flags | RETROFLAT_INPUT_FORCE_UPPER );
447 RETROCON_FLAG_ACTIVE == (RETROCON_FLAG_ACTIVE & con->flags) &&
450 con->lbuffer[con->lbuffer_sz++] = c;
451 con->lbuffer[con->lbuffer_sz] =
'\0';
465 struct RETROCON* con, retroflat_blit_t* gui_bmp
469 if( RETROCON_FLAG_ACTIVE != (RETROCON_FLAG_ACTIVE & (con)->flags) ) {
473 (con)->gui.draw_bmp = (gui_bmp);
476 retrogui_redraw_ctls( &((con)->gui) );
485void retrocon_shutdown(
struct RETROCON* con ) {
486#ifndef RETROGXC_PRESENT
487 retrofont_free( &(con->gui.
font.handle) );
MERROR_RETVAL retrocon_input(struct RETROCON *con, RETROFLAT_IN_KEY *p_c, struct RETROFLAT_INPUT *input_evt, retrogui_idc_t *p_idc_out, struct MDATA_VECTOR *win_stack)
Process input from retroflat_poll_input() and apply it to the console, if open.
uint16_t MERROR_RETVAL
Return type indicating function returns a value from this list.
Definition: merror.h:28
int8_t RETROFLAT_COLOR
Defines an index in the platform-specific color-table.
Definition: retroflt.h:328
retrogui_idc_t retrogui_poll_ctls(struct RETROGUI *gui, RETROFLAT_IN_KEY *p_input, struct RETROFLAT_INPUT *input_evt)
Poll for the last clicked control and maintain listboxes and menus.
MERROR_RETVAL retrogui_set_font(struct RETROGUI *gui, const maug_path font_path)
Load the RetroFont API for the given RETROGUI to draw its controls with. Use RetroGXCache API if avai...
MERROR_RETVAL retrogui_destroy(struct RETROGUI *gui)
Free memory held by a RETROGUI controller internally and clean up any subordinate controls.
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
MERROR_RETVAL retrowin_destroy_win(struct MDATA_VECTOR *win_stack, retrogui_idc_t idc)
Destroy the given window's resources and remove it from the window stack.
ssize_t retrowin_push_win(struct RETROGUI *gui, struct MDATA_VECTOR *win_stack, retrogui_idc_t idc, const maug_path font_filename, retroflat_pxxy_t x, retroflat_pxxy_t y, retroflat_pxxy_t w, retroflat_pxxy_t h, uint8_t flags)
Create a new window on the given win_stack.
A vector of uniformly-sized objects, stored contiguously.
Definition: mdata.h:108
Definition: retrocon.h:84
Definition: retrogui.h:468
#define RETROGUI_FLAGS_DIRTY
RETROGUI::flags indicating controls should be redrawn.
Definition: retrogui.h:263
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