mirror of https://github.com/ipxe/ipxe.git
- proper layout formatted soft label array, with justification formatted labels
- some minor preventativespull/1/head
parent
811df504a5
commit
890dc758e8
|
@ -23,7 +23,7 @@ struct _softlabel {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _softlabelkeys {
|
struct _softlabelkeys {
|
||||||
struct _softlabel fkeys[12];
|
struct _softlabel *fkeys;
|
||||||
attr_t attrs;
|
attr_t attrs;
|
||||||
/* Soft label layout format
|
/* Soft label layout format
|
||||||
0: 3-2-3
|
0: 3-2-3
|
||||||
|
@ -41,6 +41,8 @@ struct _softlabelkeys {
|
||||||
|
|
||||||
struct _softlabelkeys *slks;
|
struct _softlabelkeys *slks;
|
||||||
|
|
||||||
|
static unsigned short pos_x;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
I either need to break the primitives here, or write a collection of
|
I either need to break the primitives here, or write a collection of
|
||||||
functions specifically for SLKs that directly access the screen
|
functions specifically for SLKs that directly access the screen
|
||||||
|
@ -52,6 +54,43 @@ static void _movetoslk ( void ) {
|
||||||
stdscr->scr->movetoyx( stdscr->scr, LINES, 0 );
|
stdscr->scr->movetoyx( stdscr->scr, LINES, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _print_label ( struct _softlabel sl ) {
|
||||||
|
unsigned short i = 0;
|
||||||
|
int space_ch;
|
||||||
|
char *str = malloc((size_t)slks->max_label_len);
|
||||||
|
|
||||||
|
space_ch = ' ';
|
||||||
|
|
||||||
|
// protect against gaps in the soft label keys array
|
||||||
|
if ( sl.label == NULL ) {
|
||||||
|
memset( str, space_ch, (size_t)(slks->max_label_len) );
|
||||||
|
} else {
|
||||||
|
/* we need to pad the label with varying amounts of leading
|
||||||
|
pad depending on the format of the label */
|
||||||
|
if ( sl.fmt == 1 ) {
|
||||||
|
memset( str, space_ch,
|
||||||
|
(size_t)(slks->max_label_len
|
||||||
|
- strlen(sl.label)) / 2 );
|
||||||
|
}
|
||||||
|
if ( sl.fmt == 2 ) {
|
||||||
|
memset( str, space_ch,
|
||||||
|
(size_t)(slks->max_label_len
|
||||||
|
- strlen(sl.label)) );
|
||||||
|
}
|
||||||
|
strcat(str,sl.label);
|
||||||
|
|
||||||
|
// post-padding
|
||||||
|
memset(str+strlen(str), space_ch,
|
||||||
|
(size_t)(slks->max_label_len - strlen(str)) );
|
||||||
|
str[slks->max_label_len] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
// print the formatted label
|
||||||
|
for ( ; i < slks->max_label_len; i++ ) {
|
||||||
|
stdscr->scr->putc( stdscr->scr, (chtype)str[i] | slks->attrs );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the attribute used for the soft function keys
|
* Return the attribute used for the soft function keys
|
||||||
*
|
*
|
||||||
|
@ -149,9 +188,18 @@ int slk_attr_set ( const attr_t attrs, short colour_pair_number,
|
||||||
* @ret rc return status code
|
* @ret rc return status code
|
||||||
*/
|
*/
|
||||||
int slk_clear ( void ) {
|
int slk_clear ( void ) {
|
||||||
|
chtype space_ch;
|
||||||
if ( slks == NULL )
|
if ( slks == NULL )
|
||||||
return ERR;
|
return ERR;
|
||||||
return 0;
|
|
||||||
|
_movetoslk();
|
||||||
|
pos_x = 0;
|
||||||
|
space_ch = (chtype)' ' | slks->attrs;
|
||||||
|
|
||||||
|
for ( ; pos_x < COLS; pos_x++ )
|
||||||
|
stdscr->scr->putc( stdscr->scr, space_ch );
|
||||||
|
|
||||||
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -211,8 +259,11 @@ int slk_init ( int fmt ) {
|
||||||
// determine maximum label length and major space size
|
// determine maximum label length and major space size
|
||||||
available_width = COLS - ( ( MIN_SPACE_SIZE * nmaj ) + nmin );
|
available_width = COLS - ( ( MIN_SPACE_SIZE * nmaj ) + nmin );
|
||||||
slks->max_label_len = available_width / nblocks;
|
slks->max_label_len = available_width / nblocks;
|
||||||
slks->maj_space_len = ( available_width % nblocks ) / nmaj;
|
slks->maj_space_len = MIN_SPACE_SIZE +
|
||||||
|
( available_width % nblocks ) / nmaj;
|
||||||
slks->num_spaces = nmaj;
|
slks->num_spaces = nmaj;
|
||||||
|
slks->num_labels = nblocks;
|
||||||
|
slks->fkeys = calloc( nblocks, sizeof(struct _softlabel) );
|
||||||
|
|
||||||
// strip a line from the screen
|
// strip a line from the screen
|
||||||
LINES -= 1;
|
LINES -= 1;
|
||||||
|
@ -242,28 +293,31 @@ int slk_restore ( void ) {
|
||||||
unsigned short i, j,
|
unsigned short i, j,
|
||||||
*next_space, *last_space;
|
*next_space, *last_space;
|
||||||
chtype space_ch;
|
chtype space_ch;
|
||||||
char c;
|
|
||||||
|
|
||||||
if ( slks == NULL )
|
if ( slks == NULL )
|
||||||
return ERR;
|
return ERR;
|
||||||
|
|
||||||
|
pos_x = 0;
|
||||||
|
|
||||||
_movetoslk();
|
_movetoslk();
|
||||||
|
|
||||||
space_ch = (int)' ' | slks->attrs;
|
space_ch = (chtype)' ' | slks->attrs;
|
||||||
next_space = &(slks->spaces[0]);
|
next_space = &(slks->spaces[0]);
|
||||||
last_space = &(slks->spaces[slks->num_spaces-1]);
|
last_space = &(slks->spaces[slks->num_spaces-1]);
|
||||||
|
|
||||||
for ( i = 0; i < slks->num_labels ; i++ ) {
|
for ( i = 0; i < slks->num_labels ; i++ ) {
|
||||||
while ( ( c = *(slks->fkeys[i].label++) ) != '\0' ) {
|
_print_label( slks->fkeys[i] );
|
||||||
stdscr->scr->putc( stdscr->scr, (int)c | slks->attrs );
|
pos_x += slks->max_label_len;
|
||||||
}
|
|
||||||
if ( i == *next_space ) {
|
if ( i == *next_space ) {
|
||||||
for ( j = 0; j < slks->maj_space_len; j++ )
|
for ( j = 0; j < slks->maj_space_len; j++, pos_x++ )
|
||||||
stdscr->scr->putc( stdscr->scr, space_ch );
|
stdscr->scr->putc( stdscr->scr, space_ch );
|
||||||
if ( next_space < last_space )
|
if ( next_space < last_space )
|
||||||
next_space++;
|
next_space++;
|
||||||
} else {
|
} else {
|
||||||
stdscr->scr->putc( stdscr->scr, space_ch );
|
if ( pos_x < COLS )
|
||||||
|
stdscr->scr->putc( stdscr->scr, space_ch );
|
||||||
|
pos_x++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -281,14 +335,13 @@ int slk_restore ( void ) {
|
||||||
int slk_set ( int labnum, const char *label, int fmt ) {
|
int slk_set ( int labnum, const char *label, int fmt ) {
|
||||||
if ( slks == NULL )
|
if ( slks == NULL )
|
||||||
return ERR;
|
return ERR;
|
||||||
if ( (unsigned short)labnum > 12 )
|
if ( (unsigned short)labnum >= slks->num_labels )
|
||||||
return ERR;
|
return ERR;
|
||||||
if ( (unsigned short)fmt >= 3 )
|
if ( (unsigned short)fmt >= 3 )
|
||||||
return ERR;
|
return ERR;
|
||||||
if ( strlen(label) > slks->max_label_len )
|
|
||||||
return ERR;
|
|
||||||
|
|
||||||
strcpy( slks->fkeys[labnum].label, label );
|
slks->fkeys[labnum].label = malloc((size_t)slks->max_label_len + 1);
|
||||||
|
strncpy(slks->fkeys[labnum].label, label, (size_t)slks->max_label_len);
|
||||||
slks->fkeys[labnum].fmt = fmt;
|
slks->fkeys[labnum].fmt = fmt;
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
|
|
Loading…
Reference in New Issue