Move status/mode line drawing as a separate ui method

This commit is contained in:
Maxime Coste 2015-06-17 21:28:02 +01:00
parent 7417c5e9e2
commit bf46870ff2
8 changed files with 67 additions and 38 deletions

View File

@ -146,25 +146,29 @@ void Client::change_buffer(Buffer& buffer)
void Client::redraw_ifn()
{
DisplayLine mode_line = generate_mode_line();
const bool buffer_changed = context().window().timestamp() != context().buffer().timestamp();
const bool mode_line_changed = mode_line.atoms() != m_mode_line.atoms();
const bool status_line_changed = m_status_line.atoms() != m_pending_status_line.atoms();
if (buffer_changed or status_line_changed or mode_line_changed)
Face default_face = get_face("Default");
if (context().window().timestamp() != context().buffer().timestamp())
{
CharCoord dimensions = context().ui().dimensions();
if (dimensions == CharCoord{0,0})
return;
context().window().set_dimensions(dimensions);
context().window().update_display_buffer(context());
context().ui().draw(context().window().display_buffer(), default_face);
}
DisplayLine mode_line = generate_mode_line();
if (m_status_line.atoms() != m_pending_status_line.atoms() or
mode_line.atoms() != m_mode_line.atoms())
{
if (buffer_changed)
{
CharCoord dimensions = context().ui().dimensions();
if (dimensions == CharCoord{0,0})
return;
context().window().set_dimensions(dimensions);
context().window().update_display_buffer(context());
}
m_mode_line = std::move(mode_line);
m_status_line = m_pending_status_line;
context().ui().draw(context().window().display_buffer(),
m_status_line, m_mode_line);
context().ui().draw_status(m_status_line, m_mode_line, default_face);
}
context().ui().refresh();
}

View File

@ -149,13 +149,9 @@ public:
void optimize();
void compute_range();
void set_default_face(const Face& face) { m_default_face = face; }
const Face& default_face() const { return m_default_face; }
private:
LineList m_lines;
BufferRange m_range;
Face m_default_face;
};
}

View File

@ -338,7 +338,8 @@ public:
void info_show(StringView, StringView, CharCoord, Face, InfoStyle) override {}
void info_hide() override {}
void draw(const DisplayBuffer&, const DisplayLine&, const DisplayLine&) override {}
void draw(const DisplayBuffer&, const Face&) override {}
void draw_status(const DisplayLine&, const DisplayLine&, const Face&) override {}
CharCoord dimensions() override { return {24,80}; }
bool is_key_available() override { return false; }
Key get_key() override { return Key::Invalid; }

View File

@ -368,10 +368,8 @@ void NCursesUI::draw_line(const DisplayLine& line, CharCount col_index,
}
void NCursesUI::draw(const DisplayBuffer& display_buffer,
const DisplayLine& status_line,
const DisplayLine& mode_line)
const Face& default_face)
{
const Face& default_face = display_buffer.default_face();
wbkgdset(m_window, COLOR_PAIR(get_color_pair(default_face)));
check_resize();
@ -393,6 +391,13 @@ void NCursesUI::draw(const DisplayBuffer& display_buffer,
waddch(m_window, '~');
}
m_dirty = true;
}
void NCursesUI::draw_status(const DisplayLine& status_line,
const DisplayLine& mode_line,
const Face& default_face)
{
int status_line_pos = m_status_on_top ? 0 : (int)m_dimensions.line;
wmove(m_window, status_line_pos, 0);
wclrtoeol(m_window);

View File

@ -22,11 +22,14 @@ public:
NCursesUI& operator=(const NCursesUI&) = delete;
void draw(const DisplayBuffer& display_buffer,
const DisplayLine& status_line,
const DisplayLine& mode_line) override;
const Face& default_face) override;
bool is_key_available() override;
Key get_key() override;
void draw_status(const DisplayLine& status_line,
const DisplayLine& mode_line,
const Face& default_face) override;
bool is_key_available() override;
Key get_key() override;
void menu_show(ConstArrayView<String> items,
CharCoord anchor, Face fg, Face bg,

View File

@ -26,6 +26,7 @@ enum class RemoteUIMsg
InfoShow,
InfoHide,
Draw,
DrawStatus,
Refresh,
SetOptions
};
@ -123,7 +124,6 @@ public:
void write(const DisplayBuffer& display_buffer)
{
write(display_buffer.default_face());
write(display_buffer.lines());
}
@ -226,7 +226,6 @@ template<>
DisplayBuffer read<DisplayBuffer>(int socket)
{
DisplayBuffer db;
db.set_default_face(read<Face>(socket));
db.lines() = read_vector<DisplayLine>(socket);
return db;
}
@ -263,8 +262,11 @@ public:
void info_hide() override;
void draw(const DisplayBuffer& display_buffer,
const DisplayLine& status_line,
const DisplayLine& mode_line) override;
const Face& default_face) override;
void draw_status(const DisplayLine& status_line,
const DisplayLine& mode_line,
const Face& default_face) override;
void refresh() override;
@ -344,14 +346,23 @@ void RemoteUI::info_hide()
}
void RemoteUI::draw(const DisplayBuffer& display_buffer,
const DisplayLine& status_line,
const DisplayLine& mode_line)
const Face& default_face)
{
Message msg(m_socket_watcher.fd());
msg.write(RemoteUIMsg::Draw);
msg.write(display_buffer);
msg.write(default_face);
}
void RemoteUI::draw_status(const DisplayLine& status_line,
const DisplayLine& mode_line,
const Face& default_face)
{
Message msg(m_socket_watcher.fd());
msg.write(RemoteUIMsg::DrawStatus);
msg.write(status_line);
msg.write(mode_line);
msg.write(default_face);
}
void RemoteUI::refresh()
@ -510,9 +521,16 @@ void RemoteClient::process_next_message()
case RemoteUIMsg::Draw:
{
auto display_buffer = read<DisplayBuffer>(socket);
auto default_face = read<Face>(socket);
m_ui->draw(display_buffer, default_face);
break;
}
case RemoteUIMsg::DrawStatus:
{
auto status_line = read<DisplayLine>(socket);
auto mode_line = read<DisplayLine>(socket);
m_ui->draw(display_buffer, status_line, mode_line);
auto default_face = read<Face>(socket);
m_ui->draw_status(status_line, mode_line, default_face);
break;
}
case RemoteUIMsg::Refresh:

View File

@ -53,8 +53,12 @@ public:
virtual void info_hide() = 0;
virtual void draw(const DisplayBuffer& display_buffer,
const DisplayLine& status_line,
const DisplayLine& mode_line) = 0;
const Face& default_face) = 0;
virtual void draw_status(const DisplayLine& status_line,
const DisplayLine& mode_line,
const Face& default_face) = 0;
virtual CharCoord dimensions() = 0;
virtual bool is_key_available() = 0;
virtual Key get_key() = 0;

View File

@ -2,7 +2,6 @@
#include "assert.hh"
#include "context.hh"
#include "face_registry.hh"
#include "highlighter.hh"
#include "hook_manager.hh"
#include "client.hh"
@ -66,7 +65,6 @@ void Window::update_display_buffer(const Context& context)
kak_assert(&buffer() == &context.buffer());
scroll_to_keep_selection_visible_ifn(context);
m_display_buffer.set_default_face(get_face("Default"));
DisplayBuffer::LineList& lines = m_display_buffer.lines();
lines.clear();