- introduced explicit swap-yz config state, which acts separately to the

axis mapping. This way mappings won't swap around by themselves when
  swap is turned on or off.
- fixed automatic LED handling.
pull/68/head
John Tsiombikas 2022-03-22 12:29:36 +02:00
rodzic bea696f24f
commit 01e59bed7a
6 zmienionych plików z 54 dodań i 22 usunięć

Wyświetl plik

@ -57,7 +57,7 @@ static int add_cfgopt_devid(int vid, int pid);
enum {TX, TY, TZ, RX, RY, RZ};
static const int def_axmap[] = {0, 2, 1, 3, 5, 4};
static const int def_axmap[] = {0, 1, 2, 3, 4, 5};
static const int def_axinv[] = {0, 1, 1, 0, 1, 1};
struct cfgline {
@ -85,6 +85,7 @@ void default_cfg(struct cfg *cfg)
cfg->dead_threshold[i] = 2;
}
cfg->swapyz = 1;
cfg->led = LED_ON;
cfg->grab_device = 1;
@ -329,26 +330,20 @@ int read_cfg(const char *fname, struct cfg *cfg)
}
} else if(strcmp(key_str, "swap-yz") == 0) {
int swap_yz = 0;
lptr->opt = CFG_SWAPYZ;
if(isint) {
swap_yz = ival;
cfg->swapyz = ival;
} else {
if(strcmp(val_str, "true") == 0 || strcmp(val_str, "on") == 0 || strcmp(val_str, "yes") == 0) {
swap_yz = 1;
cfg->swapyz = 1;
} else if(strcmp(val_str, "false") == 0 || strcmp(val_str, "off") == 0 || strcmp(val_str, "no") == 0) {
swap_yz = 0;
cfg->swapyz = 0;
} else {
logmsg(LOG_WARNING, "invalid configuration value for %s, expected a boolean value.\n", key_str);
continue;
}
}
for(i=0; i<6; i++) {
cfg->map_axis[i] = swap_yz ? i : def_axmap[i];
}
} else if(sscanf(key_str, "axismap%d", &axisidx) == 1) {
EXPECT(isint);
if(axisidx < 0 || axisidx >= MAX_AXES) {
@ -565,6 +560,10 @@ int write_cfg(const char *fname, struct cfg *cfg)
}
}
if(cfg->swapyz != def.swapyz) {
add_cfgopt(CFG_SWAPYZ, 0, "swap-yz = %s", cfg->swapyz ? "true" : "false");
}
if(cfg->led != def.led) {
add_cfgopt(CFG_LED, 0, "led = %s", (cfg->led ? (cfg->led == LED_AUTO ? "auto" : "on") : "off"));
}

Wyświetl plik

@ -52,6 +52,7 @@ struct cfg {
int bnact[MAX_BUTTONS];
int kbmap[MAX_BUTTONS];
char *kbmap_str[MAX_BUTTONS];
int swapyz;
int led, grab_device;
char serial_dev[PATH_MAX];
int repeat_msec;

Wyświetl plik

@ -125,6 +125,21 @@ static struct dev_event *device_event_in_use(struct device *dev)
return NULL;
}
static inline int map_axis(int devaxis)
{
const static int swaptab[] = {0, 2, 1, 3, 5, 4};
int axis = cfg.map_axis[devaxis];
if(axis < 0 || axis >= 6) {
return -1;
}
if(!cfg.swapyz) {
return swaptab[axis];
}
return axis;
}
/* process_input processes an device input event, and dispatches
* spacenav events to the clients by calling dispatch_event.
* relative inputs (INP_MOTION) are accumulated, and dispatched when
@ -133,7 +148,7 @@ static struct dev_event *device_event_in_use(struct device *dev)
*/
void process_input(struct device *dev, struct dev_input *inp)
{
int sign;
int sign, axis;
struct dev_event *dev_ev;
float sens_rot, sens_trans;
@ -142,15 +157,15 @@ void process_input(struct device *dev, struct dev_input *inp)
if(abs(inp->val) < cfg.dead_threshold[inp->idx] ) {
inp->val = 0;
}
if((inp->idx = cfg.map_axis[inp->idx]) < 0) {
if((axis = map_axis(inp->idx)) == -1) {
break;
}
sign = cfg.invert[inp->idx] ? -1 : 1;
sign = cfg.invert[axis] ? -1 : 1;
sens_rot = disable_rotation ? 0 : cfg.sens_rot[inp->idx - 3];
sens_trans = disable_translation ? 0 : cfg.sens_trans[inp->idx];
sens_rot = disable_rotation ? 0 : cfg.sens_rot[axis - 3];
sens_trans = disable_translation ? 0 : cfg.sens_trans[axis];
inp->val = (int)((float)inp->val * cfg.sensitivity * (inp->idx < 3 ? sens_trans : sens_rot));
inp->val = (int)((float)inp->val * cfg.sensitivity * (axis < 3 ? sens_trans : sens_rot));
dev_ev = device_event_in_use(dev);
if(verbose && dev_ev == NULL)
@ -161,7 +176,7 @@ void process_input(struct device *dev, struct dev_input *inp)
}
dev_ev->event.type = EVENT_MOTION;
dev_ev->event.motion.data = (int*)&dev_ev->event.motion.x;
dev_ev->event.motion.data[inp->idx] = sign * inp->val;
dev_ev->event.motion.data[axis] = sign * inp->val;
dev_ev->pending = 1;
break;

Wyświetl plik

@ -63,6 +63,8 @@ enum {
REQ_GCFG_BNACTION, /* get button action: Q[0] bidx - R[0] bidx R[1] action R[6] status */
REQ_SCFG_KBMAP, /* set keyboard mapping: Q[0] bidx Q[1] keysym - R[6] status */
REQ_GCFG_KBMAP, /* get keyboard mapping: Q[0] bidx - R[0] bidx R[1] keysym R[6] status */
REQ_SCFG_SWAPYZ, /* set Y-Z axis swap: Q[0] swap - R[6] status */
REQ_GCFG_SWAPYZ, /* get Y-Z axis swap: R[0] swap R[6] status */
REQ_SCFG_LED, /* set LED state: Q[0] state - R[6] status */
REQ_GCFG_LED, /* get LED state: R[0] state R[6] status */
REQ_SCFG_GRAB, /* set device grabbing: Q[0] state - R[6] status */

Wyświetl plik

@ -543,11 +543,22 @@ static int handle_request(struct client *c, struct reqresp *req)
#endif
break;
case REQ_SCFG_SWAPYZ:
cfg.swapyz = req->data[0] ? 1 : 0;
sendresp(c, req, 0);
case REQ_GCFG_SWAPYZ:
req->data[0] = cfg.swapyz;
sendresp(c, req, 0);
break;
case REQ_SCFG_LED:
cfg.led = req->data[0] ? 1 : 0;
if((dev = get_client_device(c)) && dev->set_led) {
dev->set_led(dev, cfg.led);
if(req->data[0] < 0 || req->data[0] >= 3) {
sendresp(c, req, -1);
break;
}
cfg.led = req->data[0];
cfg_changed();
sendresp(c, req, 0);
break;

Wyświetl plik

@ -448,9 +448,13 @@ void cfg_changed(void)
while(dev) {
if(is_device_valid(dev)) {
if(verbose) {
logmsg(LOG_INFO, "turn led %s, device: %s\n", cfg.led ? "on": "off", dev->name);
logmsg(LOG_INFO, "led %s, device: %s\n", cfg.led ? (cfg.led == LED_AUTO ? "auto" : "on"): "off", dev->name);
}
if(cfg.led == LED_ON || (cfg.led == LED_AUTO && first_client())) {
set_device_led(dev, 1);
} else {
set_device_led(dev, 0);
}
set_device_led(dev, cfg.led);
}
dev = dev->next;
}