mirror of
https://github.com/neovim/neovim.git
synced 2025-10-09 19:36:40 +00:00
api: unify buffer numbers and window ids with handles
also allow handle==0 meaning curbuf/curwin/curtab
This commit is contained in:
@@ -9,13 +9,15 @@
|
||||
#define STRING_INIT {.data = NULL, .size = 0}
|
||||
#define OBJECT_INIT { .type = kObjectTypeNil }
|
||||
#define ERROR_INIT { .set = false }
|
||||
#define REMOTE_TYPE(type) typedef uint64_t type
|
||||
#define REMOTE_TYPE(type) typedef handle_T type
|
||||
|
||||
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
||||
# define ArrayOf(...) Array
|
||||
# define DictionaryOf(...) Dictionary
|
||||
#endif
|
||||
|
||||
typedef int handle_T;
|
||||
|
||||
// Basic types
|
||||
typedef enum {
|
||||
kErrorTypeException,
|
||||
|
@@ -5,30 +5,26 @@
|
||||
#include "nvim/map.h"
|
||||
#include "nvim/api/private/handle.h"
|
||||
|
||||
#define HANDLE_INIT(name) name##_handles = pmap_new(uint64_t)()
|
||||
#define HANDLE_INIT(name) name##_handles = pmap_new(handle_T)()
|
||||
|
||||
#define HANDLE_IMPL(type, name) \
|
||||
static PMap(uint64_t) *name##_handles = NULL; \
|
||||
static PMap(handle_T) *name##_handles = NULL; /* NOLINT */ \
|
||||
\
|
||||
type *handle_get_##name(uint64_t handle) \
|
||||
type *handle_get_##name(handle_T handle) \
|
||||
{ \
|
||||
return pmap_get(uint64_t)(name##_handles, handle); \
|
||||
return pmap_get(handle_T)(name##_handles, handle); \
|
||||
} \
|
||||
\
|
||||
void handle_register_##name(type *name) \
|
||||
{ \
|
||||
assert(!name->handle); \
|
||||
name->handle = next_handle++; \
|
||||
pmap_put(uint64_t)(name##_handles, name->handle, name); \
|
||||
pmap_put(handle_T)(name##_handles, name->handle, name); \
|
||||
} \
|
||||
\
|
||||
void handle_unregister_##name(type *name) \
|
||||
{ \
|
||||
pmap_del(uint64_t)(name##_handles, name->handle); \
|
||||
pmap_del(handle_T)(name##_handles, name->handle); \
|
||||
}
|
||||
|
||||
static uint64_t next_handle = 1;
|
||||
|
||||
HANDLE_IMPL(buf_T, buffer)
|
||||
HANDLE_IMPL(win_T, window)
|
||||
HANDLE_IMPL(tabpage_T, tabpage)
|
||||
|
@@ -3,9 +3,10 @@
|
||||
|
||||
#include "nvim/vim.h"
|
||||
#include "nvim/buffer_defs.h"
|
||||
#include "nvim/api/private/defs.h"
|
||||
|
||||
#define HANDLE_DECLS(type, name) \
|
||||
type *handle_get_##name(uint64_t handle); \
|
||||
type *handle_get_##name(handle_T handle); \
|
||||
void handle_register_##name(type *name); \
|
||||
void handle_unregister_##name(type *name);
|
||||
|
||||
|
@@ -507,6 +507,10 @@ Object vim_to_object(typval_T *obj)
|
||||
|
||||
buf_T *find_buffer_by_handle(Buffer buffer, Error *err)
|
||||
{
|
||||
if (buffer == 0) {
|
||||
return curbuf;
|
||||
}
|
||||
|
||||
buf_T *rv = handle_get_buffer(buffer);
|
||||
|
||||
if (!rv) {
|
||||
@@ -518,6 +522,10 @@ buf_T *find_buffer_by_handle(Buffer buffer, Error *err)
|
||||
|
||||
win_T * find_window_by_handle(Window window, Error *err)
|
||||
{
|
||||
if (window == 0) {
|
||||
return curwin;
|
||||
}
|
||||
|
||||
win_T *rv = handle_get_window(window);
|
||||
|
||||
if (!rv) {
|
||||
@@ -529,6 +537,10 @@ win_T * find_window_by_handle(Window window, Error *err)
|
||||
|
||||
tabpage_T * find_tab_by_handle(Tabpage tabpage, Error *err)
|
||||
{
|
||||
if (tabpage == 0) {
|
||||
return curtab;
|
||||
}
|
||||
|
||||
tabpage_T *rv = handle_get_tabpage(tabpage);
|
||||
|
||||
if (!rv) {
|
||||
|
@@ -472,7 +472,7 @@ void vim_set_current_buffer(Buffer buffer, Error *err)
|
||||
if (!try_end(err) && result == FAIL) {
|
||||
api_set_error(err,
|
||||
Exception,
|
||||
_("Failed to switch to buffer %" PRIu64),
|
||||
_("Failed to switch to buffer %d"),
|
||||
buffer);
|
||||
}
|
||||
}
|
||||
@@ -522,7 +522,7 @@ void vim_set_current_window(Window window, Error *err)
|
||||
if (!try_end(err) && win != curwin) {
|
||||
api_set_error(err,
|
||||
Exception,
|
||||
_("Failed to switch to window %" PRIu64),
|
||||
_("Failed to switch to window %d"),
|
||||
window);
|
||||
}
|
||||
}
|
||||
@@ -573,7 +573,7 @@ void vim_set_current_tabpage(Tabpage tabpage, Error *err)
|
||||
if (!try_end(err) && tp != curtab) {
|
||||
api_set_error(err,
|
||||
Exception,
|
||||
_("Failed to switch to tabpage %" PRIu64),
|
||||
_("Failed to switch to tabpage %d"),
|
||||
tabpage);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user