Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Jun 9, 2009, 2:53:57 PM (15 years ago)
Author:
scheusso
Message:

cursor now working again in dedicated server console

Location:
code/branches/netp4/src/orxonox/gamestates
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • code/branches/netp4/src/orxonox/gamestates/GSDedicated.cc

    r3122 r3126  
    6363        , inputIterator_(0)
    6464        , cleanLine_(true)
    65     {
    66         this->inputThread_ = new boost::thread(boost::bind(&GSDedicated::inputThread, this));
     65        , cursorX_(0)
     66        , cursorY_(0)
     67    {
    6768        this->commandLine_ = new unsigned char[MAX_COMMAND_LENGTH];
    6869//         memset( this->commandLine_, 0, MAX_COMMAND_LENGTH );
     70    }
     71
     72    GSDedicated::~GSDedicated()
     73    {
     74    }
     75
     76    void GSDedicated::activate()
     77    {
     78        GameMode::setHasServer(true);
     79       
     80        this->inputThread_ = new boost::thread(boost::bind(&GSDedicated::inputThread, this));
     81       
    6982#ifndef ORXONOX_PLATFORM_WINDOWS
    7083        this->originalTerminalSettings_ = new termios;
    7184        this->setTerminalMode();
    7285#endif
    73     }
    74 
    75     GSDedicated::~GSDedicated()
    76     {
     86
     87        this->server_ = new Server(CommandLine::getValue("port"));
     88        COUT(0) << "Loading scene in server mode" << std::endl;
     89
     90        server_->open();
     91    }
     92
     93    void GSDedicated::deactivate()
     94    {
     95        this->server_->close();
     96        delete this->server_;
     97       
    7798        closeThread_ = true;
    7899#ifndef ORXONOX_PLATFORM_WINDOWS
     
    83104#endif
    84105        //inputThread_->join();
    85     }
    86 
    87     void GSDedicated::activate()
    88     {
    89         GameMode::setHasServer(true);
    90 
    91         this->server_ = new Server(CommandLine::getValue("port"));
    92         COUT(0) << "Loading scene in server mode" << std::endl;
    93 
    94         server_->open();
    95     }
    96 
    97     void GSDedicated::deactivate()
    98     {
    99         this->server_->close();
    100         delete this->server_;
    101106
    102107        GameMode::setHasServer(false);
     
    124129    {
    125130        unsigned char c;
     131        unsigned int  escapeChar=0;
    126132        while(!closeThread_)
    127133        {
    128134            c = getchar();
    129135            {
    130                 boost::recursive_mutex::scoped_lock(this->inputLineMutex_);
     136//                 boost::recursive_mutex::scoped_lock(this->inputLineMutex_);
    131137                if ( inputIterator_>=MAX_COMMAND_LENGTH-1 && c!='\n' )
    132138                    continue;
    133                 switch (c)
     139                if( escapeChar > 0 )
    134140                {
    135                     case '\n':
    136                         this->cleanLine_ = true;
     141                    if( c == '[' )
     142                    {
     143                        escapeChar = 2;
     144                        continue;
     145                    }
     146                    else if ( escapeChar == 2 )
     147                    {
     148                        switch (c)
    137149                        {
    138                             boost::recursive_mutex::scoped_lock(this->inputQueueMutex_);
    139                             boost::recursive_mutex::scoped_lock(this->inputLineMutex_);
    140                             this->commandQueue_.push( std::string((const char*)this->commandLine_,inputIterator_) );
     150                            case 'A': //keyup
     151                               
     152                                break;
     153                            case 'B': //keydown
     154                               
     155                                break;
     156                            case 'C': //keyright
     157                                if(cursorX_<inputIterator_)
     158                                    ++cursorX_;
     159                                break;
     160                            case 'D': //keyleft
     161                                if(cursorX_>0)
     162                                    --cursorX_;
     163                                break;
     164                            default: //not supported...
     165                                break;
    141166                        }
    142                         memset( this->commandLine_, 0, inputIterator_ );
    143                         inputIterator_ = 0;
    144                         std::cout << endl;
    145                         break;
    146                     case 127: // backspace
    147                     case '\b':
     167                        escapeChar = 0;
     168                    }
     169                }
     170                else // not in escape sequence mode
     171                {
     172                    switch (c)
    148173                    {
    149                         boost::recursive_mutex::scoped_lock(this->inputLineMutex_);
    150                         if(inputIterator_>0)
    151                             --inputIterator_;
    152                         break;
    153                     }
    154                     case '\t':
    155                     {
    156                         boost::recursive_mutex::scoped_lock(this->inputLineMutex_);
    157                         COUT(0) << endl << CommandExecutor::hint( std::string((const char*)this->commandLine_,inputIterator_) ) << endl;
    158                         strncpy((char*)this->commandLine_, CommandExecutor::complete( std::string((const char*)this->commandLine_,inputIterator_) ).c_str(), MAX_COMMAND_LENGTH);
    159                         inputIterator_ = strlen((const char*)this->commandLine_);
    160                         break;
    161                     }
    162                     default:
    163                     {
    164                         boost::recursive_mutex::scoped_lock(this->inputLineMutex_);
    165                         this->commandLine_[this->inputIterator_++] = c;
    166                         break;
     174                        case '\n':
     175                            this->cleanLine_ = true;
     176                            {
     177                                boost::recursive_mutex::scoped_lock(this->inputQueueMutex_);
     178                                boost::recursive_mutex::scoped_lock(this->inputLineMutex_);
     179                                this->commandQueue_.push( std::string((const char*)this->commandLine_,inputIterator_) );
     180                            }
     181                            memset( this->commandLine_, 0, inputIterator_ );
     182                            inputIterator_ = 0;
     183                            this->cursorX_ = 0;
     184                            this->cursorY_ = 0;
     185                            std::cout << endl;
     186                            break;
     187                        case 127: // backspace
     188                        case '\b':
     189                            deleteCharacter( this->cursorX_ );
     190                            break;
     191                        case '\t':
     192                        {
     193//                             boost::recursive_mutex::scoped_lock(this->inputLineMutex_);
     194                            std::cout << endl << CommandExecutor::hint( std::string((const char*)this->commandLine_,inputIterator_) ) << endl;
     195                            strncpy((char*)this->commandLine_, CommandExecutor::complete( std::string((const char*)this->commandLine_,inputIterator_) ).c_str(), MAX_COMMAND_LENGTH);
     196                            inputIterator_ = strlen((const char*)this->commandLine_);
     197                            break;
     198                        }
     199                        case '\033': // 1. escape character
     200                            escapeChar = 1;
     201                            break;
     202                        default:
     203                            insertCharacter( this->cursorX_, c );
     204                            break;
    167205                    }
    168206                }
     
    174212    {
    175213#ifndef ORXONOX_PLATFORM_WINDOWS
    176 //         std::cout << "\033[s\033[0G";
     214        // set cursor to the begining of the line and erase the line
    177215        std::cout << "\033[0G\033[K";
    178         boost::recursive_mutex::scoped_lock(this->inputLineMutex_);
    179         std::cout << std::fixed << std::setprecision(2) << std::setw(5) << Game::getInstance().getAvgFPS() << " fps, " << std::setprecision(2) << std::setw(5) << Game::getInstance().getAvgTickTime() << " ms avg ticktime # " << std::string((const char*)this->commandLine_,inputIterator_);
    180         //if ( this->cleanLine_ )
    181         //    this->cleanLine_ = false;
    182         //else
    183         //    std::cout <<"\033[u";
     216//         boost::recursive_mutex::scoped_lock(this->inputLineMutex_);
     217        // print status line
     218        std::cout << std::fixed << std::setprecision(2) << std::setw(5) << Game::getInstance().getAvgFPS() << " fps, " << std::setprecision(2) << std::setw(5) << Game::getInstance().getAvgTickTime() << " ms avg ticktime # ";
     219        //save cursor position
     220        std::cout << "\033[s";
     221        //print commandLine buffer
     222        std::cout << std::string((const char*)this->commandLine_, inputIterator_);
     223        //restore cursor position and move it cursorX_ to the right
     224        std::cout << "\033[u";
     225        if( this->cursorX_ > 0 )
     226            std::cout << "\033[" << this->cursorX_ << "C";
    184227        std::cout.flush();
    185228#endif
     
    227270#endif
    228271    }
     272   
     273    void GSDedicated::insertCharacter( unsigned int position, char c )
     274    {
     275//         std::cout << endl << (unsigned int)c << endl;
     276        // check that we do not exceed MAX_COMMAND_LENGTH
     277        if( inputIterator_+1 < MAX_COMMAND_LENGTH )
     278        {
     279            // if cursor not at end of line then move the rest of the line
     280            if( position != this->inputIterator_ )
     281                    memmove( this->commandLine_+position+1, this->commandLine_+position, this->inputIterator_-position);
     282//             boost::recursive_mutex::scoped_lock(this->inputLineMutex_);
     283            this->commandLine_[position] = c;
     284            ++this->cursorX_;
     285            ++this->inputIterator_;
     286        }
     287    }
     288    void GSDedicated::deleteCharacter( unsigned int position )
     289    {
     290//         boost::recursive_mutex::scoped_lock(this->inputLineMutex_);
     291        if ( this->inputIterator_>0 && position>0 )
     292        {
     293            if ( position != this->inputIterator_ )
     294                memmove( this->commandLine_+position-1, this->commandLine_+position, this->inputIterator_-position);
     295            --this->cursorX_;
     296            --this->inputIterator_;
     297        }
     298    }
     299   
    229300}
  • code/branches/netp4/src/orxonox/gamestates/GSDedicated.h

    r3121 r3126  
    6161        static void resetTerminalMode();
    6262       
     63        void insertCharacter( unsigned int position, char c );
     64        void deleteCharacter( unsigned int position );
     65       
    6366        Server*                 server_;
    6467        float                   timeSinceLastUpdate_;
     
    7376        std::queue<std::string> commandQueue_;
    7477        static termios*         originalTerminalSettings_;
     78       
     79        unsigned int            cursorX_;
     80        unsigned int            cursorY_;
    7581    };
    7682}
Note: See TracChangeset for help on using the changeset viewer.