-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathinput_event_emitter.h
133 lines (121 loc) · 4.49 KB
/
input_event_emitter.h
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// *** WARNING ***
// This file is generated by genevents.rb
// Keep untouched or ruin the abstraction
#pragma once
#include "event_id.h"
#include "input_event_listener.h"
#include "list.h"
#include "logger_event_emitter.h"
typedef struct _input_event_listener_on_set_controls {
list_t list_entry;
void *context;
input_event_callback_on_set_controls_t callback;
} _input_event_listener_on_set_controls_t;
typedef struct _input_event_listener_on_control_joypad {
list_t list_entry;
void *context;
input_event_callback_on_control_joypad_t callback;
} _input_event_listener_on_control_joypad_t;
typedef struct input_event_emitter {
list_head_t set_controls_listeners;
list_head_t control_joypad_listeners;
logger_event_emitter_t *shared_logger_emitter;
} input_event_emitter_t;
static inline int input_event_attach_listener(input_event_emitter_t *self, input_event_listener_t *listener)
{
if (listener->on_set_controls) {
_input_event_listener_on_set_controls_t *elem = NULL;
TALLOC(elem);
elem->context = listener->context;
elem->callback = listener->on_set_controls;
list_append(&self->set_controls_listeners, &elem->list_entry);
}
if (listener->on_control_joypad) {
_input_event_listener_on_control_joypad_t *elem = NULL;
TALLOC(elem);
elem->context = listener->context;
elem->callback = listener->on_control_joypad;
list_append(&self->control_joypad_listeners, &elem->list_entry);
}
return SUCCESS;
error:
return NG;
}
static inline void input_event_set_logger_emitter(input_event_emitter_t *self, logger_event_emitter_t *logger_emitter)
{
self->shared_logger_emitter = logger_emitter;
}
// controller status playback for input injection. should be emitted on entering vblank.
static inline void input_event_emit_set_controls(input_event_emitter_t *self, uint8_t system, joypad_reg_t joypad1, joypad_reg_t joypad2)
{
_input_event_listener_on_set_controls_t *elem = NULL;
list_foreach (&self->set_controls_listeners, elem) {
elem->callback(elem->context, system, joypad1, joypad2);
}
}
// pressed button
static inline void input_event_emit_control_joypad(input_event_emitter_t *self, input_event_control_joypad_idx_t idx, bool is_on, input_event_control_joypad_button_t button)
{
_input_event_listener_on_control_joypad_t *elem = NULL;
list_foreach (&self->control_joypad_listeners, elem) {
elem->callback(elem->context, idx, is_on, button);
}
}
static inline void input_event_detach_listener(input_event_emitter_t *self, void *context)
{
{
_input_event_listener_on_set_controls_t *elem = NULL;
list_foreach (&self->set_controls_listeners, elem) {
if (elem->context == context) {
list_remove(&self->set_controls_listeners, &elem->list_entry);
FREE(elem);
}
}
}
{
_input_event_listener_on_control_joypad_t *elem = NULL;
list_foreach (&self->control_joypad_listeners, elem) {
if (elem->context == context) {
list_remove(&self->control_joypad_listeners, &elem->list_entry);
FREE(elem);
}
}
}
}
static inline void input_event_detach_listener_on_set_controls(input_event_emitter_t *self, void *context)
{
_input_event_listener_on_set_controls_t *elem = NULL;
list_foreach (&self->set_controls_listeners, elem) {
if (elem->context == context) {
list_remove(&self->set_controls_listeners, &elem->list_entry);
FREE(elem);
}
}
}
static inline void input_event_detach_listener_on_control_joypad(input_event_emitter_t *self, void *context)
{
_input_event_listener_on_control_joypad_t *elem = NULL;
list_foreach (&self->control_joypad_listeners, elem) {
if (elem->context == context) {
list_remove(&self->control_joypad_listeners, &elem->list_entry);
FREE(elem);
}
}
}
static inline void input_event_detach_all(input_event_emitter_t *self)
{
{
_input_event_listener_on_set_controls_t *elem = NULL;
list_foreach (&self->set_controls_listeners, elem) {
list_remove(&self->set_controls_listeners, &elem->list_entry);
FREE(elem);
}
}
{
_input_event_listener_on_control_joypad_t *elem = NULL;
list_foreach (&self->control_joypad_listeners, elem) {
list_remove(&self->control_joypad_listeners, &elem->list_entry);
FREE(elem);
}
}
}