Rework window redraw handling, should redraw window less often
This commit is contained in:
parent
7c22ff217d
commit
3834440298
|
@ -70,10 +70,7 @@ void Client::handle_available_input(EventMode mode)
|
||||||
if (*key == ctrl('c'))
|
if (*key == ctrl('c'))
|
||||||
killpg(getpgrp(), SIGINT);
|
killpg(getpgrp(), SIGINT);
|
||||||
else
|
else
|
||||||
{
|
|
||||||
m_input_handler.handle_key(*key);
|
m_input_handler.handle_key(*key);
|
||||||
context().window().forget_timestamp();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Kakoune::runtime_error& error)
|
catch (Kakoune::runtime_error& error)
|
||||||
|
@ -148,12 +145,8 @@ void Client::redraw_ifn()
|
||||||
{
|
{
|
||||||
Face default_face = get_face("Default");
|
Face default_face = get_face("Default");
|
||||||
|
|
||||||
if (context().window().timestamp() != context().buffer().timestamp())
|
if (context().window().needs_redraw(context()))
|
||||||
{
|
{
|
||||||
CharCoord dimensions = context().ui().dimensions();
|
|
||||||
if (dimensions == CharCoord{0,0})
|
|
||||||
return;
|
|
||||||
context().window().set_dimensions(dimensions);
|
|
||||||
context().window().update_display_buffer(context());
|
context().window().update_display_buffer(context());
|
||||||
|
|
||||||
context().ui().draw(context().window().display_buffer(), default_face);
|
context().ui().draw(context().window().display_buffer(), default_face);
|
||||||
|
|
|
@ -86,7 +86,7 @@ WindowAndSelections ClientManager::get_free_window(Buffer& buffer)
|
||||||
if (it == m_free_windows.rend())
|
if (it == m_free_windows.rend())
|
||||||
return { make_unique<Window>(buffer), { buffer, Selection{} } };
|
return { make_unique<Window>(buffer), { buffer, Selection{} } };
|
||||||
|
|
||||||
it->window->forget_timestamp();
|
it->window->force_redraw();
|
||||||
WindowAndSelections res = std::move(*it);
|
WindowAndSelections res = std::move(*it);
|
||||||
m_free_windows.erase(it.base()-1);
|
m_free_windows.erase(it.base()-1);
|
||||||
res.selections.update();
|
res.selections.update();
|
||||||
|
|
|
@ -1244,10 +1244,6 @@ void context_wrap(const ParametersParser& parser, Context& context, Func func)
|
||||||
|
|
||||||
func(parser, *real_context);
|
func(parser, *real_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
// force redraw of this client window
|
|
||||||
if (real_context != &context and real_context->has_window())
|
|
||||||
real_context->window().forget_timestamp();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const CommandDesc exec_string_cmd = {
|
const CommandDesc exec_string_cmd = {
|
||||||
|
|
|
@ -686,6 +686,10 @@ void use_selection_as_search_pattern(Context& context, NormalParams)
|
||||||
get_face("Information") });
|
get_face("Information") });
|
||||||
}
|
}
|
||||||
RegisterManager::instance()['/'] = patterns;
|
RegisterManager::instance()['/'] = patterns;
|
||||||
|
|
||||||
|
// Hack, as Window do not take register state into account
|
||||||
|
if (context.has_window())
|
||||||
|
context.window().force_redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
void select_regex(Context& context, NormalParams)
|
void select_regex(Context& context, NormalParams)
|
||||||
|
|
|
@ -4,7 +4,8 @@
|
||||||
#include "context.hh"
|
#include "context.hh"
|
||||||
#include "highlighter.hh"
|
#include "highlighter.hh"
|
||||||
#include "hook_manager.hh"
|
#include "hook_manager.hh"
|
||||||
#include "client.hh"
|
#include "input_handler.hh"
|
||||||
|
#include "user_interface.hh"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
@ -60,14 +61,36 @@ void Window::scroll(CharCount offset)
|
||||||
m_position.column = std::max(0_char, m_position.column + offset);
|
m_position.column = std::max(0_char, m_position.column + offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t Window::compute_hash(const Context& context) const
|
||||||
|
{
|
||||||
|
size_t res = hash_values(m_position, context.ui().dimensions(), context.buffer().timestamp());
|
||||||
|
|
||||||
|
auto& selections = context.selections();
|
||||||
|
res = combine_hash(res, hash_value(selections.main_index()));
|
||||||
|
for (auto& sel : selections)
|
||||||
|
res = combine_hash(res, hash_values((const ByteCoord&)sel.cursor(), sel.anchor()));
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Window::needs_redraw(const Context& context) const
|
||||||
|
{
|
||||||
|
size_t hash = compute_hash(context);
|
||||||
|
return hash != m_hash;
|
||||||
|
}
|
||||||
|
|
||||||
void Window::update_display_buffer(const Context& context)
|
void Window::update_display_buffer(const Context& context)
|
||||||
{
|
{
|
||||||
kak_assert(&buffer() == &context.buffer());
|
|
||||||
scroll_to_keep_selection_visible_ifn(context);
|
|
||||||
|
|
||||||
DisplayBuffer::LineList& lines = m_display_buffer.lines();
|
DisplayBuffer::LineList& lines = m_display_buffer.lines();
|
||||||
lines.clear();
|
lines.clear();
|
||||||
|
|
||||||
|
m_dimensions = context.ui().dimensions();
|
||||||
|
if (m_dimensions == CharCoord{0,0})
|
||||||
|
return;
|
||||||
|
|
||||||
|
kak_assert(&buffer() == &context.buffer());
|
||||||
|
scroll_to_keep_selection_visible_ifn(context);
|
||||||
|
|
||||||
for (LineCount line = 0; line < m_dimensions.line; ++line)
|
for (LineCount line = 0; line < m_dimensions.line; ++line)
|
||||||
{
|
{
|
||||||
LineCount buffer_line = m_position.line + line;
|
LineCount buffer_line = m_position.line + line;
|
||||||
|
@ -86,7 +109,7 @@ void Window::update_display_buffer(const Context& context)
|
||||||
line.trim(m_position.column, m_dimensions.column, true);
|
line.trim(m_position.column, m_dimensions.column, true);
|
||||||
m_display_buffer.optimize();
|
m_display_buffer.optimize();
|
||||||
|
|
||||||
m_timestamp = buffer().timestamp();
|
m_hash = compute_hash(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::set_position(CharCoord position)
|
void Window::set_position(CharCoord position)
|
||||||
|
@ -294,7 +317,7 @@ void Window::on_option_changed(const Option& option)
|
||||||
format("{}={}", option.name(), option.get_as_string()));
|
format("{}={}", option.name(), option.get_as_string()));
|
||||||
|
|
||||||
// an highlighter might depend on the option, so we need to redraw
|
// an highlighter might depend on the option, so we need to redraw
|
||||||
forget_timestamp();
|
force_redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -38,8 +38,8 @@ public:
|
||||||
|
|
||||||
Buffer& buffer() const { return *m_buffer; }
|
Buffer& buffer() const { return *m_buffer; }
|
||||||
|
|
||||||
size_t timestamp() const { return m_timestamp; }
|
bool needs_redraw(const Context& context) const;
|
||||||
void forget_timestamp() { m_timestamp = -1; }
|
void force_redraw() { m_hash = -1; }
|
||||||
|
|
||||||
ByteCoord offset_coord(ByteCoord coord, CharCount offset);
|
ByteCoord offset_coord(ByteCoord coord, CharCount offset);
|
||||||
ByteCoordAndTarget offset_coord(ByteCoordAndTarget coord, LineCount offset);
|
ByteCoordAndTarget offset_coord(ByteCoordAndTarget coord, LineCount offset);
|
||||||
|
@ -53,6 +53,8 @@ private:
|
||||||
|
|
||||||
void run_hook_in_own_context(StringView hook_name, StringView param);
|
void run_hook_in_own_context(StringView hook_name, StringView param);
|
||||||
|
|
||||||
|
size_t compute_hash(const Context& context) const;
|
||||||
|
|
||||||
SafePtr<Buffer> m_buffer;
|
SafePtr<Buffer> m_buffer;
|
||||||
|
|
||||||
CharCoord m_position;
|
CharCoord m_position;
|
||||||
|
@ -62,7 +64,8 @@ private:
|
||||||
HighlighterGroup m_highlighters;
|
HighlighterGroup m_highlighters;
|
||||||
HighlighterGroup m_builtin_highlighters;
|
HighlighterGroup m_builtin_highlighters;
|
||||||
|
|
||||||
size_t m_timestamp = -1;
|
// hash used to determine if a redraw is necessary
|
||||||
|
size_t m_hash = -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user