fencer/core/src/player_input.c
Sara 0c6f1dd8cf feat: reworked typeclasses to forward-declare then define
forward declarations are simplified with decl_typeclass_impl
impl_Typeclass_for now instead only define
static inline impl_Typeclass_for can be used to achieve the old behaviour
2024-01-12 09:02:42 +01:00

44 lines
1.3 KiB
C

#include "player_input.h"
#include "debug.h"
impl_Drop_for(PlayerInput,
playerinput_drop
)
PlayerInput* playerinput_new(void* target, int device) {
PlayerInput* self = malloc(sizeof(PlayerInput));
ASSERT_RETURN(self != NULL, NULL, "Could not allocate memory for PlayerInput instance");
self->listeners = list_from_type(InputListener);
self->device = input_get_device_by_id(device);
self->target = target;
input_device_set_listeners(self->device, &self->listeners);
return self;
}
void playerinput_add(PlayerInput* self, InputAxis axis, InputDelegateFn delegate) {
InputListener listener = {
.axis = axis,
.fn = delegate,
.self = self->target,
};
listener.axis.tc->set_device(listener.axis.data, self->device);
list_add(&self->listeners, &listener);
}
void playerinput_set_device(PlayerInput* self, int device) {
if(self->device != NULL)
input_device_set_listeners(self->device, NULL);
self->device = input_get_device_by_id(device);
input_device_set_listeners(self->device, &self->listeners);
}
void playerinput_drop(PlayerInput* self) {
input_device_set_listeners(self->device, NULL);
list_foreach(InputListener*, listener, &self->listeners) {
listener->axis.drop->drop(listener->axis.data);
}
list_empty(&self->listeners);
free(self);
}