From 199b89e4dc0b781310f40d0e5743bf355077f9ab Mon Sep 17 00:00:00 2001 From: inmarket Date: Fri, 17 Jan 2014 18:36:28 +1000 Subject: Updates to console history. This now works well. --- include/gwin/console.h | 24 ++++++++++++------------ include/gwin/options.h | 46 +++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 53 insertions(+), 17 deletions(-) (limited to 'include') diff --git a/include/gwin/console.h b/include/gwin/console.h index ec108984..252b627e 100644 --- a/include/gwin/console.h +++ b/include/gwin/console.h @@ -32,10 +32,9 @@ typedef struct GConsoleObject { coord_t cx, cy; // Cursor position #if GWIN_CONSOLE_USE_HISTORY - char* buffer; // buffer to store console content - uint16_t last_char; // the last rendered character - size_t size; // size of buffer - bool_t store; // shall PutChar() store into buffer + char * buffer; // buffer to store console content + size_t bufsize; // size of buffer + size_t bufpos; // the position of the next char #endif #if GFX_USE_OS_CHIBIOS && GWIN_CONSOLE_USE_BASESTREAM @@ -91,18 +90,19 @@ GHandle gwinGConsoleCreate(GDisplay *g, GConsoleObject *gc, const GWindowInit *p #if GWIN_CONSOLE_USE_HISTORY /** - * @brief Assing a buffer to keep track of the content while the widget is invisible. + * @brief Assign a buffer to keep track of the content while the widget is invisible. * @pre GWIN_CONSOLE_USE_HISTORY must be set to TRUE in your gfxconf.h * * @param[in] gh The window handle (must be a console window) - * @param[in] buffer The pointer of the buffer that shall be used. Buffer will be - * dynamically allocated when this is NULL. - * @param[in] size Size of the buffer that has been passed. If buffer is NULL, this - * will be the size of the dynamically allocated buffer. + * @param[in] onoff If TRUE a buffer is allocated to maintain console text + * when the console is obscured or invisible. If FALSE, then + * any existing buffer is deallocated. + * @note When the history buffer is turned on, scrolling is implemented using the + * history buffer. * - * @return TRUE on success - */ - bool_t gwinConsoleSetBuffer(GHandle gh, void* buffer, size_t size); + * @return TRUE if the history buffer is now turned on. + */ + bool_t gwinConsoleSetBuffer(GHandle gh, bool_t onoff); #endif /** diff --git a/include/gwin/options.h b/include/gwin/options.h index e6d2a81e..882db572 100644 --- a/include/gwin/options.h +++ b/include/gwin/options.h @@ -106,16 +106,52 @@ #define GWIN_BUTTON_LAZY_RELEASE FALSE #endif /** - * @brief Should the content of the console be logged or not - * @details If this feature is enable, the content of the console will be stored. - * Every content that gets printed to the console while being invisible - * will be rendered once the console is visible again. All previous written - * content will be restored too. + * @brief Should the content of the console be saved for redrawing. * @details Defaults to FALSE + * @details If this feature is enabled, the contents of the console will be saved + * as it is written. If a redraw is required it will be redrawn from the + * history. Scrolling will also use the history buffer if it is turned on. + * @note Using this option allocates the amount of memory to store the + * history based on the minimum character width in the current font + * at the time the history is turned on. Using a fixed width font is a good + * idea to minimize memory usage. + * @note If you change the size of the window or you change the font being displayed + * you should turn off the history and then turn it back on in order to get + * a new buffer of the correct size for the window/font combination. Strange + * redrawing and scrolling effects can occur if the buffer is too small to + * save a complete screen of data. Note the system tries to optimize storage + * so this may only be evident in very limited situations eg with a console + * with many characters in it. + * @note @p gwinConsoleSetBuffer() can be used to turn the history buffer off and on. */ #ifndef GWIN_CONSOLE_USE_HISTORY #define GWIN_CONSOLE_USE_HISTORY FALSE #endif + /** + * @brief Use font width averaging for the history buffer allocation. + * @details Defaults to FALSE + * @details If this feature is enabled, the width one third of the way between + * the font's character width minimum and maximum will be used instead + * of the font's minimum width. + * @note This option reduces the memory allocation for a variable width font's + * history buffer. Note that strange + * redrawing and scrolling effects can occur if the buffer is too small to + * save a complete screen of data. The system tries to optimize storage + * so this may only be evident in very limited situations eg with a console + * with many characters in it. + */ + #ifndef GWIN_CONSOLE_HISTORY_AVERAGING + #define GWIN_CONSOLE_HISTORY_AVERAGING FALSE + #endif + /** + * @brief Should the history be turned on for all console windows when they are first created. + * @details Defaults to FALSE + * @note @p gwinConsoleSetBuffer() can be used to turn the history buffer off and on at + * any time. + */ + #ifndef GWIN_CONSOLE_HISTORY_ATCREATE + #define GWIN_CONSOLE_HISTORY_ATCREATE FALSE + #endif /** * @brief Console Windows need floating point support in @p gwinPrintf * @details Defaults to FALSE -- cgit v1.2.3