Exemplo n.º 1
0
/*
 * StartSaveExit - prepare to do save & exit of file
 */
vi_rc StartSaveExit( void )
{
    vi_key  key;
    vi_key  levent;

    /*
     * get the next key
     */
    levent = LastEvent;
    key = GetNextEvent( FALSE );
    if( key != levent ) {
        if( key == VI_KEY( ESC ) ) {
            return( ERR_NO_ERR );
        }
        return( InvalidKey() );
    }
    return( SaveAndExit( NULL ) );

} /* StartSaveExit */
Exemplo n.º 2
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 */
Exemplo n.º 3
0
const TerrainLod::_IndexData &  TerrainLod::GetIndexData(const _Key & k)
{
	d_assert(!InvalidKey(k));

    Map<_Key, _IndexData>::Iterator iter = mMIndexBuffer.Find(k);

    if (iter == mMIndexBuffer.End())
    {
        _IndexData data;
        data.start = 0;
        data.index_count = 0;
        data.prim_count = 0;
        data.prim_type = PRIM_TRIANGLESTRIP;

        const _IndexPool & body = mBodyIndex[k.level];
        const _IndexPool & north = mConecterIndex[k.level][k.north][__NorthIndex];
        const _IndexPool & south = mConecterIndex[k.level][k.south][__SouthIndex];
        const _IndexPool & west = mConecterIndex[k.level][k.west][__WestIndex];
        const _IndexPool & east = mConecterIndex[k.level][k.east][__EastIndex];

        if (body.indeces)
            data.index_count += body.size + 2;

        if (north.indeces)
            data.index_count += north.size + 2;

        if (south.indeces)
            data.index_count += south.size + 2;

        if (west.indeces)
            data.index_count += west.size + 2;

        if (east.indeces)
            data.index_count += east.size;

        d_assert (data.index_count > 0 && data.index_count < 65536);

        data.index_buffer = VideoBufferManager::Instance()->CreateIndexBuffer(data.index_count * sizeof(short));
        int index = 0;
        bool flag = false;

        short * indeces = (short *)data.index_buffer->Lock(0, 0, LOCK_NORMAL);

        if (body.indeces)
        {
            Memcpy(indeces + index, body.indeces, body.size * sizeof(short));
            index += body.size;
            flag = true;
        }

        if (north.indeces)
        {
            if (flag)
            {
                indeces[index++] = indeces[index - 1];
                indeces[index++] = north.indeces[0];
            }

            Memcpy(indeces + index, north.indeces, north.size * sizeof(short));
            index += north.size;
            flag = true;
        }

        if (south.indeces)
        {
            if (flag)
            {
                indeces[index++] = indeces[index - 1];
                indeces[index++] = south.indeces[0];
            }

            Memcpy(indeces + index, south.indeces, south.size * sizeof(short));
            index += south.size;
            flag = true;
        }

        if (west.indeces)
        {
            if (flag)
            {
                indeces[index++] = indeces[index - 1];
                indeces[index++] = west.indeces[0];
            }

            Memcpy(indeces + index, west.indeces, west.size * sizeof(short));
            index += west.size;
            flag = true;
        }

        if (east.indeces)
        {
            if (flag)
            {
                indeces[index++] = indeces[index - 1];
                indeces[index++] = east.indeces[0];
            }

            Memcpy(indeces + index, east.indeces, east.size * sizeof(short));
            index += east.size;
            flag = true;
        }

        data.index_buffer->Unlock();

        data.prim_count = index - 2;

        iter = mMIndexBuffer.Insert(k, data);
    }

    return iter->second;
}