uimenu.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 967 行 · 第 1/3 页
C
967 行
ch = tolower( ch );
handled = FALSE;
itemptr = Menu->titles;
for( index = 0 ; !MENUENDMARKER( itemptr[ index ] ); ++index ) {
if( !MENUSEPARATOR( itemptr[index] ) &&
!MENUGRAYED ( itemptr[index] ) ) {
hotchar = (itemptr[ index ].name)
[ ( itemptr[ index ].flags & ITEM_CHAR_OFFSET ) ];
if( tolower( hotchar ) == ch ) {
*desc = &Describe[ index ];
*menu = index + 1;
*select = ( (*desc)->area.height == 0 );
Menu->popuppending = TRUE;
handled = TRUE;
break;
}
}
}
return( handled );
}
static EVENT createpopup( DESCMENU *desc, EVENT *newevent )
{
EVENT itemevent;
MENUITEM *curr_menu;
SAREA keep_inside;
SAREA return_exclude;
itemevent = EV_NO_EVENT;
if( MENUGRAYED(Menu->titles[ Menu->menu - 1]) ) {
curr_menu = NULL;
} else {
curr_menu = Menu->titles[ Menu->menu - 1].popup;
}
if( curr_menu != NULL ) {
keep_inside.row = 0;
keep_inside.col = 0;
keep_inside.width = UIData->width;
keep_inside.height = UIData->height;
return_exclude.row = 0;
return_exclude.col = desc->titlecol;
return_exclude.width = desc->titlewidth + 2;
return_exclude.height = 1;
uimenudisable( TRUE );
*newevent = uicreatesubpopupinarea( curr_menu, desc, TRUE, FALSE,
curr_menu[0].event, &keep_inside,
&BarWin.area, &return_exclude );
uimenudisable( FALSE );
switch( *newevent ) {
case EV_CURSOR_RIGHT :
case EV_CURSOR_LEFT :
case EV_ALT_PRESS :
case EV_ESCAPE :
case EV_MOUSE_DRAG :
case EV_MOUSE_DRAG_R :
case EV_MOUSE_PRESS:
case EV_MOUSE_PRESS_R:
case EV_MOUSE_RELEASE:
case EV_MOUSE_RELEASE_R:
break;
default :
itemevent = *newevent;
}
}
return( itemevent );
}
EVENT intern process_menuevent( VSCREEN *vptr, EVENT ev )
/*******************************************************/
{
register int index;
register int oldmenu = 0;
register EVENT itemevent;
auto EVENT newevent;
auto DESCMENU* desc;
auto int menu;
auto bool select;
auto ORD mouserow;
auto ORD mousecol;
auto int mouseon;
newevent = ev;
if( ev > EV_NO_EVENT && ev <= EV_LAST_KEYBOARD ){
/* this allows alt numeric keypad stuff to not activate the menus */
Menu->altpressed = FALSE;
}
if( isdialogue( vptr ) == FALSE ) {
if( NumMenus > 0 ) {
desc = &Describe[ Menu->menu - 1 ];
newevent = EV_NO_EVENT; /* Moved here from "else" case below */
if( Menu->popuppending ) {
Menu->popuppending = FALSE;
itemevent = createpopup( desc, &ev );
} else {
itemevent = EV_NO_EVENT;
}
if( Menu->active ) {
oldmenu = menu = Menu->menu;
} else {
oldmenu = menu = 0;
}
select = FALSE;
if( ev == EV_ALT_PRESS && !Menu->ignorealt ){
Menu->altpressed = TRUE;
} else if( ev == EV_ALT_RELEASE && Menu->altpressed ){
if( Menu->active ){
menu = 0;
} else {
desc = &Describe[ 0 ];
menu = 1;
}
Menu->altpressed = FALSE;
} else if( ev == EV_FUNC( 10 ) && UIData->f10menus ){
desc = &Describe[ 0 ];
menu = 1;
} else if( ev == EV_MOUSE_PRESS_R ||
ev == EV_MOUSE_PRESS_M ){
newevent = ev;
menu = 0;
Menu->draginmenu = FALSE;
} else if( ( ev == EV_MOUSE_PRESS ) ||
( ev == EV_MOUSE_DRAG ) ||
( ev == EV_MOUSE_REPEAT ) ||
( ev == EV_MOUSE_RELEASE ) ||
( ev == EV_MOUSE_DCLICK ) ) {
uigetmouse( &mouserow, &mousecol, &mouseon );
if( ( mouserow < uimenuheight() ) &&
( Menu->active ||
ev == EV_MOUSE_PRESS || ev == EV_MOUSE_DCLICK ||
ev == EV_MOUSE_DRAG || ev == EV_MOUSE_REPEAT ) ) {
if( ev == EV_MOUSE_DCLICK ) {
ev = EV_MOUSE_PRESS;
}
menu = 0;
for( index = 0 ; !MENUENDMARKER( Menu->titles[ index ] ); ++index ) {
desc = &Describe[ index ];
if( ( MENU_GET_ROW( desc ) == mouserow ) &&
( desc->titlecol <= mousecol ) &&
( mousecol < desc->titlecol + desc->titlewidth + 2 ) ) {
Menu->draginmenu = TRUE;
Menu->popuppending = TRUE;
menu = index + 1;
break;
}
}
} else if( Menu->active || Menu->draginmenu ) {
if( ( desc->area.col < mousecol )
&& ( mousecol < desc->area.col + desc->area.width - 1 )
&& ( mouserow < desc->area.row + desc->area.height - 1 )
&& ( desc->area.row <= mouserow ) ) {
Menu->movedmenu = TRUE;
} else if( ev == EV_MOUSE_PRESS ) {
newevent = ev;
menu = 0;
Menu->draginmenu = FALSE;
} else if( ev == EV_MOUSE_RELEASE ) {
menu = 0;
Menu->draginmenu = FALSE;
}
} else {
newevent = ev;
}
if( ev != EV_MOUSE_RELEASE && menu != oldmenu ){
Menu->movedmenu = TRUE;
}
if( ev == EV_MOUSE_RELEASE ) {
if( !Menu->movedmenu ) {
menu = 0;
} else {
select = TRUE;
}
Menu->movedmenu = FALSE;
}
} else if( uialtchar( ev ) != '\0' ) {
process_char( uialtchar( ev ), &desc, &menu, &select );
newevent = EV_NO_EVENT;
} else if( Menu->active ) {
switch( ev ) {
case EV_ESCAPE :
menu = 0;
break;
case EV_RETURN :
if( menu > 0 ) {
Menu->popuppending = TRUE;
}
break;
case EV_CURSOR_LEFT :
menu -= 1;
if( menu == 0 ){
menu = NumMenus;
}
Menu->popuppending = TRUE;
desc = &Describe[ menu - 1 ];
break;
case EV_CURSOR_RIGHT :
menu += 1;
if( menu > NumMenus ){
menu = 1;
}
Menu->popuppending = TRUE;
desc = &Describe[ menu - 1 ];
break;
case EV_CURSOR_DOWN :
Menu->popuppending = TRUE;
break;
case EV_NO_EVENT :
break;
default :
if( ev <= EV_LAST_KEYBOARD ) {
if( process_char( ev, &desc, &menu, &select ) ) {
break;
}
}
if( itemevent != EV_NO_EVENT ) {
newevent = itemevent;
select = TRUE;
} else {
newevent = ev;
}
}
} else {
newevent = ev;
}
if( menu != oldmenu ) {
if( menu > 0 && !Menu->active ) {
newevent = EV_MENU_ACTIVE;
}
Menu->active = ( menu > 0 );
if( oldmenu > 0 ) {
menutitle( oldmenu, FALSE );
}
if( menu > 0 ) {
Menu->menu = menu;
menutitle( menu, TRUE );
}
if( menu == 0 || oldmenu == 0 ) {
uimenutitlebar();
}
}
if( Menu->active ) {
if( itemevent == EV_NO_EVENT ) {
if( MENUGRAYED(Menu->titles[ menu-1]) ) {
Menu->popuppending = FALSE;
} else {
itemevent = Menu->titles[ menu-1 ].event;
}
}
Menu->event = itemevent;
if( select ) {
newevent = Menu->event;
Menu->active = FALSE;
uimenutitlebar();
}
}
}
}
if( ev == EV_MOUSE_RELEASE ){
Menu->draginmenu = FALSE;
}
if( Menu->ignorealt ){
Menu->ignorealt = FALSE;
}
if( ( !Menu->active && ( oldmenu != 0 ) ) ||
( Menu->active && ( oldmenu != Menu->menu ) ) ) {
if( ( Menu->menu > 0 ) && Menu->active ) {
uimenucurr( &Menu->titles[Menu->menu - 1 ] );
} else {
/* no current menu */
uimenucurr( NULL );
}
}
if ( Menu->popuppending ) {
InitMenuPopupPending = TRUE;
}
return( newevent );
}
EVENT uigeteventfrompos( ORD row, ORD col )
/*****************************************/
{
unsigned index;
DESCMENU* desc;
if( row < uimenuheight() ) {
for( index = 0 ; !MENUENDMARKER( Menu->titles[ index ] ); ++index ) {
desc = &Describe[ index ];
if( ( MENU_GET_ROW( desc ) == row ) &&
( desc->titlecol <= col ) &&
( col < desc->titlecol + desc->titlewidth + 2 ) ) {
return( Menu->event );
}
}
}
return( EV_NO_EVENT );
}
void intern menuevent( VSCREEN *vptr )
/************************************/
{
register EVENT newevent;
register EVENT ev;
newevent = EV_NO_EVENT;
if ( InitMenuPopupPending ) {
InitMenuPopupPending = FALSE;
if( Menu->titles[ Menu->menu - 1].popup != NULL ) {
newevent = EV_MENU_INITPOPUP;
}
}
if( newevent == EV_NO_EVENT ) {
if ( uimenuson() && !uimenuisdisabled() ) {
uipushlist( menu_list );
if( ( Menu->active == FALSE ) || isdialogue( vptr ) ) {
ev = getprime( vptr );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?