示例#1
0
/*
 * 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 */
示例#2
0
/*
 * 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 */
示例#3
0
/*
 * 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 */
示例#4
0
/*
 * 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 */
示例#5
0
/*
 * IMEsc - handle ESC from insert mode
 */
vi_rc IMEsc( void )
{
    DoneCurrentInsert( TRUE );
    return( ERR_NO_ERR );

} /* IMEsc */
示例#6
0
/*
 * 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 */