Handle all available input before redrawing

This commit is contained in:
Maxime Coste 2012-10-28 09:26:54 +01:00
parent 13a081ed4a
commit d9729cc29e
9 changed files with 40 additions and 10 deletions

View File

@ -654,7 +654,7 @@ public:
assert(m_pos < m_keys.size()); assert(m_pos < m_keys.size());
return m_keys[m_pos++]; return m_keys[m_pos++];
} }
bool has_key_left() const { return m_pos < m_keys.size(); } bool is_key_available() override { return m_pos < m_keys.size(); }
void print_status(const String& , CharCount) override {} void print_status(const String& , CharCount) override {}
void draw(const DisplayBuffer&, const String&) override {} void draw(const DisplayBuffer&, const String&) override {}
@ -681,8 +681,7 @@ void exec_keys(const KeyList& keys, Context& context)
scoped_edition edition(context.editor()); scoped_edition edition(context.editor());
Context new_context(batch_input_handler, context.editor(), batch_ui); Context new_context(batch_input_handler, context.editor(), batch_ui);
while (batch_ui.has_key_left()) batch_input_handler.handle_available_inputs(new_context);
batch_input_handler.handle_next_input(new_context);
context.change_editor(new_context.editor()); context.change_editor(new_context.editor());
} }

View File

@ -625,11 +625,14 @@ void InputHandler::on_next_key(KeyCallback callback)
m_mode.reset(new InputModes::NextKey(*this, callback)); m_mode.reset(new InputModes::NextKey(*this, callback));
} }
void InputHandler::handle_next_input(Context& context) void InputHandler::handle_available_inputs(Context& context)
{ {
Key key = context.ui().get_key(); while (context.ui().is_key_available())
if (key != Key::Invalid) {
m_mode->on_key(key, context); Key key = context.ui().get_key();
if (key != Key::Invalid)
m_mode->on_key(key, context);
}
context.draw_ifn(); context.draw_ifn();
} }

View File

@ -36,7 +36,7 @@ public:
void on_next_key(KeyCallback callback); void on_next_key(KeyCallback callback);
void handle_next_input(Context& context); void handle_available_inputs(Context& context);
private: private:
friend class InputMode; friend class InputMode;

View File

@ -529,7 +529,7 @@ Client create_local_client(const String& file)
EventManager::instance().watch(0, [=](int) { EventManager::instance().watch(0, [=](int) {
try try
{ {
input_handler->handle_next_input(*context); input_handler->handle_available_inputs(*context);
} }
catch (Kakoune::runtime_error& error) catch (Kakoune::runtime_error& error)
{ {
@ -573,7 +573,7 @@ void setup_server()
EventManager::instance().watch(sock, [=](int) { EventManager::instance().watch(sock, [=](int) {
try try
{ {
input_handler->handle_next_input(*context); input_handler->handle_available_inputs(*context);
} }
catch (Kakoune::runtime_error& error) catch (Kakoune::runtime_error& error)
{ {

View File

@ -211,6 +211,16 @@ struct getch_iterator
getch_iterator& operator++(int) { return *this; } getch_iterator& operator++(int) { return *this; }
}; };
bool NCursesUI::is_key_available()
{
timeout(0);
const int c = getch();
if (c != ERR)
ungetch(c);
timeout(-1);
return c != ERR;
}
Key NCursesUI::get_key() Key NCursesUI::get_key()
{ {
const unsigned c = getch(); const unsigned c = getch();

View File

@ -23,6 +23,7 @@ public:
const String& status_line) override; const String& status_line) override;
void print_status(const String& status, CharCount cursor_pos) override; void print_status(const String& status, CharCount cursor_pos) override;
bool is_key_available() override;
Key get_key() override; Key get_key() override;
void menu_show(const memoryview<String>& choices, void menu_show(const memoryview<String>& choices,

View File

@ -193,6 +193,20 @@ void RemoteUI::draw(const DisplayBuffer& display_buffer,
static const Key::Modifiers resize_modifier = (Key::Modifiers)0x80; static const Key::Modifiers resize_modifier = (Key::Modifiers)0x80;
bool RemoteUI::is_key_available()
{
timeval tv;
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(m_socket, &rfds);
tv.tv_sec = 0;
tv.tv_usec = 0;
int res = select(m_socket+1, &rfds, NULL, NULL, &tv);
return res == 1;
}
Key RemoteUI::get_key() Key RemoteUI::get_key()
{ {
Key key = read<Key>(m_socket); Key key = read<Key>(m_socket);

View File

@ -24,6 +24,8 @@ public:
void menu_hide() override; void menu_hide() override;
void draw(const DisplayBuffer& display_buffer, void draw(const DisplayBuffer& display_buffer,
const String& status_line) override; const String& status_line) override;
bool is_key_available() override;
Key get_key() override; Key get_key() override;
DisplayCoord dimensions() override; DisplayCoord dimensions() override;

View File

@ -31,6 +31,7 @@ public:
virtual void draw(const DisplayBuffer& display_buffer, virtual void draw(const DisplayBuffer& display_buffer,
const String& status_line) = 0; const String& status_line) = 0;
virtual DisplayCoord dimensions() = 0; virtual DisplayCoord dimensions() = 0;
virtual bool is_key_available() = 0;
virtual Key get_key() = 0; virtual Key get_key() = 0;
}; };