aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/event/defs.h
blob: fdd4f17d5c4f6fb5e855df07fa1f1fc1eb496453 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#ifndef NVIM_EVENT_DEFS_H
#define NVIM_EVENT_DEFS_H

#include <assert.h>
#include <stdarg.h>

#define EVENT_HANDLER_MAX_ARGC 10

typedef void (*argv_callback)(void **argv);
typedef struct message {
  argv_callback handler;
  void *argv[EVENT_HANDLER_MAX_ARGC];
} Event;
typedef void(*event_scheduler)(Event event, void *data);

#define VA_EVENT_INIT(event, h, a) \
  do { \
    assert(a <= EVENT_HANDLER_MAX_ARGC); \
    (event)->handler = h; \
    if (a) { \
      va_list args; \
      va_start(args, a); \
      for (int i = 0; i < a; i++) { \
        (event)->argv[i] = va_arg(args, void *); \
      } \
      va_end(args); \
    } \
  } while (0)

static inline Event event_create(argv_callback cb, int argc, ...)
{
  assert(argc <= EVENT_HANDLER_MAX_ARGC);
  Event event;
  VA_EVENT_INIT(&event, cb, argc);
  return event;
}

#endif  // NVIM_EVENT_DEFS_H