EVENT uihotkeyfilter( a_dialog *ui_dlg_info, EVENT ev ) { char ch, hotkey; VFIELD *vf; /* is the event a key press or alt-key press */ if( ev < 0x100 && isalpha( ev ) ) { ch = tolower( ev ); } else { ch = uialtchar( ev ); } if( ch ) { hotkey = '\0'; for( vf = ui_dlg_info->fields ; vf->typ != FLD_VOID; ++vf ){ switch( vf->typ ) { case FLD_HOT: hotkey = vf->u.hs->flags; break; case FLD_CHECK: hotkey = vf->u.check->hotkey; break; case FLD_RADIO: hotkey = vf->u.radio->hotkey; break; default: hotkey = '\0'; break; } if( hotkey == ch ) { break; } } /* make sure the new field is hilighted */ if( ui_dlg_info->curr != vf && vf->typ != FLD_VOID ) { uidialogsetcurr( ui_dlg_info, vf ); } if( hotkey == ch ) { switch( vf->typ ) { case FLD_HOT: ev = vf->u.hs->event; break; case FLD_CHECK: ui_dlg_info->dirty = TRUE; vf->u.check->val = !vf->u.check->val; print_field( ui_dlg_info->vs, vf, TRUE ); ev = EV_CHECK_BOX_CLICK; break; case FLD_RADIO: do_radio( ui_dlg_info, vf ); ev = EV_CHECK_BOX_CLICK; break; } } } return( ev ); }
ui_event uihotkeyfilter( a_dialog *ui_dlg_info, ui_event ui_ev ) { char ch, hotkey; VFIELD *fields; /* is the event a key press or alt-key press */ if( iseditchar( ui_ev ) && isalpha( (unsigned char)ui_ev ) ) { ch = tolower( (unsigned char)ui_ev ); } else { ch = uialtchar( ui_ev ); } if( ch ) { hotkey = '\0'; for( fields = ui_dlg_info->fields; fields->typ != FLD_NONE; fields++ ) { switch( fields->typ ) { case FLD_HOT: hotkey = fields->u.hs->flags; break; case FLD_CHECK: hotkey = fields->u.check->hotkey; break; case FLD_RADIO: hotkey = fields->u.radio->hotkey; break; default: hotkey = '\0'; break; } if( hotkey == ch ) { break; } } /* make sure the new field is hilighted */ if( ui_dlg_info->curr != fields && fields->typ != FLD_NONE ) { uidialogsetcurr( ui_dlg_info, fields ); } if( hotkey == ch ) { switch( fields->typ ) { case FLD_HOT: ui_ev = fields->u.hs->event; break; case FLD_CHECK: ui_dlg_info->dirty = true; fields->u.check->val = !fields->u.check->val; print_field( ui_dlg_info->vs, fields, true ); ui_ev = EV_CHECK_BOX_CLICK; break; case FLD_RADIO: do_radio( ui_dlg_info, fields ); ui_ev = EV_CHECK_BOX_CLICK; break; } } } return( ui_ev ); }
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 ); }