#ifndef __GE_INPUT_H__ #define __GE_INPUT_H__ #include struct ge_input; typedef struct ge_input ge_input_t; typedef union ge_input_event { void* ctx; uintptr_t num; } ge_input_event_t; typedef int(*ge_input_send_func_t)(ge_input_t* ctx, ge_input_event_t event); typedef int(*ge_input_peek_func_t)(ge_input_t* ctx, ge_input_event_t* event); typedef int(*ge_input_recv_func_t)(ge_input_t* ctx, ge_input_event_t* event); struct ge_input { void* context; ge_input_send_func_t func_send; ge_input_peek_func_t func_peek; ge_input_recv_func_t func_recv; }; #ifdef __GE_INPUT_EASY_IMPLIMENT_H__ DECLARE_GE_KFIFO(ge_input_fifo, ge_input_event_t, 16, ge_input_fifo_t); static int ge_input_send (ge_input_t* ctx, ge_input_event_t event) { struct ge_input_fifo_t* fifo = (struct ge_input_fifo_t*)ctx->context; if (ge_kfifo_is_full(fifo)) { return -1; } ge_kfifo_put(fifo, event); return 0; } static int ge_input_peek (ge_input_t* ctx, ge_input_event_t* event) { struct ge_input_fifo_t* fifo = (struct ge_input_fifo_t*)ctx->context; if (ge_kfifo_is_empty(fifo)) { return -1; } ge_kfifo_peek(fifo, event); return 0; } static int ge_input_recv (ge_input_t* ctx, ge_input_event_t* event) { struct ge_input_fifo_t* fifo = (struct ge_input_fifo_t*)ctx->context; if (ge_kfifo_is_empty(fifo)) { return -1; } ge_kfifo_get(fifo, event); return 0; } #endif #endif // __GE_INPUT_H__