Provide an edit history to allow caller to efficiently update display.
This commit is contained in:
parent
abbfbd678d
commit
66007fa448
|
@ -35,7 +35,7 @@
|
||||||
*/
|
*/
|
||||||
static void insert_delete ( struct edit_string *string, size_t delete_len,
|
static void insert_delete ( struct edit_string *string, size_t delete_len,
|
||||||
const char *insert_text ) {
|
const char *insert_text ) {
|
||||||
size_t old_len, max_delete_len, insert_len, max_insert_len;
|
size_t old_len, max_delete_len, insert_len, max_insert_len, new_len;
|
||||||
|
|
||||||
/* Calculate lengths */
|
/* Calculate lengths */
|
||||||
old_len = strlen ( string->buf );
|
old_len = strlen ( string->buf );
|
||||||
|
@ -47,6 +47,11 @@ static void insert_delete ( struct edit_string *string, size_t delete_len,
|
||||||
max_insert_len = ( ( string->len - 1 ) - ( old_len - delete_len ) );
|
max_insert_len = ( ( string->len - 1 ) - ( old_len - delete_len ) );
|
||||||
if ( insert_len > max_insert_len )
|
if ( insert_len > max_insert_len )
|
||||||
insert_len = max_insert_len;
|
insert_len = max_insert_len;
|
||||||
|
new_len = ( old_len - delete_len + insert_len );
|
||||||
|
|
||||||
|
/* Fill in edit history */
|
||||||
|
string->mod_start = string->cursor;
|
||||||
|
string->mod_end = ( ( new_len > old_len ) ? new_len : old_len );
|
||||||
|
|
||||||
/* Move data following the cursor */
|
/* Move data following the cursor */
|
||||||
memmove ( ( string->buf + string->cursor + insert_len ),
|
memmove ( ( string->buf + string->cursor + insert_len ),
|
||||||
|
@ -113,10 +118,19 @@ static void kill_eol ( struct edit_string *string ) {
|
||||||
* zero, otherwise it will return the original key.
|
* zero, otherwise it will return the original key.
|
||||||
*
|
*
|
||||||
* This function does not update the display in any way.
|
* This function does not update the display in any way.
|
||||||
|
*
|
||||||
|
* The string's edit history will be updated to allow the caller to
|
||||||
|
* efficiently bring the display into sync with the string content.
|
||||||
*/
|
*/
|
||||||
int edit_string ( struct edit_string *string, int key ) {
|
int edit_string ( struct edit_string *string, int key ) {
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
|
||||||
|
/* Prepare edit history */
|
||||||
|
string->last_cursor = string->cursor;
|
||||||
|
string->mod_start = string->cursor;
|
||||||
|
string->mod_end = string->cursor;
|
||||||
|
|
||||||
|
/* Interpret key */
|
||||||
if ( ( key >= 0x20 ) && ( key <= 0x7e ) ) {
|
if ( ( key >= 0x20 ) && ( key <= 0x7e ) ) {
|
||||||
/* Printable character; insert at current position */
|
/* Printable character; insert at current position */
|
||||||
insert_character ( string, key );
|
insert_character ( string, key );
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef _EDITSTRING_H
|
#ifndef _GPXE_EDITSTRING_H
|
||||||
#define _EDITSTRING_H
|
#define _GPXE_EDITSTRING_H
|
||||||
|
|
||||||
/** @file
|
/** @file
|
||||||
*
|
*
|
||||||
|
@ -15,8 +15,17 @@ struct edit_string {
|
||||||
size_t len;
|
size_t len;
|
||||||
/** Cursor position */
|
/** Cursor position */
|
||||||
unsigned int cursor;
|
unsigned int cursor;
|
||||||
|
|
||||||
|
/* The following items are the edit history */
|
||||||
|
|
||||||
|
/** Last cursor position */
|
||||||
|
unsigned int last_cursor;
|
||||||
|
/** Start of modified portion of string */
|
||||||
|
unsigned int mod_start;
|
||||||
|
/** End of modified portion of string */
|
||||||
|
unsigned int mod_end;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int edit_string ( struct edit_string *string, int key );
|
extern int edit_string ( struct edit_string *string, int key );
|
||||||
|
|
||||||
#endif /* _EDITSTRING_H */
|
#endif /* _GPXE_EDITSTRING_H */
|
||||||
|
|
Reference in New Issue