Annotation of quake2/client/qmenu.c, revision 1.1.1.1

1.1       root        1: #include <string.h>
                      2: #include <ctype.h>
                      3: 
                      4: #include "client.h"
                      5: #include "qmenu.h"
                      6: 
                      7: static void     Action_DoEnter( menuaction_s *a );
                      8: static void     Action_Draw( menuaction_s *a );
                      9: static void  Menu_DrawStatusBar( const char *string );
                     10: static void     Menulist_DoEnter( menulist_s *l );
                     11: static void     MenuList_Draw( menulist_s *l );
                     12: static void     Separator_Draw( menuseparator_s *s );
                     13: static void     Slider_DoSlide( menuslider_s *s, int dir );
                     14: static void     Slider_Draw( menuslider_s *s );
                     15: static void     SpinControl_DoEnter( menulist_s *s );
                     16: static void     SpinControl_Draw( menulist_s *s );
                     17: static void     SpinControl_DoSlide( menulist_s *s, int dir );
                     18: 
                     19: #define RCOLUMN_OFFSET  16
                     20: #define LCOLUMN_OFFSET -16
                     21: 
                     22: extern refexport_t re;
                     23: extern viddef_t viddef;
                     24: 
                     25: #define VID_WIDTH viddef.width
                     26: #define VID_HEIGHT viddef.height
                     27: 
                     28: #define Draw_Char re.DrawChar
                     29: #define Draw_Fill re.DrawFill
                     30: 
                     31: void Action_DoEnter( menuaction_s *a )
                     32: {
                     33:        if ( a->generic.callback )
                     34:                a->generic.callback( a );
                     35: }
                     36: 
                     37: void Action_Draw( menuaction_s *a )
                     38: {
                     39:        if ( a->generic.flags & QMF_LEFT_JUSTIFY )
                     40:        {
                     41:                if ( a->generic.flags & QMF_GRAYED )
                     42:                        Menu_DrawStringDark( a->generic.x + a->generic.parent->x + LCOLUMN_OFFSET, a->generic.y + a->generic.parent->y, a->generic.name );
                     43:                else
                     44:                        Menu_DrawString( a->generic.x + a->generic.parent->x + LCOLUMN_OFFSET, a->generic.y + a->generic.parent->y, a->generic.name );
                     45:        }
                     46:        else
                     47:        {
                     48:                if ( a->generic.flags & QMF_GRAYED )
                     49:                        Menu_DrawStringR2LDark( a->generic.x + a->generic.parent->x + LCOLUMN_OFFSET, a->generic.y + a->generic.parent->y, a->generic.name );
                     50:                else
                     51:                        Menu_DrawStringR2L( a->generic.x + a->generic.parent->x + LCOLUMN_OFFSET, a->generic.y + a->generic.parent->y, a->generic.name );
                     52:        }
                     53:        if ( a->generic.ownerdraw )
                     54:                a->generic.ownerdraw( a );
                     55: }
                     56: 
                     57: qboolean Field_DoEnter( menufield_s *f )
                     58: {
                     59:        if ( f->generic.callback )
                     60:        {
                     61:                f->generic.callback( f );
                     62:                return true;
                     63:        }
                     64:        return false;
                     65: }
                     66: 
                     67: void Field_Draw( menufield_s *f )
                     68: {
                     69:        int i;
                     70:        char tempbuffer[128]="";
                     71: 
                     72:        if ( f->generic.name )
                     73:                Menu_DrawStringR2LDark( f->generic.x + f->generic.parent->x + LCOLUMN_OFFSET, f->generic.y + f->generic.parent->y, f->generic.name );
                     74: 
                     75:        strncpy( tempbuffer, f->buffer + f->visible_offset, f->visible_length );
                     76: 
                     77:        Draw_Char( f->generic.x + f->generic.parent->x + 16, f->generic.y + f->generic.parent->y - 4, 18 );
                     78:        Draw_Char( f->generic.x + f->generic.parent->x + 16, f->generic.y + f->generic.parent->y + 4, 24 );
                     79: 
                     80:        Draw_Char( f->generic.x + f->generic.parent->x + 24 + f->visible_length * 8, f->generic.y + f->generic.parent->y - 4, 20 );
                     81:        Draw_Char( f->generic.x + f->generic.parent->x + 24 + f->visible_length * 8, f->generic.y + f->generic.parent->y + 4, 26 );
                     82: 
                     83:        for ( i = 0; i < f->visible_length; i++ )
                     84:        {
                     85:                Draw_Char( f->generic.x + f->generic.parent->x + 24 + i * 8, f->generic.y + f->generic.parent->y - 4, 19 );
                     86:                Draw_Char( f->generic.x + f->generic.parent->x + 24 + i * 8, f->generic.y + f->generic.parent->y + 4, 25 );
                     87:        }
                     88: 
                     89:        Menu_DrawString( f->generic.x + f->generic.parent->x + 24, f->generic.y + f->generic.parent->y, tempbuffer );
                     90: 
                     91:        if ( Menu_ItemAtCursor( f->generic.parent ) == f )
                     92:        {
                     93:                int offset;
                     94: 
                     95:                if ( f->visible_offset )
                     96:                        offset = f->visible_length;
                     97:                else
                     98:                        offset = f->cursor;
                     99: 
                    100:                if ( ( ( int ) ( Sys_Milliseconds() / 250 ) ) & 1 )
                    101:                {
                    102:                        Draw_Char( f->generic.x + f->generic.parent->x + ( offset + 2 ) * 8 + 8,
                    103:                                           f->generic.y + f->generic.parent->y,
                    104:                                           11 );
                    105:                }
                    106:                else
                    107:                {
                    108:                        Draw_Char( f->generic.x + f->generic.parent->x + ( offset + 2 ) * 8 + 8,
                    109:                                           f->generic.y + f->generic.parent->y,
                    110:                                           ' ' );
                    111:                }
                    112:        }
                    113: }
                    114: 
                    115: qboolean Field_Key( menufield_s *f, int key )
                    116: {
                    117:        extern int keydown[];
                    118: 
                    119:        switch ( key )
                    120:        {
                    121:        case K_KP_SLASH:
                    122:                key = '/';
                    123:                break;
                    124:        case K_KP_MINUS:
                    125:                key = '-';
                    126:                break;
                    127:        case K_KP_PLUS:
                    128:                key = '+';
                    129:                break;
                    130:        case K_KP_HOME:
                    131:                key = '7';
                    132:                break;
                    133:        case K_KP_UPARROW:
                    134:                key = '8';
                    135:                break;
                    136:        case K_KP_PGUP:
                    137:                key = '9';
                    138:                break;
                    139:        case K_KP_LEFTARROW:
                    140:                key = '4';
                    141:                break;
                    142:        case K_KP_5:
                    143:                key = '5';
                    144:                break;
                    145:        case K_KP_RIGHTARROW:
                    146:                key = '6';
                    147:                break;
                    148:        case K_KP_END:
                    149:                key = '1';
                    150:                break;
                    151:        case K_KP_DOWNARROW:
                    152:                key = '2';
                    153:                break;
                    154:        case K_KP_PGDN:
                    155:                key = '3';
                    156:                break;
                    157:        case K_KP_INS:
                    158:                key = '0';
                    159:                break;
                    160:        case K_KP_DEL:
                    161:                key = '.';
                    162:                break;
                    163:        }
                    164: 
                    165:        if ( key > 127 )
                    166:        {
                    167:                switch ( key )
                    168:                {
                    169:                case K_DEL:
                    170:                default:
                    171:                        return false;
                    172:                }
                    173:        }
                    174: 
                    175:        /*
                    176:        ** support pasting from the clipboard
                    177:        */
                    178:        if ( ( toupper( key ) == 'V' && keydown[K_CTRL] ) ||
                    179:                 ( ( ( key == K_INS ) || ( key == K_KP_INS ) ) && keydown[K_SHIFT] ) )
                    180:        {
                    181:                char *cbd;
                    182:                
                    183:                if ( ( cbd = Sys_GetClipboardData() ) != 0 )
                    184:                {
                    185:                        strtok( cbd, "\n\r\b" );
                    186: 
                    187:                        strncpy( f->buffer, cbd, f->length - 1 );
                    188:                        f->cursor = strlen( f->buffer );
                    189:                        f->visible_offset = f->cursor - f->visible_length;
                    190:                        if ( f->visible_offset < 0 )
                    191:                                f->visible_offset = 0;
                    192: 
                    193:                        free( cbd );
                    194:                }
                    195:                return true;
                    196:        }
                    197: 
                    198:        switch ( key )
                    199:        {
                    200:        case K_KP_LEFTARROW:
                    201:        case K_LEFTARROW:
                    202:        case K_BACKSPACE:
                    203:                if ( f->cursor > 0 )
                    204:                {
                    205:                        memmove( &f->buffer[f->cursor-1], &f->buffer[f->cursor], strlen( &f->buffer[f->cursor] ) + 1 );
                    206:                        f->cursor--;
                    207: 
                    208:                        if ( f->visible_offset )
                    209:                        {
                    210:                                f->visible_offset--;
                    211:                        }
                    212:                }
                    213:                break;
                    214: 
                    215:        case K_KP_DEL:
                    216:        case K_DEL:
                    217:                memmove( &f->buffer[f->cursor], &f->buffer[f->cursor+1], strlen( &f->buffer[f->cursor+1] ) + 1 );
                    218:                break;
                    219: 
                    220:        case K_KP_ENTER:
                    221:        case K_ENTER:
                    222:        case K_ESCAPE:
                    223:        case K_TAB:
                    224:                return false;
                    225: 
                    226:        case K_SPACE:
                    227:        default:
                    228:                if ( !isdigit( key ) && ( f->generic.flags & QMF_NUMBERSONLY ) )
                    229:                        return false;
                    230: 
                    231:                if ( f->cursor < f->length )
                    232:                {
                    233:                        f->buffer[f->cursor++] = key;
                    234:                        f->buffer[f->cursor] = 0;
                    235: 
                    236:                        if ( f->cursor > f->visible_length )
                    237:                        {
                    238:                                f->visible_offset++;
                    239:                        }
                    240:                }
                    241:        }
                    242: 
                    243:        return true;
                    244: }
                    245: 
                    246: void Menu_AddItem( menuframework_s *menu, void *item )
                    247: {
                    248:        if ( menu->nitems == 0 )
                    249:                menu->nslots = 0;
                    250: 
                    251:        if ( menu->nitems < MAXMENUITEMS )
                    252:        {
                    253:                menu->items[menu->nitems] = item;
                    254:                ( ( menucommon_s * ) menu->items[menu->nitems] )->parent = menu;
                    255:                menu->nitems++;
                    256:        }
                    257: 
                    258:        menu->nslots = Menu_TallySlots( menu );
                    259: }
                    260: 
                    261: /*
                    262: ** Menu_AdjustCursor
                    263: **
                    264: ** This function takes the given menu, the direction, and attempts
                    265: ** to adjust the menu's cursor so that it's at the next available
                    266: ** slot.
                    267: */
                    268: void Menu_AdjustCursor( menuframework_s *m, int dir )
                    269: {
                    270:        menucommon_s *citem;
                    271: 
                    272:        /*
                    273:        ** see if it's in a valid spot
                    274:        */
                    275:        if ( m->cursor >= 0 && m->cursor < m->nitems )
                    276:        {
                    277:                if ( ( citem = Menu_ItemAtCursor( m ) ) != 0 )
                    278:                {
                    279:                        if ( citem->type != MTYPE_SEPARATOR )
                    280:                                return;
                    281:                }
                    282:        }
                    283: 
                    284:        /*
                    285:        ** it's not in a valid spot, so crawl in the direction indicated until we
                    286:        ** find a valid spot
                    287:        */
                    288:        if ( dir == 1 )
                    289:        {
                    290:                while ( 1 )
                    291:                {
                    292:                        citem = Menu_ItemAtCursor( m );
                    293:                        if ( citem )
                    294:                                if ( citem->type != MTYPE_SEPARATOR )
                    295:                                        break;
                    296:                        m->cursor += dir;
                    297:                        if ( m->cursor >= m->nitems )
                    298:                                m->cursor = 0;
                    299:                }
                    300:        }
                    301:        else
                    302:        {
                    303:                while ( 1 )
                    304:                {
                    305:                        citem = Menu_ItemAtCursor( m );
                    306:                        if ( citem )
                    307:                                if ( citem->type != MTYPE_SEPARATOR )
                    308:                                        break;
                    309:                        m->cursor += dir;
                    310:                        if ( m->cursor < 0 )
                    311:                                m->cursor = m->nitems - 1;
                    312:                }
                    313:        }
                    314: }
                    315: 
                    316: void Menu_Center( menuframework_s *menu )
                    317: {
                    318:        int height;
                    319: 
                    320:        height = ( ( menucommon_s * ) menu->items[menu->nitems-1])->y;
                    321:        height += 10;
                    322: 
                    323:        menu->y = ( VID_HEIGHT - height ) / 2;
                    324: }
                    325: 
                    326: void Menu_Draw( menuframework_s *menu )
                    327: {
                    328:        int i;
                    329:        menucommon_s *item;
                    330: 
                    331:        /*
                    332:        ** draw contents
                    333:        */
                    334:        for ( i = 0; i < menu->nitems; i++ )
                    335:        {
                    336:                switch ( ( ( menucommon_s * ) menu->items[i] )->type )
                    337:                {
                    338:                case MTYPE_FIELD:
                    339:                        Field_Draw( ( menufield_s * ) menu->items[i] );
                    340:                        break;
                    341:                case MTYPE_SLIDER:
                    342:                        Slider_Draw( ( menuslider_s * ) menu->items[i] );
                    343:                        break;
                    344:                case MTYPE_LIST:
                    345:                        MenuList_Draw( ( menulist_s * ) menu->items[i] );
                    346:                        break;
                    347:                case MTYPE_SPINCONTROL:
                    348:                        SpinControl_Draw( ( menulist_s * ) menu->items[i] );
                    349:                        break;
                    350:                case MTYPE_ACTION:
                    351:                        Action_Draw( ( menuaction_s * ) menu->items[i] );
                    352:                        break;
                    353:                case MTYPE_SEPARATOR:
                    354:                        Separator_Draw( ( menuseparator_s * ) menu->items[i] );
                    355:                        break;
                    356:                }
                    357:        }
                    358: 
                    359:        item = Menu_ItemAtCursor( menu );
                    360: 
                    361:        if ( item && item->cursordraw )
                    362:        {
                    363:                item->cursordraw( item );
                    364:        }
                    365:        else if ( menu->cursordraw )
                    366:        {
                    367:                menu->cursordraw( menu );
                    368:        }
                    369:        else if ( item && item->type != MTYPE_FIELD )
                    370:        {
                    371:                if ( item->flags & QMF_LEFT_JUSTIFY )
                    372:                {
                    373:                        Draw_Char( menu->x + item->x - 24 + item->cursor_offset, menu->y + item->y, 12 + ( ( int ) ( Sys_Milliseconds()/250 ) & 1 ) );
                    374:                }
                    375:                else
                    376:                {
                    377:                        Draw_Char( menu->x + item->cursor_offset, menu->y + item->y, 12 + ( ( int ) ( Sys_Milliseconds()/250 ) & 1 ) );
                    378:                }
                    379:        }
                    380: 
                    381:        if ( item )
                    382:        {
                    383:                if ( item->statusbarfunc )
                    384:                        item->statusbarfunc( ( void * ) item );
                    385:                else if ( item->statusbar )
                    386:                        Menu_DrawStatusBar( item->statusbar );
                    387:                else
                    388:                        Menu_DrawStatusBar( menu->statusbar );
                    389: 
                    390:        }
                    391:        else
                    392:        {
                    393:                Menu_DrawStatusBar( menu->statusbar );
                    394:        }
                    395: }
                    396: 
                    397: void Menu_DrawStatusBar( const char *string )
                    398: {
                    399:        if ( string )
                    400:        {
                    401:                int l = strlen( string );
                    402:                int maxrow = VID_HEIGHT / 8;
                    403:                int maxcol = VID_WIDTH / 8;
                    404:                int col = maxcol / 2 - l / 2;
                    405: 
                    406:                Draw_Fill( 0, VID_HEIGHT-8, VID_WIDTH, 8, 4 );
                    407:                Menu_DrawString( col*8, VID_HEIGHT - 8, string );
                    408:        }
                    409:        else
                    410:        {
                    411:                Draw_Fill( 0, VID_HEIGHT-8, VID_WIDTH, 8, 0 );
                    412:        }
                    413: }
                    414: 
                    415: void Menu_DrawString( int x, int y, const char *string )
                    416: {
                    417:        unsigned i;
                    418: 
                    419:        for ( i = 0; i < strlen( string ); i++ )
                    420:        {
                    421:                Draw_Char( ( x + i*8 ), y, string[i] );
                    422:        }
                    423: }
                    424: 
                    425: void Menu_DrawStringDark( int x, int y, const char *string )
                    426: {
                    427:        unsigned i;
                    428: 
                    429:        for ( i = 0; i < strlen( string ); i++ )
                    430:        {
                    431:                Draw_Char( ( x + i*8 ), y, string[i] + 128 );
                    432:        }
                    433: }
                    434: 
                    435: void Menu_DrawStringR2L( int x, int y, const char *string )
                    436: {
                    437:        unsigned i;
                    438: 
                    439:        for ( i = 0; i < strlen( string ); i++ )
                    440:        {
                    441:                Draw_Char( ( x - i*8 ), y, string[strlen(string)-i-1] );
                    442:        }
                    443: }
                    444: 
                    445: void Menu_DrawStringR2LDark( int x, int y, const char *string )
                    446: {
                    447:        unsigned i;
                    448: 
                    449:        for ( i = 0; i < strlen( string ); i++ )
                    450:        {
                    451:                Draw_Char( ( x - i*8 ), y, string[strlen(string)-i-1]+128 );
                    452:        }
                    453: }
                    454: 
                    455: void *Menu_ItemAtCursor( menuframework_s *m )
                    456: {
                    457:        if ( m->cursor < 0 || m->cursor >= m->nitems )
                    458:                return 0;
                    459: 
                    460:        return m->items[m->cursor];
                    461: }
                    462: 
                    463: qboolean Menu_SelectItem( menuframework_s *s )
                    464: {
                    465:        menucommon_s *item = ( menucommon_s * ) Menu_ItemAtCursor( s );
                    466: 
                    467:        if ( item )
                    468:        {
                    469:                switch ( item->type )
                    470:                {
                    471:                case MTYPE_FIELD:
                    472:                        return Field_DoEnter( ( menufield_s * ) item ) ;
                    473:                case MTYPE_ACTION:
                    474:                        Action_DoEnter( ( menuaction_s * ) item );
                    475:                        return true;
                    476:                case MTYPE_LIST:
                    477: //                     Menulist_DoEnter( ( menulist_s * ) item );
                    478:                        return false;
                    479:                case MTYPE_SPINCONTROL:
                    480: //                     SpinControl_DoEnter( ( menulist_s * ) item );
                    481:                        return false;
                    482:                }
                    483:        }
                    484:        return false;
                    485: }
                    486: 
                    487: void Menu_SetStatusBar( menuframework_s *m, const char *string )
                    488: {
                    489:        m->statusbar = string;
                    490: }
                    491: 
                    492: void Menu_SlideItem( menuframework_s *s, int dir )
                    493: {
                    494:        menucommon_s *item = ( menucommon_s * ) Menu_ItemAtCursor( s );
                    495: 
                    496:        if ( item )
                    497:        {
                    498:                switch ( item->type )
                    499:                {
                    500:                case MTYPE_SLIDER:
                    501:                        Slider_DoSlide( ( menuslider_s * ) item, dir );
                    502:                        break;
                    503:                case MTYPE_SPINCONTROL:
                    504:                        SpinControl_DoSlide( ( menulist_s * ) item, dir );
                    505:                        break;
                    506:                }
                    507:        }
                    508: }
                    509: 
                    510: int Menu_TallySlots( menuframework_s *menu )
                    511: {
                    512:        int i;
                    513:        int total = 0;
                    514: 
                    515:        for ( i = 0; i < menu->nitems; i++ )
                    516:        {
                    517:                if ( ( ( menucommon_s * ) menu->items[i] )->type == MTYPE_LIST )
                    518:                {
                    519:                        int nitems = 0;
                    520:                        const char **n = ( ( menulist_s * ) menu->items[i] )->itemnames;
                    521: 
                    522:                        while (*n)
                    523:                                nitems++, n++;
                    524: 
                    525:                        total += nitems;
                    526:                }
                    527:                else
                    528:                {
                    529:                        total++;
                    530:                }
                    531:        }
                    532: 
                    533:        return total;
                    534: }
                    535: 
                    536: void Menulist_DoEnter( menulist_s *l )
                    537: {
                    538:        int start;
                    539: 
                    540:        start = l->generic.y / 10 + 1;
                    541: 
                    542:        l->curvalue = l->generic.parent->cursor - start;
                    543: 
                    544:        if ( l->generic.callback )
                    545:                l->generic.callback( l );
                    546: }
                    547: 
                    548: void MenuList_Draw( menulist_s *l )
                    549: {
                    550:        const char **n;
                    551:        int y = 0;
                    552: 
                    553:        Menu_DrawStringR2LDark( l->generic.x + l->generic.parent->x + LCOLUMN_OFFSET, l->generic.y + l->generic.parent->y, l->generic.name );
                    554: 
                    555:        n = l->itemnames;
                    556: 
                    557:        Draw_Fill( l->generic.x - 112 + l->generic.parent->x, l->generic.parent->y + l->generic.y + l->curvalue*10 + 10, 128, 10, 16 );
                    558:        while ( *n )
                    559:        {
                    560:                Menu_DrawStringR2LDark( l->generic.x + l->generic.parent->x + LCOLUMN_OFFSET, l->generic.y + l->generic.parent->y + y + 10, *n );
                    561: 
                    562:                n++;
                    563:                y += 10;
                    564:        }
                    565: }
                    566: 
                    567: void Separator_Draw( menuseparator_s *s )
                    568: {
                    569:        if ( s->generic.name )
                    570:                Menu_DrawStringR2LDark( s->generic.x + s->generic.parent->x, s->generic.y + s->generic.parent->y, s->generic.name );
                    571: }
                    572: 
                    573: void Slider_DoSlide( menuslider_s *s, int dir )
                    574: {
                    575:        s->curvalue += dir;
                    576: 
                    577:        if ( s->curvalue > s->maxvalue )
                    578:                s->curvalue = s->maxvalue;
                    579:        else if ( s->curvalue < s->minvalue )
                    580:                s->curvalue = s->minvalue;
                    581: 
                    582:        if ( s->generic.callback )
                    583:                s->generic.callback( s );
                    584: }
                    585: 
                    586: #define SLIDER_RANGE 10
                    587: 
                    588: void Slider_Draw( menuslider_s *s )
                    589: {
                    590:        int     i;
                    591: 
                    592:        Menu_DrawStringR2LDark( s->generic.x + s->generic.parent->x + LCOLUMN_OFFSET,
                    593:                                s->generic.y + s->generic.parent->y, 
                    594:                                                s->generic.name );
                    595: 
                    596:        s->range = ( s->curvalue - s->minvalue ) / ( float ) ( s->maxvalue - s->minvalue );
                    597: 
                    598:        if ( s->range < 0)
                    599:                s->range = 0;
                    600:        if ( s->range > 1)
                    601:                s->range = 1;
                    602:        Draw_Char( s->generic.x + s->generic.parent->x + RCOLUMN_OFFSET, s->generic.y + s->generic.parent->y, 128);
                    603:        for ( i = 0; i < SLIDER_RANGE; i++ )
                    604:                Draw_Char( RCOLUMN_OFFSET + s->generic.x + i*8 + s->generic.parent->x + 8, s->generic.y + s->generic.parent->y, 129);
                    605:        Draw_Char( RCOLUMN_OFFSET + s->generic.x + i*8 + s->generic.parent->x + 8, s->generic.y + s->generic.parent->y, 130);
                    606:        Draw_Char( ( int ) ( 8 + RCOLUMN_OFFSET + s->generic.parent->x + s->generic.x + (SLIDER_RANGE-1)*8 * s->range ), s->generic.y + s->generic.parent->y, 131);
                    607: }
                    608: 
                    609: void SpinControl_DoEnter( menulist_s *s )
                    610: {
                    611:        s->curvalue++;
                    612:        if ( s->itemnames[s->curvalue] == 0 )
                    613:                s->curvalue = 0;
                    614: 
                    615:        if ( s->generic.callback )
                    616:                s->generic.callback( s );
                    617: }
                    618: 
                    619: void SpinControl_DoSlide( menulist_s *s, int dir )
                    620: {
                    621:        s->curvalue += dir;
                    622: 
                    623:        if ( s->curvalue < 0 )
                    624:                s->curvalue = 0;
                    625:        else if ( s->itemnames[s->curvalue] == 0 )
                    626:                s->curvalue--;
                    627: 
                    628:        if ( s->generic.callback )
                    629:                s->generic.callback( s );
                    630: }
                    631: 
                    632: void SpinControl_Draw( menulist_s *s )
                    633: {
                    634:        char buffer[100];
                    635: 
                    636:        if ( s->generic.name )
                    637:        {
                    638:                Menu_DrawStringR2LDark( s->generic.x + s->generic.parent->x + LCOLUMN_OFFSET, 
                    639:                                                        s->generic.y + s->generic.parent->y, 
                    640:                                                        s->generic.name );
                    641:        }
                    642:        if ( !strchr( s->itemnames[s->curvalue], '\n' ) )
                    643:        {
                    644:                Menu_DrawString( RCOLUMN_OFFSET + s->generic.x + s->generic.parent->x, s->generic.y + s->generic.parent->y, s->itemnames[s->curvalue] );
                    645:        }
                    646:        else
                    647:        {
                    648:                strcpy( buffer, s->itemnames[s->curvalue] );
                    649:                *strchr( buffer, '\n' ) = 0;
                    650:                Menu_DrawString( RCOLUMN_OFFSET + s->generic.x + s->generic.parent->x, s->generic.y + s->generic.parent->y, buffer );
                    651:                strcpy( buffer, strchr( s->itemnames[s->curvalue], '\n' ) + 1 );
                    652:                Menu_DrawString( RCOLUMN_OFFSET + s->generic.x + s->generic.parent->x, s->generic.y + s->generic.parent->y + 10, buffer );
                    653:        }
                    654: }
                    655: 

unix.superglobalmegacorp.com

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