summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2014-07-07 20:13:08 +0100
committerMaxime Coste <frrrwww@gmail.com>2014-07-07 23:56:17 +0100
commit55866b51d79db2539f37bfe32d65c3d3260c65f4 (patch)
tree0ca99bf116b566ad3082948190299528e211395e /src
parent90c2647c0bc4cc02e7dc10080f5a099fb89366d8 (diff)
Fix redrawing of windows when only the status line changes
Diffstat (limited to 'src')
-rw-r--r--src/client.cc21
-rw-r--r--src/client.hh1
-rw-r--r--src/display_buffer.hh7
3 files changed, 21 insertions, 8 deletions
diff --git a/src/client.cc b/src/client.cc
index 1569b860..a519c60c 100644
--- a/src/client.cc
+++ b/src/client.cc
@@ -88,16 +88,21 @@ void Client::change_buffer(Buffer& buffer)
void Client::redraw_ifn()
{
- if (context().window().timestamp() != context().buffer().timestamp())
+ DisplayLine mode_line = generate_mode_line();
+ const bool buffer_changed = context().window().timestamp() != context().buffer().timestamp();
+ if (buffer_changed or mode_line.atoms() != m_mode_line.atoms())
{
- CharCoord dimensions = context().ui().dimensions();
- if (dimensions == CharCoord{0,0})
- return;
- context().window().set_dimensions(dimensions);
- context().window().update_display_buffer(context());
-
+ 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);
context().ui().draw(context().window().display_buffer(),
- m_status_line, generate_mode_line());
+ m_status_line, m_mode_line);
}
context().ui().refresh();
}
diff --git a/src/client.hh b/src/client.hh
index 56b8504b..00ebe46d 100644
--- a/src/client.hh
+++ b/src/client.hh
@@ -53,6 +53,7 @@ private:
InputHandler m_input_handler;
DisplayLine m_status_line;
+ DisplayLine m_mode_line;
};
}
diff --git a/src/display_buffer.hh b/src/display_buffer.hh
index db70d840..c0d34dda 100644
--- a/src/display_buffer.hh
+++ b/src/display_buffer.hh
@@ -105,6 +105,13 @@ public:
void trim_end(CharCount count);
void check_invariant() const;
+
+ bool operator==(const DisplayAtom& other) const
+ {
+ return colors == other.colors or attribute == other.attribute or
+ content() == other.content();
+ }
+
public:
ColorPair colors = {Colors::Default, Colors::Default};
Attribute attribute = Normal;