X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=menu%2Fm_post.c;h=6caac6a8313589a3c5d1ebf3d57a423ea9d5194b;hp=8751712b3ccff8a955d415e5d90d7cba1fd1686c;hb=8485ec820b6d0ad70950b63834f31b3ca235c84b;hpb=46722468f47c2b77b3987729b4bcf2321cccfd01 diff --git a/menu/m_post.c b/menu/m_post.c index 8751712b..6caac6a8 100644 --- a/menu/m_post.c +++ b/menu/m_post.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998,2000 Free Software Foundation, Inc. * + * Copyright (c) 1998-2004,2009 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -28,7 +28,6 @@ /**************************************************************************** * Author: Juergen Pfeifer, 1995,1997 * - * Contact: http://www.familiepfeifer.de/Contact.aspx?Lang=en * ****************************************************************************/ /*************************************************************************** @@ -38,113 +37,117 @@ #include "menu.priv.h" -MODULE_ID("$Id: m_post.c,v 1.18 2002/07/06 15:22:16 juergen Exp $") +MODULE_ID("$Id: m_post.c,v 1.27 2009/02/28 21:02:46 juergen Exp $") /*--------------------------------------------------------------------------- -| Facility : libnmenu -| Function : void _nc_Post_Item(MENU *menu, ITEM *item) -| +| Facility : libnmenu +| Function : void _nc_Post_Item(MENU *menu, ITEM *item) +| | Description : Draw the item in the menus window at the current -| window position +| window position | | Return Values : - +--------------------------------------------------------------------------*/ NCURSES_EXPORT(void) -_nc_Post_Item (const MENU * menu, const ITEM * item) +_nc_Post_Item(const MENU * menu, const ITEM * item) { int i; chtype ch; int item_x, item_y; int count = 0; - bool isfore = FALSE, isback=FALSE, isgrey = FALSE; - + bool isfore = FALSE, isback = FALSE, isgrey = FALSE; + int name_len; + int desc_len; + assert(menu->win); - - getyx(menu->win,item_y,item_x); - + + getyx(menu->win, item_y, item_x); + /* We need a marker iff - it is a onevalued menu and it is the current item - or it has a selection value - */ - wattron(menu->win,menu->back); - if (item->value || (item==menu->curitem)) + */ + wattron(menu->win, menu->back); + if (item->value || (item == menu->curitem)) { - if (menu->marklen) + if (menu->marklen) { /* In a multi selection menu we use the fore attribute for a selected marker that is not the current one. This improves visualization of the menu, because now always the 'normal' marker denotes the current item. */ - if (!(menu->opt & O_ONEVALUE) && item->value && item!=menu->curitem) + if (!(menu->opt & O_ONEVALUE) && item->value && item != menu->curitem) { - wattron(menu->win,menu->fore); + wattron(menu->win, menu->fore); isfore = TRUE; } - waddstr(menu->win,menu->mark); + waddstr(menu->win, menu->mark); if (isfore) { - wattron(menu->win,menu->fore); + wattron(menu->win, menu->fore); isfore = FALSE; } } } - else /* otherwise we have to wipe out the marker area */ - for(ch=' ',i=menu->marklen;i>0;i--) - waddch(menu->win,ch); - wattroff(menu->win,menu->back); + else /* otherwise we have to wipe out the marker area */ + for (ch = ' ', i = menu->marklen; i > 0; i--) + waddch(menu->win, ch); + wattroff(menu->win, menu->back); count += menu->marklen; /* First we have to calculate the attribute depending on selectability and selection status - */ + */ if (!(item->opt & O_SELECTABLE)) { - wattron(menu->win,menu->grey); + wattron(menu->win, menu->grey); isgrey = TRUE; } else { - if (item->value || item==menu->curitem) + if (item->value || item == menu->curitem) { - wattron(menu->win,menu->fore); + wattron(menu->win, menu->fore); isfore = TRUE; } else { - wattron(menu->win,menu->back); + wattron(menu->win, menu->back); isback = TRUE; } } - waddnstr(menu->win,item->name.str,item->name.length); - for(ch=' ',i=menu->namelen-item->name.length;i>0;i--) + waddnstr(menu->win, item->name.str, item->name.length); + name_len = _nc_Calculate_Text_Width(&(item->name)); + for (ch = ' ', i = menu->namelen - name_len; i > 0; i--) { - waddch(menu->win,ch); + waddch(menu->win, ch); } count += menu->namelen; /* Show description if required and available */ - if ( (menu->opt & O_SHOWDESC) && menu->desclen>0 ) + if ((menu->opt & O_SHOWDESC) && menu->desclen > 0) { - int m = menu->spc_desc/2; + int m = menu->spc_desc / 2; int cy = -1, cx = -1; - for(ch=' ',i=0; i < menu->spc_desc; i++) + for (ch = ' ', i = 0; i < menu->spc_desc; i++) { - if (i==m) + if (i == m) { - waddch(menu->win,menu->pad); - getyx(menu->win,cy,cx); + waddch(menu->win, menu->pad); + getyx(menu->win, cy, cx); } else - waddch(menu->win,ch); + waddch(menu->win, ch); } if (item->description.length) - waddnstr(menu->win,item->description.str,item->description.length); - for(ch=' ',i=menu->desclen-item->description.length; i>0; i--) + waddnstr(menu->win, item->description.str, item->description.length); + desc_len = _nc_Calculate_Text_Width(&(item->description)); + for (ch = ' ', i = menu->desclen - desc_len; i > 0; i--) { - waddch(menu->win,ch); + waddch(menu->win, ch); } count += menu->desclen + menu->spc_desc; @@ -152,47 +155,49 @@ _nc_Post_Item (const MENU * menu, const ITEM * item) { int j, k, ncy, ncx; - assert(cx>=0 && cy>=0); - getyx(menu->win,ncy,ncx); - if (isgrey) wattroff(menu->win,menu->grey); - else if (isfore) wattroff(menu->win,menu->fore); - wattron(menu->win,menu->back); - for(j=1; j < menu->spc_rows;j++) + assert(cx >= 0 && cy >= 0); + getyx(menu->win, ncy, ncx); + if (isgrey) + wattroff(menu->win, menu->grey); + else if (isfore) + wattroff(menu->win, menu->fore); + wattron(menu->win, menu->back); + for (j = 1; j < menu->spc_rows; j++) { - if ((item_y+j) < getmaxy(menu->win)) + if ((item_y + j) < getmaxy(menu->win)) { - wmove (menu->win,item_y+j,item_x); - for(k=0;kwin,' '); + wmove(menu->win, item_y + j, item_x); + for (k = 0; k < count; k++) + waddch(menu->win, ' '); } - if ((cy+j) < getmaxy(menu->win)) - mvwaddch(menu->win,cy+j,cx-1,menu->pad); + if ((cy + j) < getmaxy(menu->win)) + mvwaddch(menu->win, cy + j, cx - 1, menu->pad); } - wmove(menu->win,ncy,ncx); + wmove(menu->win, ncy, ncx); if (!isback) - wattroff(menu->win,menu->back); + wattroff(menu->win, menu->back); } } - + /* Remove attributes */ if (isfore) - wattroff(menu->win,menu->fore); + wattroff(menu->win, menu->fore); if (isback) - wattroff(menu->win,menu->back); + wattroff(menu->win, menu->back); if (isgrey) - wattroff(menu->win,menu->grey); -} + wattroff(menu->win, menu->grey); +} /*--------------------------------------------------------------------------- -| Facility : libnmenu +| Facility : libnmenu | Function : void _nc_Draw_Menu(const MENU *) -| +| | Description : Display the menu in its windows | | Return Values : - +--------------------------------------------------------------------------*/ NCURSES_EXPORT(void) -_nc_Draw_Menu (const MENU * menu) +_nc_Draw_Menu(const MENU * menu) { ITEM *item = menu->items[0]; ITEM *lasthor, *lastvert; @@ -203,75 +208,78 @@ _nc_Draw_Menu (const MENU * menu) assert(item && menu->win); s_bkgd = getbkgd(menu->win); - wbkgdset(menu->win,menu->back); + wbkgdset(menu->win, menu->back); werase(menu->win); - wbkgdset(menu->win,s_bkgd); + wbkgdset(menu->win, s_bkgd); - lastvert = (menu->opt & O_NONCYCLIC) ? (ITEM *)0 : item; + lastvert = (menu->opt & O_NONCYCLIC) ? (ITEM *) 0 : item; do - { - wmove(menu->win,y,0); + { + wmove(menu->win, y, 0); + + hitem = item; + lasthor = (menu->opt & O_NONCYCLIC) ? (ITEM *) 0 : hitem; - hitem = item; - lasthor = (menu->opt & O_NONCYCLIC) ? (ITEM *)0 : hitem; - do { - _nc_Post_Item( menu, hitem); + _nc_Post_Item(menu, hitem); - wattron(menu->win,menu->back); - if ( ((hitem = hitem->right) != lasthor) && hitem ) + wattron(menu->win, menu->back); + if (((hitem = hitem->right) != lasthor) && hitem) { - int i,j, cy, cx; + int i, j, cy, cx; chtype ch = ' '; - getyx(menu->win,cy,cx); - for(j=0;jspc_rows;j++) + getyx(menu->win, cy, cx); + for (j = 0; j < menu->spc_rows; j++) { - wmove(menu->win,cy+j,cx); - for(i=0; i < menu->spc_cols; i++) + wmove(menu->win, cy + j, cx); + for (i = 0; i < menu->spc_cols; i++) { - waddch( menu->win,ch); + waddch(menu->win, ch); } } - wmove(menu->win,cy,cx+menu->spc_cols); + wmove(menu->win, cy, cx + menu->spc_cols); } - } while (hitem && (hitem != lasthor)); - wattroff(menu->win,menu->back); - + } + while (hitem && (hitem != lasthor)); + wattroff(menu->win, menu->back); + item = item->down; y += menu->spc_rows; - - } while( item && (item != lastvert) ); + + } + while (item && (item != lastvert)); } /*--------------------------------------------------------------------------- -| Facility : libnmenu -| Function : int post_menu(MENU *) -| +| Facility : libnmenu +| Function : int post_menu(MENU* menu) +| | Description : Post a menu to the screen. This makes it visible. | | Return Values : E_OK - success | E_BAD_ARGUMENT - not a valid menu pointer | E_SYSTEM_ERROR - error in lower layers -| E_NO_ROOM - Menu to large for screen | E_NOT_CONNECTED - No items connected to menu | E_BAD_STATE - Menu in userexit routine | E_POSTED - Menu already posted +--------------------------------------------------------------------------*/ NCURSES_EXPORT(int) -post_menu (MENU * menu) +post_menu(MENU * menu) { + T((T_CALLED("post_menu(%p)"), menu)); + if (!menu) RETURN(E_BAD_ARGUMENT); - - if ( menu->status & _IN_DRIVER ) + + if (menu->status & _IN_DRIVER) RETURN(E_BAD_STATE); - if ( menu->status & _POSTED ) + if (menu->status & _POSTED) RETURN(E_POSTED); - + if (menu->items && *(menu->items)) { int y; @@ -279,54 +287,50 @@ post_menu (MENU * menu) WINDOW *win = Get_Menu_Window(menu); int maxy = getmaxy(win); - int maxx = getmaxx(win); - - if (maxx < menu->width || maxy < menu->height) - RETURN(E_NO_ROOM); - if ( (menu->win = newpad(h,menu->width)) ) + if ((menu->win = newpad(h, menu->width))) { y = (maxy >= h) ? h : maxy; - if (y>=menu->height) + if (y >= menu->height) y = menu->height; - if(!(menu->sub = subpad(menu->win,y,menu->width,0,0))) + if (!(menu->sub = subpad(menu->win, y, menu->width, 0, 0))) RETURN(E_SYSTEM_ERROR); } - else - RETURN(E_SYSTEM_ERROR); - - if (menu->status & _LINK_NEEDED) + else + RETURN(E_SYSTEM_ERROR); + + if (menu->status & _LINK_NEEDED) _nc_Link_Items(menu); } else RETURN(E_NOT_CONNECTED); - + menu->status |= _POSTED; - if (!(menu->opt&O_ONEVALUE)) + if (!(menu->opt & O_ONEVALUE)) { ITEM **items; - - for(items=menu->items;*items;items++) + + for (items = menu->items; *items; items++) { (*items)->value = FALSE; } } - + _nc_Draw_Menu(menu); - - Call_Hook(menu,menuinit); - Call_Hook(menu,iteminit); - + + Call_Hook(menu, menuinit); + Call_Hook(menu, iteminit); + _nc_Show_Menu(menu); - + RETURN(E_OK); } /*--------------------------------------------------------------------------- -| Facility : libnmenu -| Function : int unpost_menu(MENU *) -| +| Facility : libnmenu +| Function : int unpost_menu(MENU*) +| | Description : Detach menu from screen | | Return Values : E_OK - success @@ -335,36 +339,38 @@ post_menu (MENU * menu) | E_NOT_POSTED - menu is not posted +--------------------------------------------------------------------------*/ NCURSES_EXPORT(int) -unpost_menu (MENU * menu) +unpost_menu(MENU * menu) { WINDOW *win; - + + T((T_CALLED("unpost_menu(%p)"), menu)); + if (!menu) RETURN(E_BAD_ARGUMENT); - - if ( menu->status & _IN_DRIVER ) + + if (menu->status & _IN_DRIVER) RETURN(E_BAD_STATE); - if ( !( menu->status & _POSTED ) ) + if (!(menu->status & _POSTED)) RETURN(E_NOT_POSTED); - - Call_Hook(menu,itemterm); - Call_Hook(menu,menuterm); - + + Call_Hook(menu, itemterm); + Call_Hook(menu, menuterm); + win = Get_Menu_Window(menu); werase(win); wsyncup(win); - + assert(menu->sub); delwin(menu->sub); menu->sub = (WINDOW *)0; - + assert(menu->win); delwin(menu->win); menu->win = (WINDOW *)0; - + menu->status &= ~_POSTED; - + RETURN(E_OK); }