summaryrefslogtreecommitdiff
path: root/src/events.cc
blob: 06fc68f21749dc4d94217b9a9541bb8bf7a2308e (plain)
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include "events.h"

#include <cstring>

#include "hash.h"
#include "vec.h"

static inline window_id_t wayc_eventloop_genid(struct eventloop_s* loop) {
  wayc_notnull(loop);
  return loop->winid++;
}

enum eventloop_error_e wayc_eventloop_init(struct eventloop_s* loop,
                                           event_handler_t handler) {
  wayc_notnull(loop);
  wayc_notnull(handler);

  memset(loop, 0, sizeof(*loop));

  if (wayc_wlstate_init(&loop->state) != WLSTATE_ERROR_NONE)
    return EVENTLOOP_ERROR_WLSTATE;

  loop->events = WAYC_VEC_INIT(struct event_s);
  loop->handler = handler;
  loop->running = true;

  wayc_hashmap_init(&loop->windows);

  return EVENTLOOP_ERROR_NONE;
}

void wayc_eventloop_deinit(struct eventloop_s* loop) {
  wayc_notnull(loop);

  wayc_wlstate_deinit(&loop->state);
  wayc_vec_deinit(&loop->events);
}

window_id_t wayc_eventloop_register(struct eventloop_s* loop,
                                    struct window_s* window) {
  wayc_notnull(loop);
  wayc_notnull(window);

  window_id_t winid = wayc_eventloop_genid(loop);
  wayc_hashmap_insert(&loop->windows, &winid, &window);
  return winid;
}

void wayc_eventloop_unregister(struct eventloop_s* loop, window_id_t winid) {
  wayc_notnull(loop);
  wayc_hashmap_remove(&loop->windows, &winid);
}

bool wayc_eventloop_running(struct eventloop_s* loop) {
  wayc_notnull(loop);
  return loop->running;
}

void wayc_eventloop_update(struct eventloop_s* loop) {
  wayc_notnull(loop);
  if (wayc_hashmap_count(&loop->windows) == 0) loop->running = false;

  wayc_wlstate_update(&loop->state);

  struct event_s event;
  while (wayc_vec_pop(&loop->events, &event)) loop->handler(loop, &event);
}