flags to discard events and preserve timestamps
This commit is contained in:
parent
b690e6d9a6
commit
b9654ab7ec
4 changed files with 29 additions and 24 deletions
29
input_dev.c
29
input_dev.c
|
|
@ -19,11 +19,11 @@
|
|||
static const char *input_path = "/dev/input/";
|
||||
static const char *iio_path = "/sys/bus/iio/devices/";
|
||||
|
||||
int input_filter_identity(struct input_event* events, size_t* size, uint32_t* count) {
|
||||
return INPUT_FILTER_RESULT_OK;
|
||||
uint32_t input_filter_identity(struct input_event* events, size_t* size, uint32_t* count) {
|
||||
return INPUT_FILTER_FLAGS_NONE;
|
||||
}
|
||||
|
||||
int input_filter_asus_kb(struct input_event* events, size_t* size, uint32_t* count) {
|
||||
uint32_t input_filter_asus_kb(struct input_event* events, size_t* size, uint32_t* count) {
|
||||
static int F15_status = 0;
|
||||
|
||||
if ((*count >= 2) && (events[0].type == EV_MSC) && (events[0].code == MSC_SCAN)) {
|
||||
|
|
@ -35,36 +35,36 @@ int input_filter_asus_kb(struct input_event* events, size_t* size, uint32_t* cou
|
|||
// Do nothing effectively discarding the input
|
||||
}
|
||||
|
||||
return INPUT_FILTER_RESULT_DO_NOT_EMIT;
|
||||
return INPUT_FILTER_FLAGS_DO_NOT_EMIT;
|
||||
} else if (events[0].value == -13565784) {
|
||||
return INPUT_FILTER_RESULT_DO_NOT_EMIT;
|
||||
return INPUT_FILTER_FLAGS_DO_NOT_EMIT;
|
||||
} else if ((*count == 2) && (events[0].value == 458860) && (events[1].type == EV_KEY) && (events[1].code == KEY_F17)) {
|
||||
if (events[1].value < 2) {
|
||||
*count = 1;
|
||||
events[0].type = EV_KEY;
|
||||
events[0].code = BTN_GEAR_DOWN;
|
||||
events[0].value = events[1].value;
|
||||
return INPUT_FILTER_RESULT_OK;
|
||||
return INPUT_FILTER_FLAGS_NONE;
|
||||
}
|
||||
|
||||
return INPUT_FILTER_RESULT_DO_NOT_EMIT;
|
||||
return INPUT_FILTER_FLAGS_DO_NOT_EMIT;
|
||||
} else if ((*count == 2) && (events[0].value == 458861) && (events[1].type == EV_KEY) && (events[1].code == KEY_F18)) {
|
||||
if (events[1].value < 2) {
|
||||
*count = 1;
|
||||
events[0].type = EV_KEY;
|
||||
events[0].code = BTN_GEAR_UP;
|
||||
events[0].value = events[1].value;
|
||||
return INPUT_FILTER_RESULT_OK;
|
||||
return INPUT_FILTER_FLAGS_NONE;
|
||||
}
|
||||
|
||||
return INPUT_FILTER_RESULT_DO_NOT_EMIT;
|
||||
return INPUT_FILTER_FLAGS_DO_NOT_EMIT;
|
||||
} else if ((*count == 2) && (events[0].value == -13565786) && (events[1].type == EV_KEY) && (events[1].code == KEY_F16)) {
|
||||
*count = 1;
|
||||
events[0].type = EV_KEY;
|
||||
events[0].code = BTN_MODE;
|
||||
events[0].value = events[1].value;
|
||||
|
||||
return INPUT_FILTER_RESULT_OK;
|
||||
return INPUT_FILTER_FLAGS_NONE;
|
||||
} else if ((*count == 2) && (events[0].value == -13565787) && (events[1].type == EV_KEY) && (events[1].code == KEY_F15)) {
|
||||
if (events[1].value == 0) {
|
||||
if (F15_status > 0) {
|
||||
|
|
@ -84,7 +84,7 @@ int input_filter_asus_kb(struct input_event* events, size_t* size, uint32_t* cou
|
|||
}
|
||||
}
|
||||
|
||||
return INPUT_FILTER_RESULT_DO_NOT_EMIT;
|
||||
return INPUT_FILTER_FLAGS_DO_NOT_EMIT;
|
||||
} else if ((*count == 2) && (*size >= 3) && (events[0].value == -13565896) && (events[1].type == EV_KEY) && (events[1].code == KEY_PROG1)) {
|
||||
*count = 3;
|
||||
|
||||
|
|
@ -111,11 +111,11 @@ int input_filter_asus_kb(struct input_event* events, size_t* size, uint32_t* cou
|
|||
events[4].code = BTN_SOUTH;
|
||||
events[4].value = 0;
|
||||
*/
|
||||
return INPUT_FILTER_RESULT_OK;
|
||||
return INPUT_FILTER_FLAGS_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
return INPUT_FILTER_RESULT_OK;
|
||||
return INPUT_FILTER_FLAGS_NONE;
|
||||
}
|
||||
|
||||
static struct libevdev* ev_matches(const char* sysfs_entry, const uinput_filters_t* const filters) {
|
||||
|
|
@ -314,7 +314,8 @@ static void* input_read_thread_func(void* ptr) {
|
|||
// clear out flags
|
||||
msg->flags = 0x00000000U;
|
||||
|
||||
if (ctx->input_filter_fn(msg->ev, &msg->ev_size, &msg->ev_count) != INPUT_FILTER_RESULT_DO_NOT_EMIT) {
|
||||
const uint32_t input_filter_res = ctx->input_filter_fn(msg->ev, &msg->ev_size, &msg->ev_count);
|
||||
if (((input_filter_res & INPUT_FILTER_FLAGS_DO_NOT_EMIT) == 0) && (msg->ev_count > 0)) {
|
||||
if (queue_push(ctx->queue, (void*)msg) != 0) {
|
||||
fprintf(stderr, "Error pushing event.\n");
|
||||
|
||||
|
|
|
|||
|
|
@ -38,6 +38,6 @@ void *input_dev_thread_func(void *ptr);
|
|||
|
||||
int open_and_hide_input();
|
||||
|
||||
int input_filter_identity(struct input_event* events, size_t* size, uint32_t* count);
|
||||
uint32_t input_filter_identity(struct input_event* events, size_t* size, uint32_t* count);
|
||||
|
||||
int input_filter_asus_kb(struct input_event*, size_t*, uint32_t*);
|
||||
uint32_t input_filter_asus_kb(struct input_event*, size_t*, uint32_t*);
|
||||
|
|
@ -14,7 +14,8 @@ typedef struct message {
|
|||
volatile uint32_t flags;
|
||||
} message_t;
|
||||
|
||||
#define INPUT_FILTER_RESULT_OK 0
|
||||
#define INPUT_FILTER_RESULT_DO_NOT_EMIT 1
|
||||
#define INPUT_FILTER_FLAGS_NONE 0x00000000U
|
||||
#define INPUT_FILTER_FLAGS_DO_NOT_EMIT 0x00000001U
|
||||
#define INPUT_FILTER_FLAGS_PRESERVE_TIME 0x00000002U
|
||||
|
||||
typedef int (*input_filter_t)(struct input_event*, size_t*, uint32_t*);
|
||||
typedef uint32_t (*input_filter_t)(struct input_event*, size_t*, uint32_t*);
|
||||
13
output_dev.c
13
output_dev.c
|
|
@ -402,18 +402,21 @@ void *output_dev_thread_func(void *ptr) {
|
|||
void *raw_ev;
|
||||
const int pop_res = queue_pop_timeout(out_dev->queue, &raw_ev, 1000);
|
||||
if (pop_res == 0) {
|
||||
message_t *const msg = (message_t *)raw_ev;
|
||||
message_t *const msg = (message_t*)raw_ev;
|
||||
|
||||
for (uint32_t i = 0; i < msg->ev_count; ++i) {
|
||||
gettimeofday(&now, NULL);
|
||||
|
||||
/*const*/ struct input_event ev = {
|
||||
struct input_event ev = {
|
||||
.code = msg->ev[i].code,
|
||||
.type = msg->ev[i].type,
|
||||
.value = msg->ev[i].value,
|
||||
.time = now,
|
||||
.time = msg->ev[i].time,
|
||||
};
|
||||
|
||||
if ((msg->flags & INPUT_FILTER_FLAGS_PRESERVE_TIME) == 0) {
|
||||
gettimeofday(&now, NULL);
|
||||
ev.time = now;
|
||||
}
|
||||
|
||||
/*
|
||||
if ((ev.type == EV_KEY) && (ev.code == KEY_PROG1)) { // To be wired to F16
|
||||
ev.code = KEY_F12;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue