kakoune/src/window.hh
Maxime Coste 1e38045d70 Only make cursor visible after buffer or selection change
Kakoune now does not touch cursors when scrolling. It checks
if either the buffer or selections has been modified since
last redraw.

Fixes #4124
Fixes #2844
2023-08-16 21:02:42 +10:00

91 lines
2.4 KiB
C++

#ifndef window_hh_INCLUDED
#define window_hh_INCLUDED
#include "client.hh"
#include "display_buffer.hh"
#include "highlighter_group.hh"
#include "option_manager.hh"
#include "optional.hh"
#include "safe_ptr.hh"
#include "scope.hh"
namespace Kakoune
{
enum class Hook;
// A Window is a view onto a Buffer
class Window final : public SafeCountable, public Scope, private OptionManagerWatcher
{
public:
Window(Buffer& buffer);
~Window();
const DisplayCoord& position() const { return m_position; }
void set_position(DisplayCoord position);
const DisplayCoord& dimensions() const { return m_dimensions; }
void set_dimensions(DisplayCoord dimensions);
void scroll(LineCount offset);
void center_line(LineCount buffer_line);
void display_line_at(LineCount buffer_line, LineCount display_line);
void scroll(ColumnCount offset);
void center_column(ColumnCount buffer_column);
void display_column_at(ColumnCount buffer_column, ColumnCount display_column);
const DisplayBuffer& update_display_buffer(const Context& context);
Optional<DisplayCoord> display_position(BufferCoord coord) const;
BufferCoord buffer_coord(DisplayCoord coord) const;
Buffer& buffer() const { return *m_buffer; }
bool needs_redraw(const Context& context) const;
void force_redraw() { m_last_setup.dimensions = {}; }
void set_client(Client* client) { m_client = client; }
void clear_display_buffer();
void run_resize_hook_ifn();
DisplaySetup compute_display_setup(const Context& context) const;
private:
Window(const Window&) = delete;
void on_option_changed(const Option& option) override;
friend class ClientManager;
void run_hook_in_own_context(Hook hook, StringView param,
String client_name = "");
bool should_make_cursor_visible(const Context& context) const;
SafePtr<Buffer> m_buffer;
SafePtr<Client> m_client;
DisplayCoord m_position;
DisplayCoord m_dimensions;
DisplayBuffer m_display_buffer;
Highlighters m_builtin_highlighters;
bool m_resize_hook_pending = false;
struct Setup
{
DisplayCoord position;
DisplayCoord dimensions;
size_t timestamp;
size_t faces_hash;
size_t main_selection;
Vector<BasicSelection, MemoryDomain::Display> selections;
};
Setup build_setup(const Context& context) const;
Setup m_last_setup;
};
}
#endif // window_hh_INCLUDED