aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/ui_client.c
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2022-05-30 00:59:06 +0200
committerbfredl <bjorn.linse@gmail.com>2022-05-30 14:11:01 +0200
commit1f63052b682a6019d7f092553747272195fbfffd (patch)
treebf1d011b37bc1e61e75c6d8859c830e09d5c0285 /src/nvim/ui_client.c
parente9803e1de6497ee21f77f45cf2670c2fe4e8ab22 (diff)
downloadrneovim-1f63052b682a6019d7f092553747272195fbfffd.tar.gz
rneovim-1f63052b682a6019d7f092553747272195fbfffd.tar.bz2
rneovim-1f63052b682a6019d7f092553747272195fbfffd.zip
refactor(api): use hashy hash for looking up api method and event names
This avoids generating khash tables at runtime, and is consistent with how evalfuncs lookup work.
Diffstat (limited to 'src/nvim/ui_client.c')
-rw-r--r--src/nvim/ui_client.c27
1 files changed, 10 insertions, 17 deletions
diff --git a/src/nvim/ui_client.c b/src/nvim/ui_client.c
index 4d1b9b1c52..be01538f67 100644
--- a/src/nvim/ui_client.c
+++ b/src/nvim/ui_client.c
@@ -16,18 +16,17 @@
#include "nvim/ui_client.h"
#include "nvim/vim.h"
-static Map(String, UIClientHandler) ui_client_handlers = MAP_INIT;
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "ui_client.c.generated.h"
+
+# include "ui_events_client.generated.h"
+#endif
// Temporary buffer for converting a single grid_line event
static size_t buf_size = 0;
static schar_T *buf_char = NULL;
static sattr_T *buf_attr = NULL;
-static void add_ui_client_event_handler(String method, UIClientHandler handler)
-{
- map_put(String, UIClientHandler)(&ui_client_handlers, method, handler);
-}
-
void ui_client_init(uint64_t chan)
{
Array args = ARRAY_DICT_INIT;
@@ -44,9 +43,6 @@ void ui_client_init(uint64_t chan)
ADD(args, DICTIONARY_OBJ(opts));
rpc_send_event(chan, "nvim_ui_attach", args);
- msgpack_rpc_add_redraw(); // GAME!
- // TODO(bfredl): use a keyset instead
- ui_client_methods_table_init();
ui_client_channel_id = chan;
}
@@ -61,22 +57,23 @@ void ui_client_init(uint64_t chan)
/// @param channel_id: The id of the rpc channel
/// @param uidata: The dense array containing the ui_events sent by the server
/// @param[out] err Error details, if any
-Object ui_client_handle_redraw(uint64_t channel_id, Array args, Error *error)
+Object handle_ui_client_redraw(uint64_t channel_id, Array args, Error *error)
{
for (size_t i = 0; i < args.size; i++) {
Array call = args.items[i].data.array;
String name = call.items[0].data.string;
- UIClientHandler handler = map_get(String, UIClientHandler)(&ui_client_handlers, name);
- if (!handler) {
+ int hash = ui_client_handler_hash(name.data, name.size);
+ if (hash < 0) {
ELOG("No ui client handler for %s", name.size ? name.data : "<empty>");
continue;
}
+ UIClientHandler handler = event_handlers[hash];
// fprintf(stderr, "%s: %zu\n", name.data, call.size-1);
DLOG("Invoke ui client handler for %s", name.data);
for (size_t j = 1; j < call.size; j++) {
- handler(call.items[j].data.array);
+ handler.fn(call.items[j].data.array);
}
}
@@ -108,10 +105,6 @@ static HlAttrs ui_client_dict2hlattrs(Dictionary d, bool rgb)
return dict2hlattrs(&dict, true, NULL, &err);
}
-#ifdef INCLUDE_GENERATED_DECLARATIONS
-# include "ui_events_client.generated.h"
-#endif
-
void ui_client_event_grid_resize(Array args)
{
if (args.size < 3