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#ifdef RETROGXC_PRESENT 
  185   con->gui.font_idx = retrogxc_load_font( font_name, 0, 33, 93 );
 
  189   maug_cleanup_if_not_ok();
 
  191   con->sbuffer_color = RETROFLAT_COLOR_DARKBLUE;
 
  192   con->lbuffer_color = RETROFLAT_COLOR_BLACK;
 
  199         &ctl, RETROGUI_CTL_TYPE_TEXTBOX, RETROCON_IDC_TEXTBOX );
 
  203      ctl.base.w = con->gui.w - 10;
 
  205      ctl.base.fg_color = RETROFLAT_COLOR_BLACK;
 
  207      retval = retrogui_push_ctl( &(con->gui), &ctl );
 
  208      maug_cleanup_if_not_ok();
 
  210      ctl_y_iter = ctl.base.y + ctl.base.h + 1;
 
  211      while( h - 5 > ctl_y_iter + 8 + 1 ) {
 
  213            &ctl, RETROGUI_CTL_TYPE_LABEL,
 
  214            RETROCON_IDC_CON_BASE + con->sbuffer_lines );
 
  217         ctl.base.y = ctl_y_iter;
 
  218         ctl.base.w = con->gui.w - 10;
 
  220         ctl.base.fg_color = RETROFLAT_COLOR_DARKGRAY;
 
  221         ctl.LABEL.label = 
"xxxxxx";
 
  223         retval = retrogui_push_ctl( &(con->gui), &ctl );
 
  224         maug_cleanup_if_not_ok();
 
  226         ctl_y_iter += ctl.base.h + 1;
 
  227         con->sbuffer_lines++;
 
  230   con->gui.
focus = RETROCON_IDC_TEXTBOX;
 
  232   retval = retrocon_add_command( con, 
"PRINT", retrocon_cmd_print, NULL );
 
  233   maug_cleanup_if_not_ok();
 
  234   retval = retrocon_add_command( con, 
"QUIT", retrocon_cmd_quit, NULL );
 
  235   maug_cleanup_if_not_ok();
 
  243   struct RETROCON* con, 
const char* cmd, retrocon_cb cb, 
void* cb_data
 
  247   debug_printf( RETROCON_TRACE_LVL, 
"adding console command: %s", cmd );
 
  249   maug_cleanup_if_ge_overflow( con->callbacks_sz + 1, RETROCON_CB_SZ_MAX );
 
  252      con->callback_names[con->callbacks_sz], cmd, RETROCON_CB_NAME_SZ_MAX );
 
  254   con->callbacks[con->callbacks_sz] = cb;
 
  256   con->callback_data[con->callbacks_sz] = cb_data;
 
  268   char sbuffer_shift[RETROCON_LBUFFER_SZ_MAX + 1] = { 0 };
 
  275   for( i = con->sbuffer_lines - 1 ; 0 < i ; i-- ) {
 
  276      debug_printf( RETROCON_TRACE_LVL,
 
  277         "copying sbuffer line " SIZE_T_FMT 
" to " SIZE_T_FMT 
"...",
 
  279      maug_mzero( sbuffer_shift, RETROCON_LBUFFER_SZ_MAX + 1 );
 
  280      retval = retrogui_get_ctl_text(
 
  281         &(con->gui), RETROCON_IDC_CON_BASE + i - 1,
 
  282         sbuffer_shift, RETROCON_LBUFFER_SZ_MAX );
 
  283      retval = retrogui_set_ctl_text(
 
  284         &(con->gui), RETROCON_IDC_CON_BASE + i,
 
  285         RETROCON_LBUFFER_SZ_MAX, sbuffer_shift );
 
  286      maug_cleanup_if_not_ok();
 
  290   retval = retrogui_set_ctl_text(
 
  291      &(con->gui), RETROCON_IDC_CON_BASE,
 
  292      RETROCON_LBUFFER_SZ_MAX, line );
 
  293   maug_cleanup_if_not_ok();
 
  303   struct RETROCON* con, 
char* line, 
size_t line_sz
 
  307   char line_cap[RETROCON_LBUFFER_SZ_MAX + 1];
 
  310   maug_mzero( line_cap, RETROCON_LBUFFER_SZ_MAX + 1 );
 
  311   maug_strncpy( line_cap, line, RETROCON_LBUFFER_SZ_MAX );
 
  312   maug_str_upper( line_cap, line_sz );
 
  315   for( i = 0 ; con->callbacks_sz > i ; i++ ) {
 
  319            con->callback_names[i], line_cap,
 
  320            maug_strlen( con->callback_names[i] ) )
 
  322         retval = con->callbacks[i](
 
  323            con, line, line_sz, con->callback_data[i] );
 
  328   retrocon_print_line( con, 
"COMMAND NOT FOUND!" );
 
  338   struct RETROCON* con, RETROFLAT_IN_KEY* p_c,
 
  343   char lbuffer[RETROCON_LBUFFER_SZ_MAX + 1] = { 0 };
 
  345   *p_idc_out = RETROGUI_IDC_NONE;
 
  347   if( *p_c == RETROCON_ACTIVE_KEY ) {
 
  348      debug_printf( RETROCON_TRACE_LVL, 
"active key pressed" );
 
  349      if( RETROCON_FLAG_ACTIVE != (RETROCON_FLAG_ACTIVE & (con)->flags) ) {
 
  350         debug_printf( RETROCON_TRACE_LVL, 
"opening console..." );
 
  351         (con)->flags |= RETROCON_FLAG_ACTIVE;
 
  354         if( NULL != win_stack ) {
 
  356               &((con)->gui), win_stack,
 
  359               NULL, (con)->gui.x, (con)->gui.y,
 
  360               (con)->gui.w, (con)->gui.h, RETROWIN_FLAG_BORDER_BLUE );
 
  361            maug_cleanup_if_not_ok();
 
  364         debug_printf( RETROCON_TRACE_LVL, 
"console open!" );
 
  366         debug_printf( RETROCON_TRACE_LVL, 
"closing console..." );
 
  367         con->flags &= ~RETROCON_FLAG_ACTIVE;
 
  369         if( NULL != win_stack ) {
 
  371            debug_printf( RETROCON_TRACE_LVL, 
"console closed!" );
 
  374#  if defined( RETROTILE_PRESENT ) && !defined( RETROFLAT_NO_VIEWPORT_REFRESH ) 
  382         *p_idc_out = RETROCON_IDC_CLOSE;
 
  386   } 
else if( RETROCON_FLAG_ACTIVE != (RETROCON_FLAG_ACTIVE & (con)->flags) ) {
 
  396   if( RETROCON_IDC_TEXTBOX == *p_idc_out ) {
 
  397      retval = retrogui_get_ctl_text(
 
  398         &(con->gui), RETROCON_IDC_TEXTBOX, lbuffer, RETROCON_LBUFFER_SZ_MAX );
 
  399      retval = retrogui_set_ctl_text(
 
  400         &(con->gui), RETROCON_IDC_TEXTBOX, 1, 
"" );
 
  401      maug_cleanup_if_not_ok();
 
  403      if( 0 == maug_strlen( lbuffer ) ) {
 
  409      retval = retrocon_exec_line( con, lbuffer, maug_strlen( lbuffer ) );
 
  414   if( !retrocon_debounce( con, c ) ) {
 
  420   case RETROCON_ACTIVE_KEY:
 
  421      if( RETROCON_FLAG_ACTIVE == (RETROCON_FLAG_ACTIVE & con->flags) ) {
 
  422         con->flags &= ~RETROCON_FLAG_ACTIVE;
 
  424         con->flags |= RETROCON_FLAG_ACTIVE;
 
  433      if( 0 < con->lbuffer_sz ) {
 
  435         con->lbuffer[con->lbuffer_sz] = 
'\0';
 
  441      if( 0 == con->lbuffer_sz ) {
 
  447      retval = retrocon_exec_line( con, con->lbuffer, con->lbuffer_sz );
 
  449      con->lbuffer[con->lbuffer_sz] = 
'\0';
 
  453      c = retroflat_vk_to_ascii(
 
  454         c, input_evt->key_flags | RETROFLAT_INPUT_FORCE_UPPER );
 
  457         RETROCON_FLAG_ACTIVE == (RETROCON_FLAG_ACTIVE & con->flags)  &&
 
  460         con->lbuffer[con->lbuffer_sz++] = c;
 
  461         con->lbuffer[con->lbuffer_sz] = 
'\0';
 
  475   struct RETROCON* con, retroflat_blit_t* gui_bmp
 
  479   if( RETROCON_FLAG_ACTIVE != (RETROCON_FLAG_ACTIVE & (con)->flags) ) {
 
  483   (con)->gui.draw_bmp = (gui_bmp);
 
  486   retrogui_redraw_ctls( &((con)->gui) );
 
  495void retrocon_shutdown( 
struct RETROCON* con ) {
 
  496#ifndef RETROGXC_PRESENT 
  497   retrofont_free( &(con->gui.
font_h) );
 
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:19
int8_t RETROFLAT_COLOR
Defines an index in the platform-specific color-table.
Definition: retroflt.h:325
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_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:292
ssize_t retrowin_push_win(struct RETROGUI *gui, struct MDATA_VECTOR *win_stack, size_t idc, const char *font_filename, size_t x, size_t y, size_t w, size_t h, uint8_t flags)
Create a new window on the given win_stack.
MERROR_RETVAL retrowin_destroy_win(struct MDATA_VECTOR *win_stack, size_t idc)
Destroy the given window's resources and remove it from the window stack.
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.
A vector of uniformly-sized objects, stored contiguously.
Definition: mdata.h:93
Definition: retrocon.h:84
#define retroflat_viewport_screen_h()
Return the height of the viewport in pixels.
Definition: retroflt.h:1418
#define retroflat_viewport_unlock_refresh()
Unlock access to RETROFLAT_VIEWPORT::refresh_grid in memory.
Definition: retroflt.h:1481
#define retroflat_viewport_lock_refresh()
Lock access to RETROFLAT_VIEWPORT::refresh_grid in memory.
Definition: retroflt.h:1471
Definition: retrogui.h:430
#define RETROGUI_FLAGS_DIRTY
RETROGUI::flags indicating controls should be redrawn.
Definition: retrogui.h:248
MAUG_MHANDLE font_h
Font used to draw any attached RETROGUI_CTL.
Definition: retrogui.h:456
retrogui_idc_t focus
Unique identifying index for current highlighted RETROGUI_CTL.
Definition: retrogui.h:440
Definition: retrogui.h:412