Handle <c-l> redrawing on the server side

That way we can force a redraw at any moment, including during
batch execution.
This commit is contained in:
Maxime Coste 2016-03-07 13:54:20 +00:00
parent 26e81976d3
commit f1fb2114da
9 changed files with 24 additions and 23 deletions

View File

@ -77,6 +77,8 @@ void Client::handle_available_input(EventMode mode)
{ {
if (*key == ctrl('c')) if (*key == ctrl('c'))
killpg(getpgrp(), SIGINT); killpg(getpgrp(), SIGINT);
if (*key == ctrl('l'))
redraw_ifn(true);
else if (*key == Key::FocusIn) else if (*key == Key::FocusIn)
context().hooks().run_hook("FocusIn", context().name(), context()); context().hooks().run_hook("FocusIn", context().name(), context());
else if (*key == Key::FocusOut) else if (*key == Key::FocusOut)
@ -171,18 +173,18 @@ static bool is_inline(InfoStyle style)
style == InfoStyle::InlineBelow; style == InfoStyle::InlineBelow;
} }
void Client::redraw_ifn() void Client::redraw_ifn(bool force)
{ {
Window& window = context().window(); Window& window = context().window();
const bool needs_redraw = window.needs_redraw(context()); const bool needs_redraw = window.needs_redraw(context());
if (needs_redraw) if (needs_redraw or force)
{ {
auto window_pos = window.position(); auto window_pos = window.position();
m_ui->draw(window.update_display_buffer(context()), get_face("Default")); m_ui->draw(window.update_display_buffer(context()), get_face("Default"));
// window moved, reanchor eventual menu and info // window moved, reanchor eventual menu and info
if (window_pos != window.position()) if (force or window_pos != window.position())
{ {
if (not m_menu.items.empty() and m_menu.style == MenuStyle::Inline) if (not m_menu.items.empty() and m_menu.style == MenuStyle::Inline)
{ {
@ -199,7 +201,7 @@ void Client::redraw_ifn()
} }
DisplayLine mode_line = generate_mode_line(); DisplayLine mode_line = generate_mode_line();
if (needs_redraw or if (force or needs_redraw or
m_status_line.atoms() != m_pending_status_line.atoms() or m_status_line.atoms() != m_pending_status_line.atoms() or
mode_line.atoms() != m_mode_line.atoms()) mode_line.atoms() != m_mode_line.atoms())
{ {
@ -210,10 +212,10 @@ void Client::redraw_ifn()
m_ui_dirty = true; m_ui_dirty = true;
} }
if (m_ui_dirty) if (m_ui_dirty or force)
{ {
m_ui_dirty = false; m_ui_dirty = false;
m_ui->refresh(); m_ui->refresh(force);
} }
} }

View File

@ -46,7 +46,7 @@ public:
CharCoord dimensions() const { return m_ui->dimensions(); } CharCoord dimensions() const { return m_ui->dimensions(); }
void force_redraw(); void force_redraw();
void redraw_ifn(); void redraw_ifn(bool force = false);
void check_if_buffer_needs_reloading(); void check_if_buffer_needs_reloading();

View File

@ -197,9 +197,9 @@ void JsonUI::info_hide()
rpc_call("info_hide"); rpc_call("info_hide");
} }
void JsonUI::refresh() void JsonUI::refresh(bool force)
{ {
rpc_call("refresh"); rpc_call("refresh", force);
} }
void JsonUI::set_input_callback(InputCallback callback) void JsonUI::set_input_callback(InputCallback callback)

View File

@ -39,7 +39,7 @@ public:
InfoStyle style) override; InfoStyle style) override;
void info_hide() override; void info_hide() override;
void refresh() override; void refresh(bool force) override;
void set_input_callback(InputCallback callback) override; void set_input_callback(InputCallback callback) override;

View File

@ -296,7 +296,7 @@ std::unique_ptr<UserInterface> create_local_ui(bool dummy_ui)
CharCoord dimensions() override { return {24,80}; } CharCoord dimensions() override { return {24,80}; }
bool is_key_available() override { return false; } bool is_key_available() override { return false; }
Key get_key() override { return Key::Invalid; } Key get_key() override { return Key::Invalid; }
void refresh() override {} void refresh(bool) override {}
void set_input_callback(InputCallback) override {} void set_input_callback(InputCallback) override {}
void set_ui_options(const Options&) override {} void set_ui_options(const Options&) override {}
}; };

View File

@ -301,9 +301,12 @@ void NCursesUI::redraw()
doupdate(); doupdate();
} }
void NCursesUI::refresh() void NCursesUI::refresh(bool force)
{ {
if (m_dirty) if (force)
redrawwin(m_window);
if (m_dirty or force)
redraw(); redraw();
m_dirty = false; m_dirty = false;
} }
@ -491,11 +494,6 @@ Key NCursesUI::get_key()
if (c > 0 and c < 27) if (c > 0 and c < 27)
{ {
if (c == control('l'))
{
redrawwin(m_window);
redraw();
}
if (c == control('z')) if (c == control('z'))
{ {
raise(SIGTSTP); raise(SIGTSTP);

View File

@ -43,7 +43,7 @@ public:
InfoStyle style) override; InfoStyle style) override;
void info_hide() override; void info_hide() override;
void refresh() override; void refresh(bool force) override;
void set_input_callback(InputCallback callback) override; void set_input_callback(InputCallback callback) override;

View File

@ -255,7 +255,7 @@ public:
const DisplayLine& mode_line, const DisplayLine& mode_line,
const Face& default_face) override; const Face& default_face) override;
void refresh() override; void refresh(bool force) override;
bool is_key_available() override; bool is_key_available() override;
Key get_key() override; Key get_key() override;
@ -353,10 +353,11 @@ void RemoteUI::draw_status(const DisplayLine& status_line,
msg.write(default_face); msg.write(default_face);
} }
void RemoteUI::refresh() void RemoteUI::refresh(bool force)
{ {
Message msg(m_socket_watcher.fd()); Message msg(m_socket_watcher.fd());
msg.write(RemoteUIMsg::Refresh); msg.write(RemoteUIMsg::Refresh);
msg.write(force);
} }
void RemoteUI::set_ui_options(const Options& options) void RemoteUI::set_ui_options(const Options& options)
@ -516,7 +517,7 @@ void RemoteClient::process_next_message()
break; break;
} }
case RemoteUIMsg::Refresh: case RemoteUIMsg::Refresh:
m_ui->refresh(); m_ui->refresh(read<bool>(socket));
break; break;
case RemoteUIMsg::SetOptions: case RemoteUIMsg::SetOptions:
m_ui->set_ui_options(read_idmap<String, MemoryDomain::Options>(socket)); m_ui->set_ui_options(read_idmap<String, MemoryDomain::Options>(socket));

View File

@ -63,7 +63,7 @@ public:
virtual bool is_key_available() = 0; virtual bool is_key_available() = 0;
virtual Key get_key() = 0; virtual Key get_key() = 0;
virtual void refresh() = 0; virtual void refresh(bool force) = 0;
virtual void set_input_callback(InputCallback callback) = 0; virtual void set_input_callback(InputCallback callback) = 0;