summaryrefslogtreecommitdiff
path: root/src/events.cc
blob: 1795c85ae73f409de9a8b05d8c16096457ae7b23 (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
#include "events.h"
#include "hash.h"
#include "vec.h"
#include <cstring>

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

bool wayc_eventloop_init(struct eventloop_s *loop) {
  wayc_notnull(loop);
  memset(loop, 0, sizeof(*loop));

  if (!wayc_wlstate_init(&loop->state))
    return false;

  loop->events = WAYC_VEC_INIT(struct event_s);
  loop->running = true;
  wayc_hashmap_init(&loop->windows);

  return true;
}

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);
}