Annotation of qemu/roms/ipxe/src/hci/mucurses/slk.c, revision 1.1

1.1     ! root        1: #include <curses.h>
        !             2: #include <stddef.h>
        !             3: #include <stdlib.h>
        !             4: #include <string.h>
        !             5: #include <assert.h>
        !             6: #include "mucurses.h"
        !             7: #include "cursor.h"
        !             8: 
        !             9: /** @file
        !            10:  *
        !            11:  * Soft label key functions
        !            12:  */
        !            13: 
        !            14: #define MIN_SPACE_SIZE 2
        !            15: 
        !            16: #define SLK_MAX_LABEL_LEN 8
        !            17: 
        !            18: #define SLK_MAX_NUM_LABELS 12
        !            19: 
        !            20: #define SLK_MAX_NUM_SPACES 2
        !            21: 
        !            22: struct _softlabel {
        !            23:        // label string
        !            24:        char label[SLK_MAX_LABEL_LEN];
        !            25:        /* Format of soft label 
        !            26:           0: left justify
        !            27:           1: centre justify
        !            28:           2: right justify
        !            29:         */
        !            30:        unsigned int fmt;
        !            31: };
        !            32: 
        !            33: struct _softlabelkeys {
        !            34:        struct _softlabel fkeys[SLK_MAX_NUM_LABELS];
        !            35:        attr_t attrs;
        !            36:        /* Soft label layout format
        !            37:           0: 3-2-3
        !            38:           1: 4-4
        !            39:           2: 4-4-4
        !            40:           3: 4-4-4 with index line
        !            41:        */
        !            42:        unsigned int fmt;
        !            43:        unsigned int max_label_len;
        !            44:        unsigned int maj_space_len;
        !            45:        unsigned int num_labels;
        !            46:        unsigned int num_spaces;
        !            47:        unsigned int spaces[SLK_MAX_NUM_SPACES];
        !            48:        struct cursor_pos saved_cursor;
        !            49:        attr_t saved_attrs;
        !            50:        short saved_pair;
        !            51: };
        !            52: 
        !            53: static struct _softlabelkeys *slks;
        !            54: 
        !            55: /*
        !            56:   I either need to break the primitives here, or write a collection of
        !            57:   functions specifically for SLKs that directly access the screen
        !            58:   functions - since this technically isn't part of stdscr, I think
        !            59:   this should be ok...
        !            60:  */
        !            61: 
        !            62: static void _enter_slk ( void ) {
        !            63:        _store_curs_pos ( stdscr, &slks->saved_cursor );
        !            64:        wattr_get ( stdscr, &slks->saved_attrs, &slks->saved_pair, NULL );
        !            65:        LINES++;
        !            66:        wmove ( stdscr, LINES, 0 );
        !            67:        wattrset ( stdscr, slks->attrs );
        !            68: }
        !            69: 
        !            70: static void _leave_slk ( void ) {
        !            71:        LINES--;
        !            72:        wattr_set ( stdscr, slks->saved_attrs, slks->saved_pair, NULL );
        !            73:        _restore_curs_pos ( stdscr, &slks->saved_cursor );
        !            74: }
        !            75: 
        !            76: static void _print_label ( struct _softlabel sl ) {
        !            77:        int space_ch;
        !            78:        char str[SLK_MAX_LABEL_LEN + 1];
        !            79: 
        !            80:        assert ( slks->max_label_len <= SLK_MAX_LABEL_LEN );
        !            81:        space_ch = ' ';
        !            82: 
        !            83:        // protect against gaps in the soft label keys array
        !            84:        if ( sl.label == NULL ) {
        !            85:                memset( str, space_ch, (size_t)(slks->max_label_len) );
        !            86:        } else {
        !            87:                /* we need to pad the label with varying amounts of leading
        !            88:                   pad depending on the format of the label */
        !            89:                if ( sl.fmt == 1 ) {
        !            90:                        memset( str, space_ch, 
        !            91:                                (size_t)(slks->max_label_len 
        !            92:                                         - strlen(sl.label)) / 2 );
        !            93:                }
        !            94:                if ( sl.fmt == 2 ) {
        !            95:                        memset( str, space_ch,
        !            96:                                (size_t)(slks->max_label_len 
        !            97:                                         - strlen(sl.label)) );
        !            98:                }
        !            99:                strcat(str,sl.label);
        !           100:                
        !           101:                // post-padding
        !           102:                memset(str+strlen(str), space_ch,
        !           103:                       (size_t)(slks->max_label_len - strlen(str)) );
        !           104:        }
        !           105: 
        !           106:        // print the formatted label
        !           107:        _wputstr ( stdscr, str, NOWRAP, slks->max_label_len );
        !           108: }
        !           109: 
        !           110: /**
        !           111:  * Return the attribute used for the soft function keys
        !           112:  *
        !           113:  * @ret attrs  the current attributes of the soft function keys
        !           114:  */
        !           115: attr_t slk_attr ( void ) {
        !           116:        return ( slks == NULL ? 0 : slks->attrs );
        !           117: }
        !           118: 
        !           119: /**
        !           120:  * Turn off soft function key attributes
        !           121:  *
        !           122:  * @v attrs    attribute bit mask
        !           123:  * @ret rc     return status code
        !           124:  */
        !           125: int slk_attroff ( const chtype attrs ) {
        !           126:        if ( slks == NULL ) 
        !           127:                return ERR;
        !           128:        slks->attrs &= ~( attrs & A_ATTRIBUTES );
        !           129:        return OK;
        !           130: }
        !           131: 
        !           132: /**
        !           133:  * Turn on soft function key attributes
        !           134:  *
        !           135:  * @v attrs    attribute bit mask
        !           136:  * @ret rc     return status code
        !           137:  */
        !           138: int slk_attron ( const chtype attrs ) {
        !           139:        if ( slks == NULL )
        !           140:                return ERR;
        !           141:        slks->attrs |= ( attrs & A_ATTRIBUTES );
        !           142:        return OK;
        !           143: }
        !           144: 
        !           145: /**
        !           146:  * Set soft function key attributes
        !           147:  *
        !           148:  * @v attrs    attribute bit mask
        !           149:  * @ret rc     return status code
        !           150:  */
        !           151: int slk_attrset ( const chtype attrs ) {
        !           152:        if ( slks == NULL ) 
        !           153:                return ERR;
        !           154:        slks->attrs = ( attrs & A_ATTRIBUTES );
        !           155:        return OK;
        !           156: }
        !           157: 
        !           158: /**
        !           159:  * Turn off soft function key attributes
        !           160:  *
        !           161:  * @v attrs    attribute bit mask
        !           162:  * @v *opts    undefined (for future implementation)
        !           163:  * @ret rc     return status code
        !           164:  */
        !           165: int slk_attr_off ( const attr_t attrs, void *opts __unused ) {
        !           166:        return slk_attroff( attrs );
        !           167: }
        !           168: 
        !           169: /**
        !           170:  * Turn on soft function key attributes
        !           171:  *
        !           172:  * @v attrs    attribute bit mask
        !           173:  * @v *opts    undefined (for future implementation)
        !           174:  * @ret rc     return status code
        !           175:  */
        !           176: int slk_attr_on ( attr_t attrs, void *opts __unused ) {
        !           177:        return slk_attron( attrs );
        !           178: }
        !           179: 
        !           180: /**
        !           181:  * Set soft function key attributes
        !           182:  *
        !           183:  * @v attrs                    attribute bit mask
        !           184:  * @v colour_pair_number       colour pair integer
        !           185:  * @v *opts                    undefined (for future implementation)
        !           186:  * @ret rc                     return status code
        !           187:  */
        !           188: int slk_attr_set ( const attr_t attrs, short colour_pair_number,
        !           189:                   void *opts __unused ) {
        !           190:        if ( slks == NULL ) 
        !           191:                return ERR;
        !           192: 
        !           193:        if ( ( unsigned short )colour_pair_number > COLORS )
        !           194:                return ERR;
        !           195: 
        !           196:        slks->attrs = ( (unsigned short)colour_pair_number << CPAIR_SHIFT ) |
        !           197:                ( attrs & A_ATTRIBUTES );
        !           198:        return OK;
        !           199: }
        !           200: 
        !           201: /**
        !           202:  * Clear the soft function key labels from the screen
        !           203:  *
        !           204:  * @ret rc     return status code
        !           205:  */
        !           206: int slk_clear ( void ) {
        !           207:        if ( slks == NULL )
        !           208:                return ERR;
        !           209: 
        !           210:        _enter_slk();
        !           211:        wclrtoeol ( stdscr );
        !           212:        _leave_slk();
        !           213: 
        !           214:        return OK;
        !           215: }
        !           216: 
        !           217: /**
        !           218:  * Set soft label colour pair
        !           219:  */
        !           220: int slk_colour ( short colour_pair_number ) {
        !           221:        if ( slks == NULL ) 
        !           222:                return ERR;
        !           223:        if ( ( unsigned short )colour_pair_number > COLORS )
        !           224:                return ERR;
        !           225: 
        !           226:        slks->attrs = ( (unsigned short)colour_pair_number << CPAIR_SHIFT )
        !           227:                | ( slks->attrs & A_ATTRIBUTES );
        !           228: 
        !           229:        return OK;
        !           230: }
        !           231: 
        !           232: /**
        !           233:  * Initialise the soft function keys
        !           234:  *
        !           235:  * @v fmt      format of keys
        !           236:  * @ret rc     return status code
        !           237:  */
        !           238: int slk_init ( int fmt ) {
        !           239:        unsigned short nmaj, nmin, nblocks, available_width;
        !           240: 
        !           241:        if ( (unsigned)fmt > 3 ) {
        !           242:                return ERR;
        !           243:        }
        !           244: 
        !           245:        /* There seems to be no API call to free this data structure... */
        !           246:        if ( ! slks )
        !           247:                slks = calloc(1,sizeof(*slks));
        !           248:        if ( ! slks )
        !           249:                return ERR;
        !           250: 
        !           251:        slks->attrs = A_DEFAULT;
        !           252:        slks->fmt = fmt;
        !           253:        switch(fmt) {
        !           254:        case 0:
        !           255:                nblocks = 8; nmaj = 2; nmin = 5;
        !           256:                slks->spaces[0] = 2; slks->spaces[1] = 4;
        !           257:                break;
        !           258:        case 1:
        !           259:                nblocks = 8; nmaj = 1; nmin = 6;
        !           260:                slks->spaces[0] = 3;
        !           261:                break;
        !           262:        case 2:
        !           263:                // same allocations as format 3
        !           264:        case 3:
        !           265:                nblocks = 12; nmaj = 2; nmin = 9;
        !           266:                slks->spaces[0] = 3; slks->spaces[1] = 7;
        !           267:                break;
        !           268:        default:
        !           269:                nblocks = 0; nmaj = 0; nmin = 0;
        !           270:                break;
        !           271:        }
        !           272: 
        !           273:        // determine maximum label length and major space size
        !           274:        available_width = COLS - ( ( MIN_SPACE_SIZE * nmaj ) + nmin );
        !           275:        slks->max_label_len = available_width / nblocks;
        !           276:        slks->maj_space_len = MIN_SPACE_SIZE + 
        !           277:                ( available_width % nblocks ) / nmaj;
        !           278:        slks->num_spaces = nmaj;
        !           279:        slks->num_labels = nblocks;
        !           280: 
        !           281:        // strip a line from the screen
        !           282:        LINES -= 1;
        !           283: 
        !           284:        return OK;
        !           285: }
        !           286: 
        !           287: /**
        !           288:  * Return the label for the specified soft key
        !           289:  *
        !           290:  * @v labnum   soft key identifier
        !           291:  * @ret label  return label
        !           292:  */
        !           293: char* slk_label ( int labnum ) {
        !           294:        if ( slks == NULL ) 
        !           295:                return NULL;
        !           296: 
        !           297:        return slks->fkeys[labnum].label;
        !           298: }
        !           299: 
        !           300: /**
        !           301:  * Restore soft function key labels to the screen
        !           302:  *
        !           303:  * @ret rc     return status code
        !           304:  */
        !           305: int slk_restore ( void ) {
        !           306:        unsigned int i, j, pos_x,
        !           307:                *next_space, *last_space;
        !           308:        chtype space_ch;
        !           309: 
        !           310:        if ( slks == NULL )
        !           311:                return ERR;
        !           312: 
        !           313:        pos_x = 0;
        !           314: 
        !           315:        _enter_slk();
        !           316: 
        !           317:        space_ch = (chtype)' ' | slks->attrs;
        !           318:        next_space = &(slks->spaces[0]);
        !           319:        last_space = &(slks->spaces[slks->num_spaces-1]);
        !           320: 
        !           321:        for ( i = 0; i < slks->num_labels ; i++ ) {
        !           322:                _print_label( slks->fkeys[i] );
        !           323:                pos_x += slks->max_label_len;
        !           324: 
        !           325:                if ( i == *next_space ) {
        !           326:                        for ( j = 0; j < slks->maj_space_len; j++, pos_x++ )
        !           327:                                _wputch ( stdscr, space_ch, NOWRAP );
        !           328:                        if ( next_space < last_space )
        !           329:                                next_space++;
        !           330:                } else {
        !           331:                        if ( pos_x < COLS )
        !           332:                                _wputch ( stdscr, space_ch, NOWRAP );
        !           333:                        pos_x++;
        !           334:                }
        !           335:        }
        !           336: 
        !           337:        _leave_slk();
        !           338: 
        !           339:        return OK;
        !           340: }
        !           341: 
        !           342: /**
        !           343:  * Configure specified soft key
        !           344:  *
        !           345:  * @v labnum   soft label position to configure
        !           346:  * @v *label   string to use as soft key label
        !           347:  * @v fmt      justification format of label
        !           348:  * @ret rc     return status code
        !           349:  */
        !           350: int slk_set ( int labnum, const char *label, int fmt ) {
        !           351:        if ( slks == NULL ) 
        !           352:                return ERR;
        !           353:        if ( (unsigned short)labnum >= slks->num_labels )
        !           354:                return ERR;
        !           355:        if ( (unsigned short)fmt >= 3 )
        !           356:                return ERR;
        !           357: 
        !           358:        strncpy(slks->fkeys[labnum].label, label,
        !           359:                sizeof(slks->fkeys[labnum].label));
        !           360:        slks->fkeys[labnum].fmt = fmt;
        !           361: 
        !           362:        return OK;
        !           363: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.