[Orxonox-commit 1257] r5975 - code/branches/console/src/libraries/core
rgrieder at orxonox.net
rgrieder at orxonox.net
Wed Oct 21 09:26:36 CEST 2009
Author: rgrieder
Date: 2009-10-21 09:26:35 +0200 (Wed, 21 Oct 2009)
New Revision: 5975
Modified:
code/branches/console/src/libraries/core/IOConsole.cc
code/branches/console/src/libraries/core/IOConsole.h
Log:
Escape key should work as well now in the IOConsole input.
And fixed tabs from tardis.
Modified: code/branches/console/src/libraries/core/IOConsole.cc
===================================================================
--- code/branches/console/src/libraries/core/IOConsole.cc 2009-10-20 20:49:22 UTC (rev 5974)
+++ code/branches/console/src/libraries/core/IOConsole.cc 2009-10-21 07:26:35 UTC (rev 5975)
@@ -56,7 +56,7 @@
IOConsole::IOConsole()
: shell_(Shell::getInstance())
- , bEscapeMode_(false)
+ , escapeMode_(None)
, buffer_(Shell::getInstance().getInputBuffer())
{
this->originalTerminalSettings_ = new termios;
@@ -94,53 +94,60 @@
void IOConsole::update(const Clock& time)
{
- unsigned char c;
+ unsigned char c = 0;
while (read(STDIN_FILENO, &c, 1) == 1)
{
- if (this->bEscapeMode_)
+ if (this->escapeMode_ == First && c == '[')
+ this->escapeMode_ = Second;
+ // Get Alt+Tab combination when switching applications
+ else if (this->escapeMode_ == First && c == '\t')
{
- this->escapeSequence_ += c;
+ this->buffer_->buttonPressed(KeyEvent(KeyCode::Tab, '\t', KeyboardModifier::Alt));
+ this->escapeMode_ = None;
+ }
+ else if (this->escapeMode_ == Second)
+ {
bool endOfSeq = true;
- if (this->escapeSequence_ == "[A")
+ this->escapeMode_ = None;
+ if (this->escapeSequence_ == "A")
this->buffer_->buttonPressed(KeyEvent(KeyCode::Up, 0, 0));
- else if (this->escapeSequence_ == "[B")
+ else if (this->escapeSequence_ == "B")
this->buffer_->buttonPressed(KeyEvent(KeyCode::Down, 0, 0));
- else if (this->escapeSequence_ == "[C")
+ else if (this->escapeSequence_ == "C")
this->buffer_->buttonPressed(KeyEvent(KeyCode::Right, 0, 0));
- else if (this->escapeSequence_ == "[D")
+ else if (this->escapeSequence_ == "D")
this->buffer_->buttonPressed(KeyEvent(KeyCode::Left, 0, 0));
- else if (this->escapeSequence_ == "[1~")
+ else if (this->escapeSequence_ == "1~")
this->buffer_->buttonPressed(KeyEvent(KeyCode::Home, 0, 0));
- else if (this->escapeSequence_ == "[2~")
+ else if (this->escapeSequence_ == "2~")
this->buffer_->buttonPressed(KeyEvent(KeyCode::Insert, 0, 0));
- else if (this->escapeSequence_ == "[3~")
+ else if (this->escapeSequence_ == "3~")
this->buffer_->buttonPressed(KeyEvent(KeyCode::Delete, 0, 0));
- else if (this->escapeSequence_ == "[4~")
+ else if (this->escapeSequence_ == "4~")
this->buffer_->buttonPressed(KeyEvent(KeyCode::End, 0, 0));
- else if (this->escapeSequence_ == "[5~")
+ else if (this->escapeSequence_ == "5~")
this->buffer_->buttonPressed(KeyEvent(KeyCode::PageUp, 0, 0));
- else if (this->escapeSequence_ == "[6~")
+ else if (this->escapeSequence_ == "6~")
this->buffer_->buttonPressed(KeyEvent(KeyCode::PageDown, 0, 0));
- // Get Alt+Tab combination when switching applications
- else if (this->escapeSequence_ == "\t")
- this->buffer_->buttonPressed(KeyEvent(KeyCode::Tab, '\t', KeyboardModifier::Alt));
else if (this->escapeSequence_.size() > 4)
- endOfSeq = true; // Something went wrong, start over
+ // User probably very quickly pressed ESC and [
+ this->escapeMode_ = None;
else
- endOfSeq = false;
-
- //this->buffer_->buttonPressed(KeyEvent(KeyCode::Escape, 0, 0));
-
- if (endOfSeq)
- this->bEscapeMode_ = false;
+ // Waiting for sequence to complete
+ this->escapeMode_ = Second;
}
- else // not in an escape sequence
+ else // not in an escape sequence OR user might have pressed just ESC
{
+ if (this->escapeMode_ == First)
+ {
+ this->buffer_->buttonPressed(KeyEvent(KeyCode::Escape, 0, 0));
+ this->escapeMode_ = None;
+ }
if (c == '\033')
- {
- this->bEscapeMode_ = true;
- this->escapeSequence_.clear();
- }
+ {
+ this->escapeMode_ = First;
+ this->escapeSequence_.clear();
+ }
else
{
KeyCode::ByEnum code;
@@ -162,13 +169,17 @@
}
}
- // Print input line
- this->printInputLine();
+ // If there is still an escape key pending (escape key ONLY), then
+ // it sure isn't an escape sequence here
+ this->buffer_->buttonPressed(KeyEvent(KeyCode::Escape, 0, 0));
+
+ // Print input line
+ this->printInputLine();
}
void IOConsole::printOutputLine(const std::string& line)
{
- COUT(0) << "print output" << std::endl;
+ COUT(0) << "print output" << std::endl;
// Save cursor position
std::cout << "\033[s";
@@ -205,7 +216,7 @@
std::cout << "\033[u";
std::cout.flush();
- this->printInputLine();
+ this->printInputLine();
}
void IOConsole::printInputLine()
@@ -214,8 +225,8 @@
std::cout << "\033[0G\033[K";
// print status line
//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 # ";
- // Show an arrow to indicate a command prompt
- std::cout << ">";
+ // Show an arrow to indicate a command prompt
+ std::cout << ">";
// save cursor position
std::cout << "\033[s";
// print commandLine buffer
Modified: code/branches/console/src/libraries/core/IOConsole.h
===================================================================
--- code/branches/console/src/libraries/core/IOConsole.h 2009-10-20 20:49:22 UTC (rev 5974)
+++ code/branches/console/src/libraries/core/IOConsole.h 2009-10-21 07:26:35 UTC (rev 5975)
@@ -52,6 +52,13 @@
void update(const Clock& time);
private:
+ enum EscapeMode
+ {
+ None,
+ First,
+ Second
+ };
+
void setTerminalMode();
static void resetTerminalMode();
@@ -67,7 +74,7 @@
void exit();
Shell& shell_;
- bool bEscapeMode_;
+ EscapeMode escapeMode_;
std::string escapeSequence_;
InputBuffer* buffer_;
static termios* originalTerminalSettings_;
More information about the Orxonox-commit
mailing list