AIX仿真SCO UNIX的MENU驱动(2)

原创 2003年07月10日 10:04:00

 (续)AIX仿真SCO UNIXMENU驱动

王光红

static void start_line(MENU *m)

{

    if(m->curitem->index < m->toprow + m->height * m->cols

    && m->curitem->index >m->toprow) return;

    if(m->nitems>=m->height+m->curitem->index){

                if(m->toprow >=m->curitem->index)

                    m->toprow=m->curitem->index;

                    else

                    m->toprow +=m->cols;

                }

                else{

                m->toprow=m->nitems - m->height;

                }

}

 

 

static int compute_seat(MENU *m)

{

int n, y, x, t;

 

    for(n=0; n < m->nitems; n++){

        t=n-1; 

        if(t<0) m->items[n]->left=m->items[m->nitems-1];

            else m->items[n]->left=m->items[t];

 

        t=n+1; 

        if(t>=m->nitems) m->items[n]->right=m->items[0];

            else m->items[n]->right=m->items[t];

 

        t=n - m->cols; 

        if(t<0) m->items[n]->up=m->items[m->nitems-1];

            else m->items[n]->up=m->items[t];

 

        t=n + m->cols; 

        if(t>=m->nitems) m->items[n]->down=m->items[0];

            else m->items[n]->down=m->items[t];

    }

}

 

 

int post_menu(MENU *m)

{

    touch_menu(m);

    wrefresh(m->sub);

}

 

int touch_menu(MENU *m)

{

int y, x, s, cy, cx;

char *lable;

chtype attrs;

 

    if(m==NULL) return -1;

    if(m->sub==NULL) return -2;

    unpost_menu(m);

    start_line(m);

    for(s=m->toprow, y=0;y<m->height;y++)

        for(x=0;x<m->cols;x++){

            lable=menu_lable(s, m);

            if(s==m->curitem->index){

            attrs=m->sub->_attrs;

            wattrset(m->sub, A_REVERSE|m->sub->_attrs);

            mvwprintw(m->sub, y, x*(m->itemlen), "%s%s", m->mark, lable);

            cy=y, cx=x*(m->itemlen);

            wattrset(m->sub, attrs);

            }

            else

            mvwprintw(m->sub, y, x*(m->itemlen)+m->marklen, lable);

            s++;

        }

    wmove(m->sub, cy, cx);

    wmove(m->win, cy+1, cx+1);

    compute_seat(m);

}

 

 

int unpost_menu(MENU *m)

{

    werase(m->sub);

    wrefresh(m->win);

}

 

 

ITEM **menu_items(MENU *m)

{

    return m->items;

}

 

 

ITEM *current_item(MENU *m)

{

    return m->curitem;

}

 

 

int item_index(ITEM *i)

{

    return i->index;

}

 

 

int free_item(ITEM *i)

{

    free(i);

    return 0;

}

 

int free_menu(MENU *m)

{

    free(m);

    return 0;

}

 

 

int menu_driver(MENU *m, int c)

{

    switch(c){

    case REQ_LEFT_ITEM:

        if(m->curitem->left){

            m->curitem=m->curitem->left;

            touch_menu(m);

            }

        break;

    case REQ_RIGHT_ITEM:

        if(m->curitem->right){

            m->curitem=m->curitem->right;

            touch_menu(m);

            }

        break;

    case REQ_UP_ITEM:

        if(m->curitem->up){

            m->curitem=m->curitem->up;

            touch_menu(m);

            }

        break;

    case REQ_DOWN_ITEM:

        if(m->curitem->down){

            m->curitem=m->curitem->down;

            touch_menu(m);

            }

        break;

    case REQ_SCR_ULINE:

    case REQ_SCR_DLINE:

    case REQ_SCR_DPAGE:

    case REQ_SCR_UPAGE:

    case REQ_FIRST_ITEM:

        m->curitem=m->items[0];

        touch_menu(m);

        break;

    case REQ_LAST_ITEM:

        break;

    case REQ_NEXT_ITEM:

        if(m->curitem->index<m->nitems)

            m->curitem=m->items[m->curitem->index + 1];

            else

            m->curitem=m->items[0];

        touch_menu(m);

        break;

    case REQ_PREV_ITEM:

        if(m->curitem->index>0)

            m->curitem=m->items[m->curitem->index - 1];

            else

            m->curitem=m->items[m->nitems-1];

        touch_menu(m);

        break;

    case REQ_TOGGLE_ITEM:

    case REQ_CLEAR_PATTERN:

    case REQ_BACK_PATTERN:

    case REQ_NEXT_MATCH:

    case REQ_PREV_MATCH:

        break;

    }

wrefresh(m->sub);

return E_OK;

}

 

x86上的那些UNIX——System V篇(Solaris、SCO)

上篇BSD篇讲述了开源世界的UNIX,今天我们进入商业UNIX世界——System V的后裔,商业UNIX大都通过了UNIX认证,而且大多并不使用FreeBSD等使用的自由软件桌面 2.Solari...
  • u011536670
  • u011536670
  • 2016年04月09日 21:35
  • 1419

SCO Unix常用命令及基本知识

SCO UNIX5 的引导过程基本可分为六步:   1、 PC机的BIOS将Master Boot Block 装入内存。(读取硬盘的Track 0 , Sector 0处的信息)   2、 Ma...
  • yxwmzouzou
  • yxwmzouzou
  • 2014年07月03日 14:43
  • 2864

CCS v6.2下如何使用XDS560V2PLUS仿真器在DM8127上加载调试DSP核

基本原理就是,首先要连上A8,让A8的gel代码初始化DSP,让其脱离复位状态,然后断开A8,之后就可以连上DSP了,如果仅仅是调试DSP的代码,此过程不需要在A8上建立工程,只需在DSP建立工程即可...
  • marconiqi
  • marconiqi
  • 2016年09月28日 17:49
  • 1882

hp bcm5751 for sco unix5.0.6 网卡驱动

  • 2011年04月20日 16:39
  • 54KB
  • 下载

排除SCO UNIX系统故障实例

UNIX是我们使用较多的操作系统之一,在应用中有时会出现这样那样的问题或故障,轻者影响工作,重者会导致机器瘫痪,下面是几例具有代表性的故障的处理方法。  进入多用户时死机  【现象】  一台AIC P...
  • yxwmzouzou
  • yxwmzouzou
  • 2015年03月04日 01:27
  • 563

oracle AIX unix doc 2

  • 2015年12月08日 15:00
  • 37.04MB
  • 下载

Oracle大型数据库系统在AIX/UNIX上的实战详解_第2版(文平).part2

  • 2015年06月23日 14:41
  • 54MB
  • 下载

sco unix 506下安装配置informix online 7.22

sco unix 5.06 informix
  • tony1555
  • tony1555
  • 2011年04月16日 23:34
  • 709

SCO UNIX系统应用500问

  • 2014年06月25日 09:57
  • 8.79MB
  • 下载

SCO UNIX系统应用500问

  • 2010年10月03日 09:16
  • 11.19MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AIX仿真SCO UNIX的MENU驱动(2)
举报原因:
原因补充:

(最多只允许输入30个字)