1
1
mirror of https://github.com/qvacua/vimr.git synced 2024-11-27 14:14:19 +03:00

Send mode_info_set messages from nvim to UiBridge

This commit is contained in:
Johann Rudloff 2020-04-17 18:54:33 +02:00
parent e501e87063
commit d8c6ad2b5a
5 changed files with 58 additions and 3 deletions

View File

@ -31,6 +31,7 @@ typedef CF_ENUM(NSInteger, NvimServerMsgId) {
NvimServerMsgIdBusyStart,
NvimServerMsgIdBusyStop,
NvimServerMsgIdModeChange,
NvimServerMsgIdModeInfoSet,
NvimServerMsgIdBell,
NvimServerMsgIdVisualBell,
NvimServerMsgIdFlush,

View File

@ -37,6 +37,7 @@ static msgpack_sbuffer flush_sbuffer;
static msgpack_packer flush_packer;
static void pack_flush_data(RenderDataType type, pack_block body);
static void pack_mode_info_dictionary(msgpack_packer *packer, Dictionary dict);
static void send_cwd(void);
static void send_dirty_status(void);
static void send_colorscheme(void);
@ -107,9 +108,24 @@ static void server_ui_busy_stop(UI *ui __unused) {
static void server_ui_mode_info_set(
UI *ui __unused,
Boolean enabled __unused,
Array cursor_styles __unused
) {}
Boolean enabled,
Array cursor_styles
) {
send_msg_packing(NvimServerMsgIdModeInfoSet, ^(msgpack_packer *packer) {
msgpack_pack_array(packer, 2);
msgpack_pack_bool(packer, enabled);
msgpack_pack_array(packer, cursor_styles.size);
for (size_t i = 0; i < cursor_styles.size; ++i) {
Object item = cursor_styles.items[i];
if (item.type == kObjectTypeDictionary) {
pack_mode_info_dictionary(packer, item.data.dictionary);
} else {
// this should never happen, but write nil to match the given array size
msgpack_pack_nil(packer);
}
}
});
}
static void server_ui_mode_change(UI *ui __unused, String mode_str __unused, Integer mode) {
send_msg_packing(NvimServerMsgIdModeChange, ^(msgpack_packer *packer) {
@ -368,6 +384,34 @@ static void pack_flush_data(RenderDataType type, pack_block body) {
body(&flush_packer);
}
// Small utility to pack an nvim Dictionary into a msgpack_map for mode_info_set
// BEWARE: This is by no means a generic Dict -> map packer, as only String and
// Integer values are supported for now.
static void pack_mode_info_dictionary(
msgpack_packer *packer,
Dictionary dict
) {
msgpack_pack_map(packer, dict.size);
for (size_t i = 0; i < dict.size; ++i) {
String key = dict.items[i].key;
Object value = dict.items[i].value;
msgpack_pack_str(packer, key.size);
msgpack_pack_str_body(packer, key.data, key.size);
switch (value.type) {
case kObjectTypeInteger:
msgpack_pack_int64(packer, value.data.integer);
break;
case kObjectTypeString:
msgpack_pack_str(packer, value.data.string.size);
msgpack_pack_str_body(packer, value.data.string.data, value.data.string.size);
break;
default:
msgpack_pack_nil(packer);
break;
}
}
}
static void send_dirty_status() {
const bool new_dirty_status = has_dirty_docs();
if (are_buffers_dirty == new_dirty_status) {return;}

View File

@ -62,6 +62,10 @@ extension NvimView {
}
}
final func modeInfoSet(_ value: MessagePackValue) {
self.bridgeLogger.trace("modeInfoSet: \(value)")
}
final func flush(_ renderData: [MessagePackValue]) {
self.bridgeLogger.trace("# of render data: \(renderData.count)")

View File

@ -31,6 +31,7 @@ typedef CF_ENUM(NSInteger, NvimServerMsgId) {
NvimServerMsgIdBusyStart,
NvimServerMsgIdBusyStop,
NvimServerMsgIdModeChange,
NvimServerMsgIdModeInfoSet,
NvimServerMsgIdBell,
NvimServerMsgIdVisualBell,
NvimServerMsgIdFlush,

View File

@ -14,6 +14,7 @@ protocol UiBridgeConsumer: class {
func resize(_ value: MessagePackValue)
func clear()
func modeChange(_ value: MessagePackValue)
func modeInfoSet(_ value: MessagePackValue)
func flush(_ renderData: [MessagePackValue])
func setTitle(with value: MessagePackValue)
func stop()
@ -186,6 +187,10 @@ class UiBridge {
guard let v = MessagePackUtils.value(from: data) else { return }
self.consumer?.modeChange(v)
case .modeInfoSet:
guard let v = MessagePackUtils.value(from: data) else { return }
self.consumer?.modeInfoSet(v)
case .bell:
self.consumer?.bell()