From b922cb75f8e8e8de357875a14e7b04a675b4d173 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Sat, 26 Mar 2022 15:06:03 +0200 Subject: [PATCH] - added raw axis/button events - fixed dropping events when the client's event mask doesn't match --- src/client.h | 10 ++++++---- src/event.c | 24 ++++++++++++++++++++++++ src/event.h | 14 +++++++++++++- src/proto.h | 2 ++ src/proto_unix.c | 27 ++++++++++++++++++++++----- 5 files changed, 67 insertions(+), 10 deletions(-) diff --git a/src/client.h b/src/client.h index 96021bc..13132a6 100644 --- a/src/client.h +++ b/src/client.h @@ -35,10 +35,12 @@ enum { /* event selection (must match SPNAV_EVMASK* in libspnav/spnav.h) */ enum { - EVMASK_MOTION = 1, - EVMASK_BUTTON = 2, - EVMASK_DEV = 4, - EVMASK_CFG = 8 + EVMASK_MOTION = 0x01, + EVMASK_BUTTON = 0x02, + EVMASK_DEV = 0x04, + EVMASK_CFG = 0x08, + EVMASK_RAWAXIS = 0x10, + EVMASK_RAWBUTTON = 0x20 }; struct device; diff --git a/src/event.c b/src/event.c index 2c3af28..c404de5 100644 --- a/src/event.c +++ b/src/event.c @@ -151,9 +151,15 @@ void process_input(struct device *dev, struct dev_input *inp) int sign, axis; struct dev_event *dev_ev; float sens_rot, sens_trans; + spnav_event ev; switch(inp->type) { case INP_MOTION: + ev.type = EVENT_RAWAXIS; + ev.axis.idx = inp->idx; + ev.axis.value = inp->val; + broadcast_event(&ev); + if(abs(inp->val) < cfg.dead_threshold[inp->idx] ) { inp->val = 0; } @@ -181,6 +187,11 @@ void process_input(struct device *dev, struct dev_input *inp) break; case INP_BUTTON: + ev.type = EVENT_RAWBUTTON; + ev.button.press = inp->val; + ev.button.bnum = inp->idx; + broadcast_event(&ev); + /* check to see if the button has been bound to an action */ if(cfg.bnact[inp->idx] > 0) { handle_button_action(cfg.bnact[inp->idx], inp->val); @@ -248,12 +259,15 @@ static void handle_button_action(int act, int pressed) switch(act) { case BNACT_SENS_INC: cfg.sensitivity *= 1.1f; + broadcast_cfg_event(REQ_GCFG_SENS, *(int*)&cfg.sensitivity); break; case BNACT_SENS_DEC: cfg.sensitivity *= 0.9f; + broadcast_cfg_event(REQ_GCFG_SENS, *(int*)&cfg.sensitivity); break; case BNACT_SENS_RESET: cfg.sensitivity = 1.0f; + broadcast_cfg_event(REQ_GCFG_SENS, *(int*)&cfg.sensitivity); break; case BNACT_DISABLE_ROTATION: disable_rotation = !disable_rotation; @@ -331,6 +345,16 @@ void broadcast_event(spnav_event *ev) } } +void broadcast_cfg_event(int cfg, int val) +{ + spnav_event ev = {0}; + + ev.type = EVENT_CFG; + ev.cfg.cfg = cfg; + ev.cfg.data[0] = val; + broadcast_event(&ev); +} + static void send_event(spnav_event *ev, struct client *c) { switch(get_client_type(c)) { diff --git a/src/event.h b/src/event.h index 5a01563..bbd5447 100644 --- a/src/event.h +++ b/src/event.h @@ -29,7 +29,10 @@ enum { /* protocol v1 events */ EVENT_DEV, /* device change */ - EVENT_CFG /* configuration change */ + EVENT_CFG, /* configuration change */ + + EVENT_RAWAXIS, + EVENT_RAWBUTTON }; enum { DEV_ADD, DEV_RM }; @@ -62,12 +65,19 @@ struct event_cfg { int data[6]; }; +struct event_axis { + int type; + int idx; + int value; +}; + typedef union spnav_event { int type; struct event_motion motion; struct event_button button; struct event_dev dev; struct event_cfg cfg; + struct event_axis axis; } spnav_event; enum { @@ -96,4 +106,6 @@ void repeat_last_event(struct device *dev); /* broadcasts an event to all clients */ void broadcast_event(spnav_event *ev); +void broadcast_cfg_event(int cfg, int val); + #endif /* EVENT_H_ */ diff --git a/src/proto.h b/src/proto.h index 1ea83e7..5b2a712 100644 --- a/src/proto.h +++ b/src/proto.h @@ -12,6 +12,8 @@ enum { UEV_RELEASE, UEV_DEV, UEV_CFG, + UEV_RAWAXIS, + UEV_RAWBUTTON, MAX_UEV }; diff --git a/src/proto_unix.c b/src/proto_unix.c index 8a0a56a..85408d5 100644 --- a/src/proto_unix.c +++ b/src/proto_unix.c @@ -106,7 +106,7 @@ void send_uevent(spnav_event *ev, struct client *c) switch(ev->type) { case EVENT_MOTION: - if(!(c->evmask & EVMASK_MOTION)) break; + if(!(c->evmask & EVMASK_MOTION)) return; data[0] = UEV_MOTION; @@ -118,15 +118,32 @@ void send_uevent(spnav_event *ev, struct client *c) data[7] = ev->motion.period; break; + case EVENT_RAWAXIS: + if(!(c->evmask & EVMASK_RAWAXIS)) return; + + data[0] = UEV_RAWAXIS; + data[1] = ev->axis.idx; + data[2] = ev->axis.value; + break; + case EVENT_BUTTON: - if(!(c->evmask & EVMASK_BUTTON)) break; + if(!(c->evmask & EVMASK_BUTTON)) return; data[0] = ev->button.press ? UEV_PRESS : UEV_RELEASE; data[1] = ev->button.bnum; + data[2] = ev->button.press; + break; + + case EVENT_RAWBUTTON: + if(!(c->evmask & EVMASK_RAWBUTTON)) return; + + data[0] = UEV_RAWBUTTON; + data[1] = ev->button.bnum; + data[2] = ev->button.press; break; case EVENT_DEV: - if(!(c->evmask & EVMASK_DEV)) break; + if(!(c->evmask & EVMASK_DEV)) return; data[0] = UEV_DEV; data[1] = ev->dev.op; @@ -137,7 +154,7 @@ void send_uevent(spnav_event *ev, struct client *c) break; case EVENT_CFG: - if(!(c->evmask & EVMASK_CFG)) break; + if(!(c->evmask & EVMASK_CFG)) return; data[0] = UEV_CFG; data[1] = ev->cfg.cfg; @@ -145,7 +162,7 @@ void send_uevent(spnav_event *ev, struct client *c) break; default: - break; + return; } while(write(get_client_socket(c), data, sizeof data) == -1 && errno == EINTR);