1. 把屏幕看作矩阵
现在已经基本做完了,所以没法改动了。如果一开始能想到这点,会方便很多。
为输入的每个字符生成坐标,目前最难做的上下左右功能也会变得简单。
某函数ioctl()可以获取屏幕能容纳的行数和列数。
2.把命令历史视作滚轮
用两个头对头(入口对入口,也即出口对出口)的栈实现(并不唯一)
class wheel {
public:
std::string scroll_up() {
if (up_.empty())
return std::string();
down_.push(up_.top());
up_.pop();
return up_.empty() ? std::string() : up_.top();
}
std::string scroll_down() {
if (down_.empty())
return std::string();
up_.push(down_.top());
down_.pop();
return up_.top();
}
void reset() {
while (!down_.empty()) {
up_.push(down_.top());
down_.pop();
}
}
std::string& top() {
reset();
// if up_.empty() raise;
return up_.top();
}
void push(const std::string& page) {
reset();
up_.push(page);
}
void pop() {
reset();
if (!up_.empty()) {
up_.pop();
}
}
private:
std::stack<std::string> up_;
std::stack<std::string> down_;
};
3.使用无阻塞输入
做这个东西要么输入时不用缓冲区,要么用键盘监控。
但是不知道在用终端ssh连接centos时能不能监听键盘事件。