/* * IMMenuKey - process menu keys from insert mode */ vi_rc IMMenuKey( void ) { if( IsMenuHotKey( LastEvent ) ) { DoneCurrentInsert( TRUE ); KeyAdd( LastEvent ); EditFlags.ReturnToInsertMode = TRUE; } return( ERR_NO_ERR ); } /* IMMenuKey */
/* * IMMouseEvent - handle a mouse event in insert mode */ vi_rc IMMouseEvent( void ) { if( LastMouseEvent == MOUSE_MOVE || LastMouseEvent == MOUSE_RELEASE || LastMouseEvent == MOUSE_RELEASE_R ) { return( ERR_NO_ERR ); } EditFlags.ReturnToInsertMode = TRUE; DoneCurrentInsert( TRUE ); AddCurrentMouseEvent(); return( ERR_NO_ERR ); } /* IMMouseEvent */
/* * PushMode - push our current mode */ void PushMode( void ) { mode *cmode; cmode = MemAlloc( sizeof( mode ) ); cmode->prev = modeTail; modeTail = cmode; cmode->wasinsert = EditFlags.InsertModeActive; cmode->wasoverstrike = EditFlags.WasOverstrike; DoneCurrentInsert( TRUE ); } /* PushMode */
/* * PopMode - restore to previous mode */ vi_rc PopMode( void ) { mode *cmode; vi_rc rc; rc = ERR_NO_ERR; if( modeTail == NULL ) { return( ERR_NO_ERR ); } cmode = modeTail; modeTail = cmode->prev; DoneCurrentInsert( TRUE ); if( cmode->wasinsert ) { rc = stdInsert( CurrentPos.column, cmode->wasoverstrike ); } MemFree( cmode ); return( rc ); } /* PopMode */
/* * IMEsc - handle ESC from insert mode */ vi_rc IMEsc( void ) { DoneCurrentInsert( TRUE ); return( ERR_NO_ERR ); } /* IMEsc */
/* * DoLastEvent - process the last keystroke event */ vi_rc DoLastEvent( void ) { event *event; vi_rc rc; bool keep_sel; if( LastEvent >= MAX_EVENTS ) { rc = InvalidKey(); } else if( !EditFlags.Modeless && EditFlags.InsertModeActive ) { // UnselectRegion(); if( EditFlags.EscapedInsertChar ) { rc = IMChar(); } else if( InputKeyMaps[LastEvent].data != NULL && !InputKeyMaps[LastEvent].inuse ) { rc = StartInputKeyMap( LastEvent ); } else { rc = (EventList[LastEvent].ins)(); } } else if( !EditFlags.Modeless && KeyMaps[LastEvent].data != NULL && !KeyMaps[LastEvent].inuse ) { rc = DoKeyMap( LastEvent ); } else { event = &EventList[LastEvent]; keep_sel = event->b.keep_selection; if( event->b.keep_selection_maybe ) { if( SelRgn.selected ) { keep_sel = true; } } if( !keep_sel && !EditFlags.ScrollCommand ) { UnselectRegion(); } if( !EditFlags.ScrollCommand ) { ensureCursorDisplayed(); } rc = ERR_NO_ERR; switch( event->b.type ) { case EVENT_INS: if( EditFlags.Modeless ) { /* don't allow following cursor movements to affect seln */ keep_sel = SelRgn.selected; DeleteSelectedRegion(); SelRgn.selected = keep_sel; InsertLikeLast(); rc = event->rtn.ins(); DoneCurrentInsert( false ); SelRgn.selected = false; } else { if( !EditFlags.InsertModeActive ) { InsertLikeLast(); } rc = event->rtn.ins(); } break; case EVENT_OP: DoneCurrentInsert( true ); rc = doOperator( event ); break; case EVENT_REL_MOVE: case EVENT_ABS_MOVE: DoneCurrentInsert( true ); rc = DoMove( event ); break; case EVENT_MISC: DoneCurrentInsert( true ); rc = event->rtn.old(); break; } } return( rc ); } /* DoLastEvent */