Add ui_options option for UserInterface configuration
ui_options is a std::unordered_map<String, String> that gets forwarded to the user interface. Add support ncurses_status_on_top.
This commit is contained in:
parent
d803333e73
commit
b2407d9dfa
|
@ -24,10 +24,14 @@ Client::Client(std::unique_ptr<UserInterface>&& ui,
|
||||||
{
|
{
|
||||||
context().set_client(*this);
|
context().set_client(*this);
|
||||||
context().set_window(*m_window);
|
context().set_window(*m_window);
|
||||||
|
|
||||||
|
m_window->options().register_watcher(*this);
|
||||||
|
m_ui->set_ui_options(m_window->options()["ui_options"].get<UserInterface::Options>());
|
||||||
}
|
}
|
||||||
|
|
||||||
Client::~Client()
|
Client::~Client()
|
||||||
{
|
{
|
||||||
|
m_window->options().unregister_watcher(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::handle_available_input()
|
void Client::handle_available_input()
|
||||||
|
@ -77,13 +81,19 @@ DisplayLine Client::generate_mode_line() const
|
||||||
void Client::change_buffer(Buffer& buffer)
|
void Client::change_buffer(Buffer& buffer)
|
||||||
{
|
{
|
||||||
auto& client_manager = ClientManager::instance();
|
auto& client_manager = ClientManager::instance();
|
||||||
|
m_window->options().unregister_watcher(*this);
|
||||||
client_manager.add_free_window(std::move(m_window),
|
client_manager.add_free_window(std::move(m_window),
|
||||||
std::move(context().selections()));
|
std::move(context().selections()));
|
||||||
WindowAndSelections ws = client_manager.get_free_window(buffer);
|
WindowAndSelections ws = client_manager.get_free_window(buffer);
|
||||||
|
|
||||||
m_window = std::move(ws.window);
|
m_window = std::move(ws.window);
|
||||||
|
m_window->options().register_watcher(*this);
|
||||||
|
m_ui->set_ui_options(m_window->options()["ui_options"].get<UserInterface::Options>());
|
||||||
|
|
||||||
context().m_selections = std::move(ws.selections);
|
context().m_selections = std::move(ws.selections);
|
||||||
context().set_window(*m_window);
|
context().set_window(*m_window);
|
||||||
m_window->set_dimensions(ui().dimensions());
|
m_window->set_dimensions(ui().dimensions());
|
||||||
|
|
||||||
m_window->hooks().run_hook("WinDisplay", buffer.name(), context());
|
m_window->hooks().run_hook("WinDisplay", buffer.name(), context());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,4 +191,10 @@ const String& Client::get_env_var(const String& name) const
|
||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Client::on_option_changed(const Option& option)
|
||||||
|
{
|
||||||
|
if (option.name() == "ui_options")
|
||||||
|
m_ui->set_ui_options(option.get<UserInterface::Options>());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include "safe_ptr.hh"
|
#include "safe_ptr.hh"
|
||||||
#include "string.hh"
|
#include "string.hh"
|
||||||
#include "utils.hh"
|
#include "utils.hh"
|
||||||
|
#include "option_manager.hh"
|
||||||
|
|
||||||
namespace Kakoune
|
namespace Kakoune
|
||||||
{
|
{
|
||||||
|
@ -14,7 +15,7 @@ namespace Kakoune
|
||||||
class UserInterface;
|
class UserInterface;
|
||||||
class Window;
|
class Window;
|
||||||
|
|
||||||
class Client : public SafeCountable
|
class Client : public SafeCountable, public OptionManagerWatcher
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Client(std::unique_ptr<UserInterface>&& ui,
|
Client(std::unique_ptr<UserInterface>&& ui,
|
||||||
|
@ -24,6 +25,8 @@ public:
|
||||||
String name);
|
String name);
|
||||||
~Client();
|
~Client();
|
||||||
|
|
||||||
|
Client(Client&&) = delete;
|
||||||
|
|
||||||
// handle all the keys currently available in the user interface
|
// handle all the keys currently available in the user interface
|
||||||
void handle_available_input();
|
void handle_available_input();
|
||||||
|
|
||||||
|
@ -47,6 +50,8 @@ public:
|
||||||
const String& get_env_var(const String& name) const;
|
const String& get_env_var(const String& name) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void on_option_changed(const Option& option) override;
|
||||||
|
|
||||||
DisplayLine generate_mode_line() const;
|
DisplayLine generate_mode_line() const;
|
||||||
|
|
||||||
std::unique_ptr<UserInterface> m_ui;
|
std::unique_ptr<UserInterface> m_ui;
|
||||||
|
|
|
@ -229,6 +229,9 @@ void register_options()
|
||||||
reg.declare_option("autoreload",
|
reg.declare_option("autoreload",
|
||||||
"autoreload buffer when a filesystem modification is detected",
|
"autoreload buffer when a filesystem modification is detected",
|
||||||
Ask);
|
Ask);
|
||||||
|
reg.declare_option("ui_options",
|
||||||
|
"options passed to UI as a string map",
|
||||||
|
UserInterface::Options());
|
||||||
}
|
}
|
||||||
|
|
||||||
void create_local_client(const String& init_command)
|
void create_local_client(const String& init_command)
|
||||||
|
|
|
@ -25,8 +25,6 @@
|
||||||
namespace Kakoune
|
namespace Kakoune
|
||||||
{
|
{
|
||||||
|
|
||||||
constexpr bool status_on_top = true;
|
|
||||||
|
|
||||||
using std::min;
|
using std::min;
|
||||||
using std::max;
|
using std::max;
|
||||||
|
|
||||||
|
@ -337,7 +335,7 @@ void NCursesUI::draw(const DisplayBuffer& display_buffer,
|
||||||
{
|
{
|
||||||
check_resize();
|
check_resize();
|
||||||
|
|
||||||
LineCount line_index = status_on_top ? 1 : 0;
|
LineCount line_index = m_status_on_top ? 1 : 0;
|
||||||
for (const DisplayLine& line : display_buffer.lines())
|
for (const DisplayLine& line : display_buffer.lines())
|
||||||
{
|
{
|
||||||
wmove(m_window, (int)line_index, 0);
|
wmove(m_window, (int)line_index, 0);
|
||||||
|
@ -347,14 +345,14 @@ void NCursesUI::draw(const DisplayBuffer& display_buffer,
|
||||||
}
|
}
|
||||||
|
|
||||||
set_face(m_window, { Colors::Blue, Colors::Default });
|
set_face(m_window, { Colors::Blue, Colors::Default });
|
||||||
while (line_index < m_dimensions.line + (status_on_top ? 1 : 0))
|
while (line_index < m_dimensions.line + (m_status_on_top ? 1 : 0))
|
||||||
{
|
{
|
||||||
wmove(m_window, (int)line_index++, 0);
|
wmove(m_window, (int)line_index++, 0);
|
||||||
wclrtoeol(m_window);
|
wclrtoeol(m_window);
|
||||||
waddch(m_window, '~');
|
waddch(m_window, '~');
|
||||||
}
|
}
|
||||||
|
|
||||||
int status_line_pos = status_on_top ? 0 : (int)m_dimensions.line;
|
int status_line_pos = m_status_on_top ? 0 : (int)m_dimensions.line;
|
||||||
wmove(m_window, status_line_pos, 0);
|
wmove(m_window, status_line_pos, 0);
|
||||||
wclrtoeol(m_window);
|
wclrtoeol(m_window);
|
||||||
draw_line(status_line, 0);
|
draw_line(status_line, 0);
|
||||||
|
@ -551,8 +549,8 @@ void NCursesUI::menu_show(memoryview<String> items,
|
||||||
m_menu_bg = bg;
|
m_menu_bg = bg;
|
||||||
|
|
||||||
if (style == MenuStyle::Prompt)
|
if (style == MenuStyle::Prompt)
|
||||||
anchor = CharCoord{status_on_top ? 0_line : m_dimensions.line, 0};
|
anchor = CharCoord{m_status_on_top ? 0_line : m_dimensions.line, 0};
|
||||||
else if (status_on_top)
|
else if (m_status_on_top)
|
||||||
anchor.line += 1;
|
anchor.line += 1;
|
||||||
|
|
||||||
CharCoord maxsize = window_size(stdscr);
|
CharCoord maxsize = window_size(stdscr);
|
||||||
|
@ -797,10 +795,10 @@ void NCursesUI::info_show(StringView title, StringView content,
|
||||||
{
|
{
|
||||||
fancy_info_box = make_info_box(title, content, m_dimensions.column);
|
fancy_info_box = make_info_box(title, content, m_dimensions.column);
|
||||||
info_box = fancy_info_box;
|
info_box = fancy_info_box;
|
||||||
anchor = CharCoord{status_on_top ? 0 : m_dimensions.line,
|
anchor = CharCoord{m_status_on_top ? 0 : m_dimensions.line,
|
||||||
m_dimensions.column-1};
|
m_dimensions.column-1};
|
||||||
}
|
}
|
||||||
else if (status_on_top)
|
else if (m_status_on_top)
|
||||||
anchor.line += 1;
|
anchor.line += 1;
|
||||||
|
|
||||||
CharCoord size = compute_needed_size(info_box);
|
CharCoord size = compute_needed_size(info_box);
|
||||||
|
@ -853,4 +851,11 @@ void NCursesUI::abort()
|
||||||
endwin();
|
endwin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NCursesUI::set_ui_options(const Options& options)
|
||||||
|
{
|
||||||
|
auto it = options.find("ncurses_status_on_top");
|
||||||
|
if (it != options.end())
|
||||||
|
m_status_on_top = it->second == "yes" or it->second == "true";
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,8 @@ public:
|
||||||
|
|
||||||
void set_input_callback(InputCallback callback) override;
|
void set_input_callback(InputCallback callback) override;
|
||||||
|
|
||||||
|
void set_ui_options(const Options& options) override;
|
||||||
|
|
||||||
CharCoord dimensions() override;
|
CharCoord dimensions() override;
|
||||||
|
|
||||||
static void abort();
|
static void abort();
|
||||||
|
@ -68,6 +70,8 @@ private:
|
||||||
FDWatcher m_stdin_watcher;
|
FDWatcher m_stdin_watcher;
|
||||||
InputCallback m_input_callback;
|
InputCallback m_input_callback;
|
||||||
|
|
||||||
|
bool m_status_on_top = false;
|
||||||
|
|
||||||
bool m_dirty = false;
|
bool m_dirty = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,8 @@ enum class RemoteUIMsg
|
||||||
InfoShow,
|
InfoShow,
|
||||||
InfoHide,
|
InfoHide,
|
||||||
Draw,
|
Draw,
|
||||||
Refresh
|
Refresh,
|
||||||
|
SetOptions
|
||||||
};
|
};
|
||||||
|
|
||||||
struct socket_error{};
|
struct socket_error{};
|
||||||
|
@ -271,6 +272,8 @@ public:
|
||||||
|
|
||||||
void set_input_callback(InputCallback callback) override;
|
void set_input_callback(InputCallback callback) override;
|
||||||
|
|
||||||
|
void set_ui_options(const Options& options) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
FDWatcher m_socket_watcher;
|
FDWatcher m_socket_watcher;
|
||||||
CharCoord m_dimensions;
|
CharCoord m_dimensions;
|
||||||
|
@ -357,6 +360,13 @@ void RemoteUI::refresh()
|
||||||
msg.write(RemoteUIMsg::Refresh);
|
msg.write(RemoteUIMsg::Refresh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RemoteUI::set_ui_options(const Options& options)
|
||||||
|
{
|
||||||
|
Message msg(m_socket_watcher.fd());
|
||||||
|
msg.write(RemoteUIMsg::SetOptions);
|
||||||
|
msg.write(options);
|
||||||
|
}
|
||||||
|
|
||||||
static const Key::Modifiers resize_modifier = (Key::Modifiers)0x80;
|
static const Key::Modifiers resize_modifier = (Key::Modifiers)0x80;
|
||||||
|
|
||||||
bool RemoteUI::is_key_available()
|
bool RemoteUI::is_key_available()
|
||||||
|
@ -508,6 +518,9 @@ void RemoteClient::process_next_message()
|
||||||
case RemoteUIMsg::Refresh:
|
case RemoteUIMsg::Refresh:
|
||||||
m_ui->refresh();
|
m_ui->refresh();
|
||||||
break;
|
break;
|
||||||
|
case RemoteUIMsg::SetOptions:
|
||||||
|
m_ui->set_ui_options(read_map<String, String>(socket));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
#include "memoryview.hh"
|
#include "memoryview.hh"
|
||||||
#include "safe_ptr.hh"
|
#include "safe_ptr.hh"
|
||||||
|
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
namespace Kakoune
|
namespace Kakoune
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -57,6 +59,9 @@ public:
|
||||||
virtual void refresh() = 0;
|
virtual void refresh() = 0;
|
||||||
|
|
||||||
virtual void set_input_callback(InputCallback callback) = 0;
|
virtual void set_input_callback(InputCallback callback) = 0;
|
||||||
|
|
||||||
|
using Options = std::unordered_map<String, String>;
|
||||||
|
virtual void set_ui_options(const Options& options) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user