summaryrefslogtreecommitdiffstats
path: root/development/eovim/7b320.patch
blob: a2b31e8c7f59cc97550a1a077d3e9b9ef3a6ce43 (plain)
From 7b320c17b1fc8821eac411f6d6afc14e32f7e093 Mon Sep 17 00:00:00 2001
From: Jean Guyomarc'h <jean@guyomarch.bzh>
Date: Sat, 12 Jan 2019 08:46:44 +0100
Subject: [PATCH] nvim: properly handle the vimenter request

Fixes #38
---
 include/eovim/nvim_api.h    |  3 ++-
 include/eovim/nvim_helper.h |  2 +-
 src/nvim.c                  | 47 +++++++++++++++++++++++++++----------
 src/nvim_api.c              |  6 +++--
 src/nvim_helper.c           |  4 ++--
 5 files changed, 43 insertions(+), 19 deletions(-)

diff --git a/include/eovim/nvim_api.h b/include/eovim/nvim_api.h
index 9885ee1..ca9baab 100644
--- a/include/eovim/nvim_api.h
+++ b/include/eovim/nvim_api.h
@@ -27,7 +27,8 @@
 #include <Eina.h>
 #include <msgpack.h>
 
-Eina_Bool nvim_api_ui_attach(s_nvim *nvim, unsigned int width, unsigned int height);
+Eina_Bool nvim_api_ui_attach(s_nvim *nvim, unsigned int width, unsigned int height,
+                             f_nvim_api_cb func, void *func_data);
 Eina_Bool nvim_api_get_api_info(s_nvim *nvim, f_nvim_api_cb cb, void *data);
 Eina_Bool nvim_api_ui_try_resize(s_nvim *nvim, unsigned int width, unsigned height);
 Eina_Bool nvim_api_ui_ext_cmdline_set(s_nvim *nvim, Eina_Bool externalize);
diff --git a/include/eovim/nvim_helper.h b/include/eovim/nvim_helper.h
index b6ce5f4..9f976d5 100644
--- a/include/eovim/nvim_helper.h
+++ b/include/eovim/nvim_helper.h
@@ -49,6 +49,6 @@ nvim_helper_highlight_group_decode_noop(s_nvim *nvim,
 
 
 void nvim_helper_autocmd_do(s_nvim *nvim, const char *event);
-void nvim_helper_autocmd_vimenter_exec(s_nvim *nvim, f_nvim_api_cb func, void *func_data);
+void nvim_helper_autocmd_vimenter_exec(s_nvim *nvim);
 
 #endif /* ! __EOVIM_NVIM_HELPER_H__ */
diff --git a/src/nvim.c b/src/nvim.c
index 83fdee4..a003a00 100644
--- a/src/nvim.c
+++ b/src/nvim.c
@@ -43,6 +43,8 @@ enum
 static Ecore_Event_Handler *_event_handlers[__HANDLERS_LAST];
 static s_nvim *_nvim_instance = NULL;
 
+static void _api_decode_cb(s_nvim *nvim, void *data, const msgpack_object *result);
+
 /*============================================================================*
  *                                 Private API                                *
  *============================================================================*/
@@ -278,6 +280,15 @@ _handle_notification(s_nvim *nvim,
    return EINA_FALSE;
 }
 
+static Eina_Bool
+_vimenter_request_cb(s_nvim *nvim EINA_UNUSED,
+                     const msgpack_object_array *args EINA_UNUSED,
+                     msgpack_packer *pk)
+{
+  msgpack_pack_nil(pk); /* Error */
+  msgpack_pack_nil(pk); /* Result */
+  return EINA_TRUE;
+}
 
 /*============================================================================*
  *                       Nvim Processes Events Handlers                       *
@@ -298,6 +309,21 @@ _nvim_added_cb(void *data EINA_UNUSED,
 
    const Ecore_Exe_Event_Add *const info = event;
    INF("Process with PID %i was created", ecore_exe_pid_get(info->exe));
+
+   /* Okay, at this point the neovim process is running! Great! Now, we can
+    * start to retrieve the API information and trigger the vimenter autocmd.
+    *
+    * We can start attaching the UI on the fly.
+    * See :help ui-startup for details.
+    */
+   s_nvim *const nvim = _nvim_get();
+   nvim_api_get_api_info(nvim, _api_decode_cb, NULL);
+
+   nvim_helper_autocmd_vimenter_exec(nvim);
+   const s_geometry *const geo = &nvim->opts->geometry;
+   nvim_api_ui_attach(nvim, geo->w, geo->h, _ui_attached_cb, NULL);
+
+
    return ECORE_CALLBACK_PASS_ON;
 }
 
@@ -438,6 +464,7 @@ _nvim_received_error_cb(void *data EINA_UNUSED,
    return ECORE_CALLBACK_PASS_ON;
 }
 
+/* FIXME this is soooooo fragile */
 static void
 _nvim_runtime_load(s_nvim *nvim,
                    const char *filename)
@@ -653,16 +680,6 @@ _api_decode_cb(s_nvim *nvim, void *data EINA_UNUSED, const msgpack_object *resul
   _virtual_interface_setup(nvim);
 }
 
-static void
-_vimenter_cb(s_nvim *nvim,
-             void *data EINA_UNUSED,
-             const msgpack_object *result EINA_UNUSED)
-{
-  _nvim_builtin_runtime_load(nvim);
-  _nvim_eovimrc_load(nvim);
-  nvim_api_var_integer_set(nvim, "eovim_running", 1);
-}
-
 static void
 _nvim_plugins_load(s_nvim *nvim)
 {
@@ -815,6 +832,9 @@ nvim_new(const s_options *opts,
    /* Initialize the virtual interface to safe values (non-NULL pointers) */
    _virtual_interface_init(nvim);
 
+   /* Add a callback to the vimenter request */
+   nvim_request_add("vimenter", _vimenter_request_cb);
+
    /* Create the neovim process */
    nvim->exe = ecore_exe_pipe_run(
       eina_strbuf_string_get(cmdline),
@@ -831,9 +851,10 @@ nvim_new(const s_options *opts,
    DBG("Running %s", eina_strbuf_string_get(cmdline));
    eina_strbuf_free(cmdline);
 
-   nvim_api_get_api_info(nvim, _api_decode_cb, NULL);
-   nvim_helper_autocmd_vimenter_exec(nvim, _vimenter_cb, NULL);
-   nvim_api_ui_attach(nvim, opts->geometry.w, opts->geometry.h);
+   /* FIXME These are sooo fragile. Rework that!!! */
+   _nvim_builtin_runtime_load(nvim);
+   _nvim_eovimrc_load(nvim);
+   nvim_api_var_integer_set(nvim, "eovim_running", 1);
 
    /* Create the GUI window */
    if (EINA_UNLIKELY(! gui_add(&nvim->gui, nvim)))
diff --git a/src/nvim_api.c b/src/nvim_api.c
index 8082352..cf93577 100644
--- a/src/nvim_api.c
+++ b/src/nvim_api.c
@@ -138,8 +138,8 @@ void nvim_api_request_call(s_nvim *nvim,
 
 Eina_Bool
 nvim_api_ui_attach(s_nvim *nvim,
-                   unsigned int width,
-                   unsigned int height)
+                   unsigned int width, unsigned int height,
+                   f_nvim_api_cb func, void *func_data)
 {
    const char api[] = "nvim_ui_attach";
    s_request *const req = _request_new(nvim, api, sizeof(api) - 1);
@@ -148,6 +148,8 @@ nvim_api_ui_attach(s_nvim *nvim,
         CRI("Failed to create request");
         return EINA_FALSE;
      }
+   req->cb.func = func;
+   req->cb.data = func_data;
 
    const s_config *const cfg = nvim->config;
 
diff --git a/src/nvim_helper.c b/src/nvim_helper.c
index 7199203..2ec09fb 100644
--- a/src/nvim_helper.c
+++ b/src/nvim_helper.c
@@ -134,11 +134,11 @@ nvim_helper_autocmd_do(s_nvim *nvim,
 }
 
 void
-nvim_helper_autocmd_vimenter_exec(s_nvim *nvim, f_nvim_api_cb func, void *func_data)
+nvim_helper_autocmd_vimenter_exec(s_nvim *nvim)
 {
   const char cmd[] = "autocmd VimEnter * call rpcrequest(1, 'vimenter')";
   const Eina_Bool ok =
-    nvim_api_command(nvim, cmd, sizeof(cmd) - 1u, func, func_data);
+    nvim_api_command(nvim, cmd, sizeof(cmd) - 1u, NULL, NULL);
   if (EINA_UNLIKELY(! ok))
   { ERR("Failed to execute: %s", cmd); }
 }