- added raw axis/button events

- fixed dropping events when the client's event mask doesn't match
pull/68/head
John Tsiombikas 2022-03-26 15:06:03 +02:00
rodzic 3fb72ed7ef
commit b922cb75f8
5 zmienionych plików z 67 dodań i 10 usunięć

Wyświetl plik

@ -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;

Wyświetl plik

@ -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)) {

Wyświetl plik

@ -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_ */

Wyświetl plik

@ -12,6 +12,8 @@ enum {
UEV_RELEASE,
UEV_DEV,
UEV_CFG,
UEV_RAWAXIS,
UEV_RAWBUTTON,
MAX_UEV
};

Wyświetl plik

@ -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);