Delay window deletion until we get back to main loop
Avoid WinResize hooks while redrawing, ensure window resize only take place while handling user input. Fixes #672
This commit is contained in:
parent
7f2b3f0132
commit
ba421e45f7
|
@ -109,6 +109,7 @@ void BufferManager::clear_buffer_trash()
|
||||||
// Do that again, to be tolerant in some corner cases, where a buffer is
|
// Do that again, to be tolerant in some corner cases, where a buffer is
|
||||||
// deleted during its creation
|
// deleted during its creation
|
||||||
ClientManager::instance().ensure_no_client_uses_buffer(*buffer);
|
ClientManager::instance().ensure_no_client_uses_buffer(*buffer);
|
||||||
|
ClientManager::instance().clear_window_trash();
|
||||||
|
|
||||||
delete buffer;
|
delete buffer;
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,7 +85,7 @@ void Client::handle_available_input(EventMode mode)
|
||||||
else if (*key == Key::FocusOut)
|
else if (*key == Key::FocusOut)
|
||||||
context().hooks().run_hook("FocusOut", context().name(), context());
|
context().hooks().run_hook("FocusOut", context().name(), context());
|
||||||
else if (key->modifiers == Key::Modifiers::Resize)
|
else if (key->modifiers == Key::Modifiers::Resize)
|
||||||
force_redraw();
|
m_window->set_dimensions(m_ui->dimensions());
|
||||||
else
|
else
|
||||||
m_input_handler.handle_key(*key);
|
m_input_handler.handle_key(*key);
|
||||||
}
|
}
|
||||||
|
|
|
@ -143,9 +143,18 @@ void ClientManager::ensure_no_client_uses_buffer(Buffer& buffer)
|
||||||
auto end = std::remove_if(m_free_windows.begin(), m_free_windows.end(),
|
auto end = std::remove_if(m_free_windows.begin(), m_free_windows.end(),
|
||||||
[&buffer](const WindowAndSelections& ws)
|
[&buffer](const WindowAndSelections& ws)
|
||||||
{ return &ws.window->buffer() == &buffer; });
|
{ return &ws.window->buffer() == &buffer; });
|
||||||
|
|
||||||
|
for (auto it = end; it != m_free_windows.end(); ++it)
|
||||||
|
m_window_trash.push_back(std::move(it->window));
|
||||||
|
|
||||||
m_free_windows.erase(end, m_free_windows.end());
|
m_free_windows.erase(end, m_free_windows.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClientManager::clear_window_trash()
|
||||||
|
{
|
||||||
|
m_window_trash.clear();
|
||||||
|
}
|
||||||
|
|
||||||
bool ClientManager::validate_client_name(StringView name) const
|
bool ClientManager::validate_client_name(StringView name) const
|
||||||
{
|
{
|
||||||
return const_cast<ClientManager*>(this)->get_client_ifp(name) == nullptr;
|
return const_cast<ClientManager*>(this)->get_client_ifp(name) == nullptr;
|
||||||
|
|
|
@ -57,11 +57,13 @@ public:
|
||||||
CandidateList complete_client_name(StringView name,
|
CandidateList complete_client_name(StringView name,
|
||||||
ByteCount cursor_pos = -1) const;
|
ByteCount cursor_pos = -1) const;
|
||||||
|
|
||||||
|
void clear_window_trash();
|
||||||
private:
|
private:
|
||||||
String generate_name() const;
|
String generate_name() const;
|
||||||
|
|
||||||
ClientList m_clients;
|
ClientList m_clients;
|
||||||
Vector<WindowAndSelections, MemoryDomain::Client> m_free_windows;
|
Vector<WindowAndSelections, MemoryDomain::Client> m_free_windows;
|
||||||
|
Vector<std::unique_ptr<Window>> m_window_trash;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -580,6 +580,7 @@ int run_server(StringView session, StringView init_command,
|
||||||
client_manager.redraw_clients();
|
client_manager.redraw_clients();
|
||||||
event_manager.handle_next_events(EventMode::Normal);
|
event_manager.handle_next_events(EventMode::Normal);
|
||||||
client_manager.handle_pending_inputs();
|
client_manager.handle_pending_inputs();
|
||||||
|
client_manager.clear_window_trash();
|
||||||
buffer_manager.clear_buffer_trash();
|
buffer_manager.clear_buffer_trash();
|
||||||
string_registry.purge_unused();
|
string_registry.purge_unused();
|
||||||
|
|
||||||
|
|
|
@ -80,8 +80,7 @@ Window::Setup Window::build_setup(const Context& context) const
|
||||||
for (auto& sel : context.selections())
|
for (auto& sel : context.selections())
|
||||||
selections.push_back({sel.cursor(), sel.anchor()});
|
selections.push_back({sel.cursor(), sel.anchor()});
|
||||||
|
|
||||||
return { m_position,
|
return { m_position, m_dimensions,
|
||||||
context.client().dimensions(),
|
|
||||||
context.buffer().timestamp(),
|
context.buffer().timestamp(),
|
||||||
context.selections().main_index(),
|
context.selections().main_index(),
|
||||||
std::move(selections) };
|
std::move(selections) };
|
||||||
|
@ -92,7 +91,7 @@ bool Window::needs_redraw(const Context& context) const
|
||||||
auto& selections = context.selections();
|
auto& selections = context.selections();
|
||||||
|
|
||||||
if (m_position != m_last_setup.position or
|
if (m_position != m_last_setup.position or
|
||||||
context.client().dimensions() != m_last_setup.dimensions or
|
m_dimensions != m_last_setup.dimensions or
|
||||||
context.buffer().timestamp() != m_last_setup.timestamp or
|
context.buffer().timestamp() != m_last_setup.timestamp or
|
||||||
selections.main_index() != m_last_setup.main_selection or
|
selections.main_index() != m_last_setup.main_selection or
|
||||||
selections.size() != m_last_setup.selections.size())
|
selections.size() != m_last_setup.selections.size())
|
||||||
|
@ -120,7 +119,6 @@ const DisplayBuffer& Window::update_display_buffer(const Context& context)
|
||||||
DisplayBuffer::LineList& lines = m_display_buffer.lines();
|
DisplayBuffer::LineList& lines = m_display_buffer.lines();
|
||||||
lines.clear();
|
lines.clear();
|
||||||
|
|
||||||
set_dimensions(context.client().dimensions());
|
|
||||||
if (m_dimensions == CharCoord{0,0})
|
if (m_dimensions == CharCoord{0,0})
|
||||||
return m_display_buffer;
|
return m_display_buffer;
|
||||||
|
|
||||||
|
@ -365,9 +363,8 @@ void Window::clear_display_buffer()
|
||||||
|
|
||||||
void Window::on_option_changed(const Option& option)
|
void Window::on_option_changed(const Option& option)
|
||||||
{
|
{
|
||||||
run_hook_in_own_context("WinSetOption",
|
run_hook_in_own_context("WinSetOption", format("{}={}", option.name(),
|
||||||
format("{}={}", option.name(), option.get_as_string()));
|
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
|
||||||
force_redraw();
|
force_redraw();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user