kopia lustrzana https://github.com/FreeSpacenav/spnavcfg
started converting GUI to use the new protocol
rodzic
97673e7f9d
commit
a3403e5ea2
29
Makefile.in
29
Makefile.in
|
@ -1,14 +1,14 @@
|
|||
obj = spnavcfg.o front_gtk.o back.o cfgfile.o
|
||||
dep = $(obj:.o=.d)
|
||||
src = $(wildcard src/*.c)
|
||||
obj = $(src:.c=.o)
|
||||
dep = $(src:.c=.d)
|
||||
bin = spnavcfg
|
||||
|
||||
warn = -Wall
|
||||
warn = -pedantic -Wall
|
||||
|
||||
CC = gcc
|
||||
CC ?= gcc
|
||||
SED = sed
|
||||
INSTALL = install
|
||||
CFLAGS = -pedantic $(warn) $(dbg) $(opt) `pkg-config --cflags gtk+-2.0 gmodule-export-2.0` \
|
||||
$(add_cflags)
|
||||
CFLAGS = $(warn) $(dbg) $(opt) `pkg-config --cflags gtk+-2.0 gmodule-export-2.0` \
|
||||
$(add_cflags) -MMD
|
||||
LDFLAGS = `pkg-config --libs gtk+-2.0 gmodule-export-2.0` -lX11 $(add_ldflags)
|
||||
|
||||
$(bin): $(obj)
|
||||
|
@ -16,23 +16,26 @@ $(bin): $(obj)
|
|||
|
||||
-include $(dep)
|
||||
|
||||
%.o: $(srcdir)/%.c | $(srcdir)/ui.h
|
||||
src/main.o: src/main.c src/ui.h
|
||||
$(CC) $(CFLAGS) -c $< -o $@
|
||||
$(CPP) $(CFLAGS) $< -MM -MT $@ >$(@:.o=.d)
|
||||
|
||||
$(srcdir)/ui.h: $(srcdir)/ui/ui.xml
|
||||
src/ui.h: ui/ui.xml
|
||||
echo 'static const char *ui_xml =' >$@
|
||||
$(SED) 's/"/\\"/g; s/^.*$$/ "&\\n"/' $< >>$@
|
||||
echo ';' >>$@
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -f $(obj) $(bin) $(srcdir)/ui.h
|
||||
rm -f $(obj) $(bin) src/ui.h
|
||||
|
||||
.PHONY: cleandep
|
||||
cleandep:
|
||||
rm -f $(dep)
|
||||
|
||||
.PHONY: install
|
||||
install:
|
||||
$(INSTALL) -d $(DESTDIR)$(PREFIX)/bin
|
||||
$(INSTALL) -m 4775 $(bin) $(DESTDIR)$(PREFIX)/bin/$(bin)
|
||||
mkdir -p $(DESTDIR)$(PREFIX)/bin
|
||||
cp $(bin) $(DESTDIR)$(PREFIX)/bin/$(bin)
|
||||
for i in 48 128 256; do \
|
||||
destdir=$(DESTDIR)$(PREFIX)/share/icons/hicolor/$${i}x$${i}/apps; \
|
||||
mkdir -p $$destdir; \
|
||||
|
|
138
back.c
138
back.c
|
@ -1,138 +0,0 @@
|
|||
/*
|
||||
spnavcfg - an interactive GUI configurator for the spacenavd daemon.
|
||||
Copyright (C) 2007-2009 John Tsiombikas <nuclear@siggraph.org>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
#include <errno.h>
|
||||
#include <ctype.h>
|
||||
#include <unistd.h>
|
||||
#include "cfgfile.h"
|
||||
#include "cmd.h"
|
||||
|
||||
#define CFGFILE "/etc/spnavrc"
|
||||
#define PIDFILE "/var/run/spnavd.pid"
|
||||
|
||||
int get_daemon_pid(void);
|
||||
static int update_cfg(void);
|
||||
static void sig(int s);
|
||||
|
||||
static struct cfg cfg;
|
||||
static int dpid = -1;
|
||||
|
||||
int backend(int pfd)
|
||||
{
|
||||
signal(SIGTERM, sig);
|
||||
|
||||
for(;;) {
|
||||
ssize_t res;
|
||||
int cmd, tmp;
|
||||
|
||||
/* get command */
|
||||
cmd = 0;
|
||||
if(read(pfd, &cmd, 1) == -1 && errno != EINTR) {
|
||||
perror("pipe read blew up in my face! wtf");
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch(cmd) {
|
||||
case CMD_PING:
|
||||
tmp = (dpid = get_daemon_pid()) != -1;
|
||||
write(pfd, &tmp, 1);
|
||||
break;
|
||||
|
||||
case CMD_CFG:
|
||||
{
|
||||
char *buf = (char*)&cfg;
|
||||
int sz = sizeof cfg;
|
||||
|
||||
while(sz && (res = read(pfd, buf, sz)) > 0) {
|
||||
buf += res;
|
||||
sz -= res;
|
||||
}
|
||||
update_cfg();
|
||||
}
|
||||
break;
|
||||
|
||||
case CMD_STARTX:
|
||||
case CMD_STOPX:
|
||||
if(dpid == -1) {
|
||||
if((dpid = get_daemon_pid()) == -1) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
if(kill(dpid, cmd == CMD_STARTX ? SIGUSR1 : SIGUSR2) == -1) {
|
||||
if(errno != EPERM) {
|
||||
dpid = -1;
|
||||
kill(getppid(), SIGUSR2);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr, "unknown CMD: %d\n", (int)cmd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_daemon_pid(void)
|
||||
{
|
||||
FILE *fp;
|
||||
char buf[64];
|
||||
|
||||
if(!(fp = fopen(PIDFILE, "r"))) {
|
||||
fprintf(stderr, "no spacenav pid file, can't find daemon\n");
|
||||
return -1;
|
||||
}
|
||||
if(!fgets(buf, sizeof buf, fp) || !isdigit(buf[0])) {
|
||||
fprintf(stderr, "corrupted pidfile, can't find the daemon\n");
|
||||
fclose(fp);
|
||||
return -1;
|
||||
}
|
||||
fclose(fp);
|
||||
return atoi(buf);
|
||||
}
|
||||
|
||||
static int update_cfg(void)
|
||||
{
|
||||
if(write_cfg(CFGFILE, &cfg) == -1) {
|
||||
fprintf(stderr, "failed to update config file\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(dpid == -1) {
|
||||
if((dpid = get_daemon_pid()) == -1) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if(kill(dpid, SIGHUP) == -1 && errno != EPERM) {
|
||||
dpid = -1; /* invalidate pid, will be searched again next time */
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void sig(int s)
|
||||
{
|
||||
_exit(0);
|
||||
}
|
473
cfgfile.c
473
cfgfile.c
|
@ -1,473 +0,0 @@
|
|||
/*
|
||||
spnavcfg - an interactive GUI configurator for the spacenavd daemon.
|
||||
Copyright (C) 2007-2019 John Tsiombikas <nuclear@member.fsf.org>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include "cfgfile.h"
|
||||
|
||||
enum {TX, TY, TZ, RX, RY, RZ};
|
||||
|
||||
static const int def_axmap[] = {0, 2, 1, 3, 5, 4};
|
||||
static const int def_axinv[] = {0, 1, 1, 0, 1, 1};
|
||||
|
||||
void default_cfg(struct cfg *cfg)
|
||||
{
|
||||
int i;
|
||||
|
||||
memset(cfg, 0, sizeof *cfg);
|
||||
|
||||
cfg->sensitivity = 1.0;
|
||||
for(i=0; i<3; i++) {
|
||||
cfg->sens_trans[i] = cfg->sens_rot[i] = 1.0;
|
||||
}
|
||||
|
||||
for(i=0; i<6; i++) {
|
||||
cfg->dead_threshold[i] = 2;
|
||||
}
|
||||
|
||||
cfg->led = LED_ON;
|
||||
cfg->grab_device = 1;
|
||||
|
||||
for(i=0; i<6; i++) {
|
||||
cfg->invert[i] = def_axinv[i];
|
||||
cfg->map_axis[i] = def_axmap[i];
|
||||
}
|
||||
|
||||
for(i=0; i<MAX_BUTTONS; i++) {
|
||||
cfg->map_button[i] = i;
|
||||
cfg->kbmap_str[i] = 0;
|
||||
cfg->kbmap[i] = 0;
|
||||
}
|
||||
|
||||
cfg->repeat_msec = -1;
|
||||
|
||||
for(i=0; i<MAX_CUSTOM; i++) {
|
||||
cfg->devname[i] = 0;
|
||||
cfg->devid[i][0] = cfg->devid[i][1] = -1;
|
||||
}
|
||||
}
|
||||
|
||||
#define EXPECT(cond) \
|
||||
do { \
|
||||
if(!(cond)) { \
|
||||
fprintf(stderr, "%s: invalid value for %s\n", __func__, key_str); \
|
||||
continue; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
int read_cfg(const char *fname, struct cfg *cfg)
|
||||
{
|
||||
FILE *fp;
|
||||
char buf[512];
|
||||
struct flock flk;
|
||||
int num_devid = 0;
|
||||
/*int num_devnames = 0;*/
|
||||
|
||||
default_cfg(cfg);
|
||||
|
||||
printf("reading config file: %s\n", fname);
|
||||
if(!(fp = fopen(fname, "r"))) {
|
||||
fprintf(stderr, "failed to open config file %s: %s. using defaults.\n", fname, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* acquire shared read lock */
|
||||
flk.l_type = F_RDLCK;
|
||||
flk.l_start = flk.l_len = 0;
|
||||
flk.l_whence = SEEK_SET;
|
||||
while(fcntl(fileno(fp), F_SETLKW, &flk) == -1);
|
||||
|
||||
while(fgets(buf, sizeof buf, fp)) {
|
||||
int isint, isfloat, ival, i, bnidx, axisidx;
|
||||
float fval;
|
||||
char *endp, *key_str, *val_str, *line = buf;
|
||||
while(*line == ' ' || *line == '\t') line++;
|
||||
|
||||
if(!*line || *line == '\n' || *line == '\r' || *line == '#') {
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!(key_str = strtok(line, " =\n\t\r"))) {
|
||||
fprintf(stderr, "invalid config line: %s, skipping.\n", line);
|
||||
continue;
|
||||
}
|
||||
if(!(val_str = strtok(0, " =\n\t\r"))) {
|
||||
fprintf(stderr, "missing value for config key: %s\n", key_str);
|
||||
continue;
|
||||
}
|
||||
|
||||
ival = strtol(val_str, &endp, 10);
|
||||
isint = (endp > val_str);
|
||||
|
||||
fval = strtod(val_str, &endp);
|
||||
isfloat = (endp > val_str);
|
||||
|
||||
if(strcmp(key_str, "repeat-interval") == 0) {
|
||||
EXPECT(isint);
|
||||
cfg->repeat_msec = ival;
|
||||
|
||||
} else if(strcmp(key_str, "dead-zone") == 0) {
|
||||
EXPECT(isint);
|
||||
for(i=0; i<6; i++) {
|
||||
cfg->dead_threshold[i] = ival;
|
||||
}
|
||||
|
||||
} else if(strcmp(key_str, "dead-zone-translation-x") == 0) {
|
||||
EXPECT(isint);
|
||||
cfg->dead_threshold[0] = ival;
|
||||
|
||||
} else if(strcmp(key_str, "dead-zone-translation-y") == 0) {
|
||||
EXPECT(isint);
|
||||
cfg->dead_threshold[1] = ival;
|
||||
|
||||
} else if(strcmp(key_str, "dead-zone-translation-z") == 0) {
|
||||
EXPECT(isint);
|
||||
cfg->dead_threshold[2] = ival;
|
||||
|
||||
} else if(strcmp(key_str, "dead-zone-rotation-x") == 0) {
|
||||
EXPECT(isint);
|
||||
cfg->dead_threshold[3] = ival;
|
||||
|
||||
} else if(strcmp(key_str, "dead-zone-rotation-y") == 0) {
|
||||
EXPECT(isint);
|
||||
cfg->dead_threshold[4] = ival;
|
||||
|
||||
} else if(strcmp(key_str, "dead-zone-rotation-z") == 0) {
|
||||
EXPECT(isint);
|
||||
cfg->dead_threshold[5] = ival;
|
||||
|
||||
} else if(strcmp(key_str, "sensitivity") == 0) {
|
||||
EXPECT(isfloat);
|
||||
cfg->sensitivity = fval;
|
||||
|
||||
} else if(strcmp(key_str, "sensitivity-translation") == 0) {
|
||||
EXPECT(isfloat);
|
||||
cfg->sens_trans[0] = cfg->sens_trans[1] = cfg->sens_trans[2] = fval;
|
||||
|
||||
} else if(strcmp(key_str, "sensitivity-translation-x") == 0) {
|
||||
EXPECT(isfloat);
|
||||
cfg->sens_trans[0] = fval;
|
||||
|
||||
} else if(strcmp(key_str, "sensitivity-translation-y") == 0) {
|
||||
EXPECT(isfloat);
|
||||
cfg->sens_trans[1] = fval;
|
||||
|
||||
} else if(strcmp(key_str, "sensitivity-translation-z") == 0) {
|
||||
EXPECT(isfloat);
|
||||
cfg->sens_trans[2] = fval;
|
||||
|
||||
} else if(strcmp(key_str, "sensitivity-rotation") == 0) {
|
||||
EXPECT(isfloat);
|
||||
cfg->sens_rot[0] = cfg->sens_rot[1] = cfg->sens_rot[2] = fval;
|
||||
|
||||
} else if(strcmp(key_str, "sensitivity-rotation-x") == 0) {
|
||||
EXPECT(isfloat);
|
||||
cfg->sens_rot[0] = fval;
|
||||
|
||||
} else if(strcmp(key_str, "sensitivity-rotation-y") == 0) {
|
||||
EXPECT(isfloat);
|
||||
cfg->sens_rot[1] = fval;
|
||||
|
||||
} else if(strcmp(key_str, "sensitivity-rotation-z") == 0) {
|
||||
EXPECT(isfloat);
|
||||
cfg->sens_rot[2] = fval;
|
||||
|
||||
} else if(strcmp(key_str, "invert-rot") == 0) {
|
||||
if(strchr(val_str, 'x')) {
|
||||
cfg->invert[RX] = !def_axinv[RX];
|
||||
}
|
||||
if(strchr(val_str, 'y')) {
|
||||
cfg->invert[RY] = !def_axinv[RY];
|
||||
}
|
||||
if(strchr(val_str, 'z')) {
|
||||
cfg->invert[RZ] = !def_axinv[RZ];
|
||||
}
|
||||
|
||||
} else if(strcmp(key_str, "invert-trans") == 0) {
|
||||
if(strchr(val_str, 'x')) {
|
||||
cfg->invert[TX] = !def_axinv[TX];
|
||||
}
|
||||
if(strchr(val_str, 'y')) {
|
||||
cfg->invert[TY] = !def_axinv[TY];
|
||||
}
|
||||
if(strchr(val_str, 'z')) {
|
||||
cfg->invert[TZ] = !def_axinv[TZ];
|
||||
}
|
||||
|
||||
} else if(strcmp(key_str, "swap-yz") == 0) {
|
||||
int i, swap_yz = 0;
|
||||
|
||||
if(isint) {
|
||||
swap_yz = ival;
|
||||
} else {
|
||||
if(strcmp(val_str, "true") == 0 || strcmp(val_str, "on") == 0 || strcmp(val_str, "yes") == 0) {
|
||||
swap_yz = 1;
|
||||
} else if(strcmp(val_str, "false") == 0 || strcmp(val_str, "off") == 0 || strcmp(val_str, "no") == 0) {
|
||||
swap_yz = 0;
|
||||
} else {
|
||||
fprintf(stderr, "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) {
|
||||
fprintf(stderr, "invalid option %s, valid input axis numbers 0 - %d\n", key_str, MAX_AXES - 1);
|
||||
continue;
|
||||
}
|
||||
if(ival < 0 || ival >= 6) {
|
||||
fprintf(stderr, "invalid config value for %s, expected a number from 0 to 6\n", key_str);
|
||||
continue;
|
||||
}
|
||||
cfg->map_axis[axisidx] = ival;
|
||||
|
||||
} else if(sscanf(key_str, "bnmap%d", &bnidx) == 1) {
|
||||
EXPECT(isint);
|
||||
if(bnidx < 0 || bnidx >= MAX_BUTTONS || ival < 0 || ival >= MAX_BUTTONS) {
|
||||
fprintf(stderr, "invalid configuration value for %s, expected a number from 0 to %d\n", key_str, MAX_BUTTONS);
|
||||
continue;
|
||||
}
|
||||
if(cfg->map_button[bnidx] != bnidx) {
|
||||
fprintf(stderr, "warning: multiple mappings for button %d\n", bnidx);
|
||||
}
|
||||
cfg->map_button[bnidx] = ival;
|
||||
|
||||
} else if(sscanf(key_str, "kbmap%d", &bnidx) == 1) {
|
||||
if(bnidx < 0 || bnidx >= MAX_BUTTONS) {
|
||||
fprintf(stderr, "invalid configuration value for %s, expected a number from 0 to %d\n", key_str, MAX_BUTTONS);
|
||||
continue;
|
||||
}
|
||||
if(cfg->kbmap_str[bnidx]) {
|
||||
fprintf(stderr, "warning: multiple keyboard mappings for button %d: %s -> %s\n", bnidx, cfg->kbmap_str[bnidx], val_str);
|
||||
free(cfg->kbmap_str[bnidx]);
|
||||
}
|
||||
cfg->kbmap_str[bnidx] = strdup(val_str);
|
||||
|
||||
} else if(strcmp(key_str, "led") == 0) {
|
||||
if(isint) {
|
||||
cfg->led = ival;
|
||||
} else {
|
||||
if(strcmp(val_str, "auto") == 0) {
|
||||
cfg->led = LED_AUTO;
|
||||
} else if(strcmp(val_str, "true") == 0 || strcmp(val_str, "on") == 0 || strcmp(val_str, "yes") == 0) {
|
||||
cfg->led = LED_ON;
|
||||
} else if(strcmp(val_str, "false") == 0 || strcmp(val_str, "off") == 0 || strcmp(val_str, "no") == 0) {
|
||||
cfg->led = LED_OFF;
|
||||
} else {
|
||||
fprintf(stderr, "invalid configuration value for %s, expected a boolean value.\n", key_str);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
} else if(strcmp(key_str, "grab") == 0) {
|
||||
if(isint) {
|
||||
cfg->grab_device = ival;
|
||||
} else {
|
||||
if(strcmp(val_str, "true") == 0 || strcmp(val_str, "on") == 0 || strcmp(val_str, "yes") == 0) {
|
||||
cfg->grab_device = 1;
|
||||
} else if(strcmp(val_str, "false") == 0 || strcmp(val_str, "off") == 0 || strcmp(val_str, "no") == 0) {
|
||||
cfg->grab_device = 0;
|
||||
} else {
|
||||
fprintf(stderr, "invalid configuration value for %s, expected a boolean value.\n", key_str);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
} else if(strcmp(key_str, "serial") == 0) {
|
||||
strncpy(cfg->serial_dev, val_str, PATH_MAX - 1);
|
||||
|
||||
} else if(strcmp(key_str, "device-id") == 0) {
|
||||
unsigned int vendor, prod;
|
||||
if(sscanf(val_str, "%x:%x", &vendor, &prod) == 2) {
|
||||
cfg->devid[num_devid][0] = (int)vendor;
|
||||
cfg->devid[num_devid][1] = (int)prod;
|
||||
num_devid++;
|
||||
} else {
|
||||
fprintf(stderr, "invalid configuration value for %s, expected a vendorid:productid pair\n", key_str);
|
||||
continue;
|
||||
}
|
||||
|
||||
} else {
|
||||
fprintf(stderr, "unrecognized config option: %s\n", key_str);
|
||||
}
|
||||
}
|
||||
|
||||
/* unlock */
|
||||
flk.l_type = F_UNLCK;
|
||||
flk.l_start = flk.l_len = 0;
|
||||
flk.l_whence = SEEK_SET;
|
||||
fcntl(fileno(fp), F_SETLK, &flk);
|
||||
|
||||
fclose(fp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int write_cfg(const char *fname, struct cfg *cfg)
|
||||
{
|
||||
int i, wrote_comment;
|
||||
FILE *fp;
|
||||
struct flock flk;
|
||||
|
||||
if(!(fp = fopen(fname, "w"))) {
|
||||
fprintf(stderr, "failed to write config file %s: %s\n", fname, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* acquire exclusive write lock */
|
||||
flk.l_type = F_WRLCK;
|
||||
flk.l_start = flk.l_len = 0;
|
||||
flk.l_whence = SEEK_SET;
|
||||
while(fcntl(fileno(fp), F_SETLKW, &flk) == -1);
|
||||
|
||||
fprintf(fp, "# sensitivity is multiplied with every motion (1.0 normal).\n");
|
||||
fprintf(fp, "sensitivity = %.3f\n\n", cfg->sensitivity);
|
||||
|
||||
fprintf(fp, "# separate sensitivity for rotation and translation.\n");
|
||||
|
||||
if(cfg->sens_trans[0] == cfg->sens_trans[1] && cfg->sens_trans[1] == cfg->sens_trans[2]) {
|
||||
fprintf(fp, "sensitivity-translation = %.3f\n", cfg->sens_trans[0]);
|
||||
} else {
|
||||
fprintf(fp, "sensitivity-translation-x = %.3f\n", cfg->sens_trans[0]);
|
||||
fprintf(fp, "sensitivity-translation-y = %.3f\n", cfg->sens_trans[1]);
|
||||
fprintf(fp, "sensitivity-translation-z = %.3f\n", cfg->sens_trans[2]);
|
||||
}
|
||||
|
||||
if(cfg->sens_rot[0] == cfg->sens_rot[1] && cfg->sens_rot[1] == cfg->sens_rot[2]) {
|
||||
fprintf(fp, "sensitivity-rotation = %.3f\n", cfg->sens_rot[0]);
|
||||
} else {
|
||||
fprintf(fp, "sensitivity-rotation-x = %.3f\n", cfg->sens_rot[0]);
|
||||
fprintf(fp, "sensitivity-rotation-y = %.3f\n", cfg->sens_rot[1]);
|
||||
fprintf(fp, "sensitivity-rotation-z = %.3f\n", cfg->sens_rot[2]);
|
||||
}
|
||||
fputc('\n', fp);
|
||||
|
||||
fprintf(fp, "# dead zone; any motion less than this number, is discarded as noise.\n");
|
||||
|
||||
if(cfg->dead_threshold[0] == cfg->dead_threshold[1] && cfg->dead_threshold[1] == cfg->dead_threshold[2] && cfg->dead_threshold[2] == cfg->dead_threshold[3] && cfg->dead_threshold[3] == cfg->dead_threshold[4] && cfg->dead_threshold[4] == cfg->dead_threshold[5]) {
|
||||
fprintf(fp, "dead-zone = %d\n", cfg->dead_threshold[0]);
|
||||
} else {
|
||||
fprintf(fp, "dead-zone-translation-x = %d\n", cfg->dead_threshold[0]);
|
||||
fprintf(fp, "dead-zone-translation-y = %d\n", cfg->dead_threshold[1]);
|
||||
fprintf(fp, "dead-zone-translation-z = %d\n", cfg->dead_threshold[2]);
|
||||
fprintf(fp, "dead-zone-rotation-x = %d\n", cfg->dead_threshold[3]);
|
||||
fprintf(fp, "dead-zone-rotation-y = %d\n", cfg->dead_threshold[4]);
|
||||
fprintf(fp, "dead-zone-rotation-z = %d\n", cfg->dead_threshold[5]);
|
||||
}
|
||||
fputc('\n', fp);
|
||||
|
||||
fprintf(fp, "# repeat interval; non-deadzone events are repeated every so many milliseconds (-1 to disable)\n");
|
||||
fprintf(fp, "repeat-interval = %d\n", cfg->repeat_msec);
|
||||
|
||||
if(cfg->invert[0] != def_axinv[0] || cfg->invert[1] != def_axinv[1] || cfg->invert[2] != def_axinv[2]) {
|
||||
fprintf(fp, "# invert translations on some axes.\n");
|
||||
fprintf(fp, "invert-trans = ");
|
||||
if(cfg->invert[0] != def_axinv[0]) fputc('x', fp);
|
||||
if(cfg->invert[1] != def_axinv[1]) fputc('y', fp);
|
||||
if(cfg->invert[2] != def_axinv[2]) fputc('z', fp);
|
||||
fputs("\n\n", fp);
|
||||
}
|
||||
|
||||
if(cfg->invert[3] != def_axinv[3] || cfg->invert[4] != def_axinv[4] || cfg->invert[5] != def_axinv[5]) {
|
||||
fprintf(fp, "# invert rotations around some axes.\n");
|
||||
fprintf(fp, "invert-rot = ");
|
||||
if(cfg->invert[3] != def_axinv[3]) fputc('x', fp);
|
||||
if(cfg->invert[4] != def_axinv[4]) fputc('y', fp);
|
||||
if(cfg->invert[5] != def_axinv[5]) fputc('z', fp);
|
||||
fputs("\n\n", fp);
|
||||
}
|
||||
|
||||
fprintf(fp, "# swap translation along Y and Z axes\n");
|
||||
fprintf(fp, "swap-yz = %s\n\n", cfg->map_axis[1] == def_axmap[1] ? "false" : "true");
|
||||
|
||||
wrote_comment = 0;
|
||||
for(i=0; i<MAX_BUTTONS; i++) {
|
||||
if(cfg->map_button[i] != i) {
|
||||
if(!wrote_comment) {
|
||||
fprintf(fp, "# button mappings\n");
|
||||
wrote_comment = 1;
|
||||
}
|
||||
fprintf(fp, "bnmap%d = %d\n", i, cfg->map_button[i]);
|
||||
}
|
||||
}
|
||||
if(wrote_comment) {
|
||||
fputc('\n', fp);
|
||||
}
|
||||
|
||||
wrote_comment = 0;
|
||||
for(i=0; i<MAX_BUTTONS; i++) {
|
||||
if(cfg->kbmap_str[i]) {
|
||||
if(!wrote_comment) {
|
||||
fprintf(fp, "# button to key mappings\n");
|
||||
wrote_comment = 1;
|
||||
}
|
||||
fprintf(fp, "kbmap%d = %s\n", i, cfg->kbmap_str[i]);
|
||||
}
|
||||
}
|
||||
if(wrote_comment) {
|
||||
fputc('\n', fp);
|
||||
}
|
||||
|
||||
fprintf(fp, "# led status: on, off, or auto (turn on when a client is connected)\n");
|
||||
fprintf(fp, "led = %s\n\n", (cfg->led ? (cfg->led == LED_AUTO ? "auto" : "on") : "off"));
|
||||
|
||||
if(!cfg->grab_device) {
|
||||
fprintf(fp, "# Don't grab USB device\n");
|
||||
fprintf(fp, "# Grabbing the device ensures that other programs won't be able to use it without\n");
|
||||
fprintf(fp, "# talking to spacenavd. For instance some versions of Xorg will use the device to move\n");
|
||||
fprintf(fp, "# the mouse pointer if we don't grab it.\n");
|
||||
fprintf(fp, "# Set this to false if you want to use programs that try to talk to the device directly\n");
|
||||
fprintf(fp, "# such as google earth, then follow FAQ 11 http://spacenav.sourceforge.net/faq.html#faq11\n");
|
||||
fprintf(fp, "# to force the X server to ignore the device\n");
|
||||
fprintf(fp, "grab = false\n\n");
|
||||
}
|
||||
|
||||
fprintf(fp, "# serial device\n");
|
||||
fprintf(fp, "# Set this only if you have a serial device, and make sure you specify the\n");
|
||||
fprintf(fp, "# correct device file (On linux usually: /dev/ttyS0, /dev/ttyS1, /dev/ttyUSB0 ... etc).\n");
|
||||
if(cfg->serial_dev[0]) {
|
||||
fprintf(fp, "serial = %s\n\n", cfg->serial_dev);
|
||||
} else {
|
||||
fprintf(fp, "#serial = /dev/ttyS0\n\n");
|
||||
}
|
||||
|
||||
fprintf(fp, "List of additional USB devices to use (multiple devices can be listed)");
|
||||
for(i=0; i<MAX_CUSTOM; i++) {
|
||||
if(cfg->devid[i][0] != -1 && cfg->devid[i][1] != -1) {
|
||||
fprintf(fp, "device-id = %x:%x\n", cfg->devid[i][0], cfg->devid[i][1]);
|
||||
}
|
||||
}
|
||||
fprintf(fp, "\n");
|
||||
|
||||
/* unlock */
|
||||
flk.l_type = F_UNLCK;
|
||||
flk.l_start = flk.l_len = 0;
|
||||
flk.l_whence = SEEK_SET;
|
||||
fcntl(fileno(fp), F_SETLK, &flk);
|
||||
|
||||
fclose(fp);
|
||||
return 0;
|
||||
}
|
54
cfgfile.h
54
cfgfile.h
|
@ -1,54 +0,0 @@
|
|||
/*
|
||||
spnavcfg - an interactive GUI configurator for the spacenavd daemon.
|
||||
Copyright (C) 2007-2019 John Tsiombikas <nuclear@member.fsf.org>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CFGFILE_H_
|
||||
#define CFGFILE_H_
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
#define MAX_AXES 64
|
||||
#define MAX_BUTTONS 64
|
||||
#define MAX_CUSTOM 64
|
||||
|
||||
enum {
|
||||
LED_OFF = 0,
|
||||
LED_ON = 1,
|
||||
LED_AUTO = 2
|
||||
};
|
||||
|
||||
struct cfg {
|
||||
float sensitivity, sens_trans[3], sens_rot[3];
|
||||
int dead_threshold[MAX_AXES];
|
||||
int invert[MAX_AXES];
|
||||
int map_axis[MAX_AXES];
|
||||
int map_button[MAX_BUTTONS];
|
||||
int kbmap[MAX_BUTTONS];
|
||||
char *kbmap_str[MAX_BUTTONS];
|
||||
int led, grab_device;
|
||||
char serial_dev[PATH_MAX];
|
||||
int repeat_msec;
|
||||
|
||||
char *devname[MAX_CUSTOM]; /* custom USB device name list */
|
||||
int devid[MAX_CUSTOM][2]; /* custom USB vendor/product id list */
|
||||
};
|
||||
|
||||
void default_cfg(struct cfg *cfg);
|
||||
int read_cfg(const char *fname, struct cfg *cfg);
|
||||
int write_cfg(const char *fname, struct cfg *cfg);
|
||||
|
||||
#endif /* CFGFILE_H_ */
|
28
cmd.h
28
cmd.h
|
@ -1,28 +0,0 @@
|
|||
/*
|
||||
spnavcfg - an interactive GUI configurator for the spacenavd daemon.
|
||||
Copyright (C) 2007-2009 John Tsiombikas <nuclear@siggraph.org>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef CMD_H_
|
||||
#define CMD_H_
|
||||
|
||||
enum {
|
||||
CMD_PING, /* check daemon status */
|
||||
CMD_CFG, /* update configuration (and HUP daemon) */
|
||||
CMD_STARTX, /* signal daemon to enable X protocol */
|
||||
CMD_STOPX /* yada yada stop X protocol */
|
||||
};
|
||||
|
||||
#endif /* CMD_H_ */
|
|
@ -7,8 +7,6 @@ OPT=yes
|
|||
DBG=yes
|
||||
X11=yes
|
||||
|
||||
srcdir="`dirname "$0"`"
|
||||
|
||||
for arg; do
|
||||
case "$arg" in
|
||||
--prefix=*)
|
||||
|
@ -48,7 +46,6 @@ echo
|
|||
# create Makefile
|
||||
echo 'creating Makefile ...'
|
||||
echo "PREFIX = $PREFIX" >Makefile
|
||||
echo "srcdir = $srcdir" >>Makefile
|
||||
|
||||
if [ "$DBG" = 'yes' ]; then
|
||||
echo 'dbg = -g' >>Makefile
|
||||
|
@ -65,7 +62,7 @@ if [ -n "$LDFLAGS" ]; then
|
|||
echo "add_ldflags = $LDFLAGS" >>Makefile
|
||||
fi
|
||||
|
||||
cat "$srcdir/Makefile.in" >>Makefile
|
||||
cat "Makefile.in" >>Makefile
|
||||
|
||||
echo ''
|
||||
echo 'Done. You can now type make (or gmake) to compile spnavcfg.'
|
||||
|
|
59
spnavcfg.c
59
spnavcfg.c
|
@ -1,59 +0,0 @@
|
|||
/*
|
||||
spnavcfg - an interactive GUI configurator for the spacenavd daemon.
|
||||
Copyright (C) 2007-2009 John Tsiombikas <nuclear@siggraph.org>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
void frontend(int pfd);
|
||||
void backend(int pfd);
|
||||
|
||||
static void sig(int s);
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int cpid;
|
||||
int pipefd[2];
|
||||
|
||||
signal(SIGCHLD, sig);
|
||||
|
||||
/*pipe(pipefd);*/
|
||||
socketpair(AF_UNIX, SOCK_STREAM, 0, pipefd);
|
||||
if((cpid = fork()) == 0) {
|
||||
/* child should be the setuid-root backend, write cfg and kill */
|
||||
close(pipefd[1]);
|
||||
backend(pipefd[0]);
|
||||
_exit(0);
|
||||
} else {
|
||||
/* parent, GUI frontend */
|
||||
close(pipefd[0]);
|
||||
frontend(pipefd[1]);
|
||||
kill(cpid, SIGTERM);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void sig(int s)
|
||||
{
|
||||
if(s == SIGCHLD) {
|
||||
wait(0);
|
||||
}
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
spnavcfg - an interactive GUI configurator for the spacenavd daemon.
|
||||
Copyright (C) 2007-2009 John Tsiombikas <nuclear@siggraph.org>
|
||||
Copyright (C) 2007-2022 John Tsiombikas <nuclear@siggraph.org>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -24,12 +24,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#include <gtk/gtk.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
#include "cfgfile.h"
|
||||
#include "cmd.h"
|
||||
#include "ui.h"
|
||||
|
||||
#define CFGFILE "/etc/spnavrc"
|
||||
|
||||
#define CHK_AXINV_TRANS_X "axinv_trans_x"
|
||||
#define CHK_AXINV_TRANS_Y "axinv_trans_y"
|
||||
#define CHK_AXINV_TRANS_Z "axinv_trans_z"
|
||||
|
@ -67,22 +63,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
|
||||
|
||||
|
||||
int get_daemon_pid(void); /* back.c */
|
||||
|
||||
enum {TX, TY, TZ, RX, RY, RZ};
|
||||
|
||||
static const int def_axinv[] = {0, 1, 1, 0, 1, 1};
|
||||
|
||||
static void update_cfg(void);
|
||||
static void create_ui(void);
|
||||
|
||||
G_MODULE_EXPORT void chk_handler(GtkToggleButton *bn, gpointer data);
|
||||
G_MODULE_EXPORT void slider_handler(GtkRange *rng, gpointer data);
|
||||
G_MODULE_EXPORT void bn_handler(GtkButton *bn, gpointer data);
|
||||
|
||||
static struct cfg cfg;
|
||||
static int pipe_fd;
|
||||
|
||||
struct widgets {
|
||||
|
||||
GtkWidget *win;
|
||||
|
@ -105,23 +95,9 @@ static struct widgets widgets;
|
|||
|
||||
|
||||
|
||||
|
||||
void frontend(int pfd)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int argc = 0;
|
||||
int ruid = getuid();
|
||||
#ifdef __linux__
|
||||
int setresuid(uid_t ruid, uid_t euid, uid_t suid);
|
||||
setresuid(ruid, ruid, ruid);
|
||||
#else
|
||||
seteuid(ruid);
|
||||
#endif
|
||||
|
||||
pipe_fd = pfd;
|
||||
|
||||
gtk_init(&argc, 0);
|
||||
|
||||
read_cfg(CFGFILE, &cfg);
|
||||
gtk_init(&argc, argv);
|
||||
|
||||
create_ui();
|
||||
|
||||
|
@ -130,13 +106,6 @@ void frontend(int pfd)
|
|||
gtk_main();
|
||||
}
|
||||
|
||||
static void update_cfg(void)
|
||||
{
|
||||
int cmd = CMD_CFG;
|
||||
write(pipe_fd, &cmd, 1);
|
||||
write(pipe_fd, &cfg, sizeof cfg);
|
||||
}
|
||||
|
||||
static int query_x11(void)
|
||||
{
|
||||
Display *dpy;
|
||||
|
@ -174,12 +143,8 @@ static int query_x11(void)
|
|||
XCloseDisplay(dpy);
|
||||
|
||||
/* found a magellan window, still it might belong to the 3dxsrv driver */
|
||||
if(get_daemon_pid() == -1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* this could still mean that the daemon crashed and left behind the pidfile... */
|
||||
return 1; /* ... but wtf */
|
||||
/* XXX ping daemon */
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void create_ui(void)
|
||||
|
@ -192,70 +157,70 @@ static void create_ui(void)
|
|||
|
||||
widgets.win = GTK_WIDGET(gtk_builder_get_object(gtk_builder, "main"));
|
||||
|
||||
obj = gtk_builder_get_object (gtk_builder, CHK_AXINV_TRANS_X);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(obj), cfg.invert[TX] != def_axinv[TX]);
|
||||
obj = gtk_builder_get_object (gtk_builder, CHK_AXINV_TRANS_Y);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(obj), cfg.invert[TY] != def_axinv[TY]);
|
||||
obj = gtk_builder_get_object (gtk_builder, CHK_AXINV_TRANS_Z);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(obj), cfg.invert[TZ] != def_axinv[TZ]);
|
||||
obj = gtk_builder_get_object (gtk_builder, CHK_AXINV_ROT_X);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(obj), cfg.invert[RX] != def_axinv[RX]);
|
||||
obj = gtk_builder_get_object (gtk_builder, CHK_AXINV_ROT_Y);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(obj), cfg.invert[RY] != def_axinv[RY]);
|
||||
obj = gtk_builder_get_object (gtk_builder, CHK_AXINV_ROT_Z);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(obj), cfg.invert[RZ] != def_axinv[RZ]);
|
||||
obj = gtk_builder_get_object(gtk_builder, CHK_AXINV_TRANS_X);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(obj), 0);//cfg.invert[TX] != def_axinv[TX]);
|
||||
obj = gtk_builder_get_object(gtk_builder, CHK_AXINV_TRANS_Y);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(obj), 0);//cfg.invert[TY] != def_axinv[TY]);
|
||||
obj = gtk_builder_get_object(gtk_builder, CHK_AXINV_TRANS_Z);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(obj), 0);//cfg.invert[TZ] != def_axinv[TZ]);
|
||||
obj = gtk_builder_get_object(gtk_builder, CHK_AXINV_ROT_X);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(obj), 0);//cfg.invert[RX] != def_axinv[RX]);
|
||||
obj = gtk_builder_get_object(gtk_builder, CHK_AXINV_ROT_Y);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(obj), 0);//cfg.invert[RY] != def_axinv[RY]);
|
||||
obj = gtk_builder_get_object(gtk_builder, CHK_AXINV_ROT_Z);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(obj), 0);//cfg.invert[RZ] != def_axinv[RZ]);
|
||||
|
||||
obj = gtk_builder_get_object (gtk_builder, CHK_SWAP_YZ);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(obj), cfg.map_axis[1] == 1);
|
||||
obj = gtk_builder_get_object(gtk_builder, CHK_SWAP_YZ);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(obj), 0);//cfg.map_axis[1] == 1);
|
||||
|
||||
obj = gtk_builder_get_object (gtk_builder, SLIDER_SENS_GLOBAL);
|
||||
gtk_range_set_value(GTK_RANGE(obj), cfg.sensitivity);
|
||||
obj = gtk_builder_get_object(gtk_builder, SLIDER_SENS_GLOBAL);
|
||||
gtk_range_set_value(GTK_RANGE(obj), 1);//cfg.sensitivity);
|
||||
|
||||
obj = gtk_builder_get_object (gtk_builder, SLIDER_SENS_TRANS);
|
||||
gtk_range_set_value(GTK_RANGE(obj), cfg.sens_trans[0]);
|
||||
obj = gtk_builder_get_object(gtk_builder, SLIDER_SENS_TRANS);
|
||||
gtk_range_set_value(GTK_RANGE(obj), 1);//cfg.sens_trans[0]);
|
||||
|
||||
widgets.slider_sens_trans_x = gtk_builder_get_object (gtk_builder, SLIDER_SENS_TRANS_X);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_sens_trans_x), cfg.sens_trans[0]);
|
||||
widgets.slider_sens_trans_y = gtk_builder_get_object (gtk_builder, SLIDER_SENS_TRANS_Y);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_sens_trans_y), cfg.sens_trans[1]);
|
||||
widgets.slider_sens_trans_z = gtk_builder_get_object (gtk_builder, SLIDER_SENS_TRANS_Z);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_sens_trans_z), cfg.sens_trans[2]);
|
||||
widgets.slider_sens_trans_x = gtk_builder_get_object(gtk_builder, SLIDER_SENS_TRANS_X);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_sens_trans_x), 1);//cfg.sens_trans[0]);
|
||||
widgets.slider_sens_trans_y = gtk_builder_get_object(gtk_builder, SLIDER_SENS_TRANS_Y);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_sens_trans_y), 1);//cfg.sens_trans[1]);
|
||||
widgets.slider_sens_trans_z = gtk_builder_get_object(gtk_builder, SLIDER_SENS_TRANS_Z);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_sens_trans_z), 1);//cfg.sens_trans[2]);
|
||||
|
||||
obj = gtk_builder_get_object (gtk_builder, SLIDER_SENS_ROT);
|
||||
gtk_range_set_value(GTK_RANGE(obj), cfg.sens_rot[0]);
|
||||
obj = gtk_builder_get_object(gtk_builder, SLIDER_SENS_ROT);
|
||||
gtk_range_set_value(GTK_RANGE(obj), 1);//cfg.sens_rot[0]);
|
||||
|
||||
widgets.slider_sens_rot_x = gtk_builder_get_object (gtk_builder, SLIDER_SENS_ROT_X);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_sens_rot_x), cfg.sens_rot[0]);
|
||||
widgets.slider_sens_rot_y = gtk_builder_get_object (gtk_builder, SLIDER_SENS_ROT_Y);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_sens_rot_y), cfg.sens_rot[1]);
|
||||
widgets.slider_sens_rot_z = gtk_builder_get_object (gtk_builder, SLIDER_SENS_ROT_Z);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_sens_rot_z), cfg.sens_rot[2]);
|
||||
widgets.slider_sens_rot_x = gtk_builder_get_object(gtk_builder, SLIDER_SENS_ROT_X);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_sens_rot_x), 1);//cfg.sens_rot[0]);
|
||||
widgets.slider_sens_rot_y = gtk_builder_get_object(gtk_builder, SLIDER_SENS_ROT_Y);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_sens_rot_y), 1);//cfg.sens_rot[1]);
|
||||
widgets.slider_sens_rot_z = gtk_builder_get_object(gtk_builder, SLIDER_SENS_ROT_Z);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_sens_rot_z), 1);//cfg.sens_rot[2]);
|
||||
|
||||
obj = gtk_builder_get_object (gtk_builder, SLIDER_DEADZONE);
|
||||
gtk_range_set_value(GTK_RANGE(obj), cfg.dead_threshold[TX]);
|
||||
obj = gtk_builder_get_object(gtk_builder, SLIDER_DEADZONE);
|
||||
gtk_range_set_value(GTK_RANGE(obj), 0);//cfg.dead_threshold[TX]);
|
||||
|
||||
widgets.slider_deadzone_trans_x = gtk_builder_get_object (gtk_builder, SLIDER_DEADZONE_TRANS_X);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_deadzone_trans_x), cfg.dead_threshold[TX]);
|
||||
widgets.slider_deadzone_trans_y = gtk_builder_get_object (gtk_builder, SLIDER_DEADZONE_TRANS_Y);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_deadzone_trans_y), cfg.dead_threshold[TY]);
|
||||
widgets.slider_deadzone_trans_z = gtk_builder_get_object (gtk_builder, SLIDER_DEADZONE_TRANS_Z);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_deadzone_trans_z), cfg.dead_threshold[TZ]);
|
||||
widgets.slider_deadzone_rot_x = gtk_builder_get_object (gtk_builder, SLIDER_DEADZONE_ROT_X);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_deadzone_rot_x), cfg.dead_threshold[RX]);
|
||||
widgets.slider_deadzone_rot_y = gtk_builder_get_object (gtk_builder, SLIDER_DEADZONE_ROT_Y);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_deadzone_rot_y), cfg.dead_threshold[RY]);
|
||||
widgets.slider_deadzone_rot_z = gtk_builder_get_object (gtk_builder, SLIDER_DEADZONE_ROT_Z);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_deadzone_rot_z), cfg.dead_threshold[RZ]);
|
||||
widgets.slider_deadzone_trans_x = gtk_builder_get_object(gtk_builder, SLIDER_DEADZONE_TRANS_X);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_deadzone_trans_x), 0);//cfg.dead_threshold[TX]);
|
||||
widgets.slider_deadzone_trans_y = gtk_builder_get_object(gtk_builder, SLIDER_DEADZONE_TRANS_Y);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_deadzone_trans_y), 0);//cfg.dead_threshold[TY]);
|
||||
widgets.slider_deadzone_trans_z = gtk_builder_get_object(gtk_builder, SLIDER_DEADZONE_TRANS_Z);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_deadzone_trans_z), 0);//cfg.dead_threshold[TZ]);
|
||||
widgets.slider_deadzone_rot_x = gtk_builder_get_object(gtk_builder, SLIDER_DEADZONE_ROT_X);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_deadzone_rot_x), 0);//cfg.dead_threshold[RX]);
|
||||
widgets.slider_deadzone_rot_y = gtk_builder_get_object(gtk_builder, SLIDER_DEADZONE_ROT_Y);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_deadzone_rot_y), 0);//cfg.dead_threshold[RY]);
|
||||
widgets.slider_deadzone_rot_z = gtk_builder_get_object(gtk_builder, SLIDER_DEADZONE_ROT_Z);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_deadzone_rot_z), 0);//cfg.dead_threshold[RZ]);
|
||||
|
||||
obj = gtk_builder_get_object (gtk_builder, CHK_GRAB_DEVICE);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(obj), cfg.grab_device);
|
||||
obj = gtk_builder_get_object(gtk_builder, CHK_GRAB_DEVICE);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(obj), 1);//cfg.grab_device);
|
||||
|
||||
obj = gtk_builder_get_object (gtk_builder, CHK_ENABLE_LED);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(obj), cfg.led);
|
||||
obj = gtk_builder_get_object(gtk_builder, CHK_ENABLE_LED);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(obj), 1);//cfg.led);
|
||||
|
||||
gtk_builder_connect_signals (gtk_builder, NULL);
|
||||
gtk_builder_connect_signals(gtk_builder, NULL);
|
||||
|
||||
g_object_unref (G_OBJECT (gtk_builder));
|
||||
g_object_unref(G_OBJECT(gtk_builder));
|
||||
|
||||
}
|
||||
|
||||
|
@ -266,37 +231,14 @@ G_MODULE_EXPORT void chk_handler(GtkToggleButton *bn, gpointer data)
|
|||
const gchar* ctrlname = gtk_buildable_get_name(GTK_BUILDABLE(bn));
|
||||
|
||||
if(strcmp(ctrlname, CHK_AXINV_TRANS_X) == 0) {
|
||||
cfg.invert[TX] = !cfg.invert[TX];
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, CHK_AXINV_TRANS_Y) == 0) {
|
||||
cfg.invert[TY] = !cfg.invert[TY];
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, CHK_AXINV_TRANS_Z) == 0) {
|
||||
cfg.invert[TZ] = !cfg.invert[TZ];
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, CHK_AXINV_ROT_X) == 0) {
|
||||
cfg.invert[RX] = !cfg.invert[RX];
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, CHK_AXINV_ROT_Y) == 0) {
|
||||
cfg.invert[RY] = !cfg.invert[RY];
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, CHK_AXINV_ROT_Z) == 0) {
|
||||
cfg.invert[RZ] = !cfg.invert[RZ];
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, CHK_GRAB_DEVICE) == 0) {
|
||||
cfg.grab_device = state;
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, CHK_ENABLE_LED) == 0) {
|
||||
cfg.led = state;
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, CHK_SWAP_YZ) == 0) {
|
||||
tmp = cfg.map_axis[TY];
|
||||
cfg.map_axis[TY] = cfg.map_axis[TZ];
|
||||
cfg.map_axis[TZ] = tmp;
|
||||
tmp = cfg.map_axis[RY];
|
||||
cfg.map_axis[RY] = cfg.map_axis[RZ];
|
||||
cfg.map_axis[RZ] = tmp;
|
||||
update_cfg();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -308,69 +250,34 @@ G_MODULE_EXPORT void slider_handler(GtkRange *rng, gpointer data)
|
|||
gdouble value = gtk_range_get_value(rng);
|
||||
|
||||
if(strcmp(ctrlname, SLIDER_SENS_GLOBAL) == 0) {
|
||||
cfg.sensitivity = gtk_range_get_value(rng);
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, SLIDER_SENS_TRANS) == 0) {
|
||||
cfg.sens_trans[0] = cfg.sens_trans[1] = cfg.sens_trans[2] = value;
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_sens_trans_x), value);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_sens_trans_y), value);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_sens_trans_z), value);
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, SLIDER_SENS_TRANS_X) == 0) {
|
||||
cfg.sens_trans[0] = value;
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, SLIDER_SENS_TRANS_Y) == 0) {
|
||||
cfg.sens_trans[1] = value;
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, SLIDER_SENS_TRANS_Z) == 0) {
|
||||
cfg.sens_trans[2] = value;
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, SLIDER_SENS_ROT) == 0) {
|
||||
cfg.sens_rot[0] = cfg.sens_rot[1] = cfg.sens_rot[2] = value;
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_sens_rot_x), value);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_sens_rot_y), value);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_sens_rot_z), value);
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, SLIDER_SENS_ROT_X) == 0) {
|
||||
cfg.sens_rot[0] = value;
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, SLIDER_SENS_ROT_Y) == 0) {
|
||||
cfg.sens_rot[1] = value;
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, SLIDER_SENS_ROT_Z) == 0) {
|
||||
cfg.sens_rot[2] = value;
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, SLIDER_DEADZONE) == 0) {
|
||||
for(i=0; i<6; i++) {
|
||||
cfg.dead_threshold[i] = value;
|
||||
}
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_deadzone_trans_x), value);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_deadzone_trans_y), value);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_deadzone_trans_z), value);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_deadzone_rot_x), value);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_deadzone_rot_y), value);
|
||||
gtk_range_set_value(GTK_RANGE(widgets.slider_deadzone_rot_z), value);
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, SLIDER_DEADZONE_TRANS_X) == 0) {
|
||||
cfg.dead_threshold[TX] = value;
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, SLIDER_DEADZONE_TRANS_Y) == 0) {
|
||||
cfg.dead_threshold[TY] = value;
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, SLIDER_DEADZONE_TRANS_Z) == 0) {
|
||||
cfg.dead_threshold[TZ] = value;
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, SLIDER_DEADZONE_ROT_X) == 0) {
|
||||
cfg.dead_threshold[RX] = value;
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, SLIDER_DEADZONE_ROT_Y) == 0) {
|
||||
cfg.dead_threshold[RY] = value;
|
||||
update_cfg();
|
||||
} else if(strcmp(ctrlname, SLIDER_DEADZONE_ROT_Z) == 0) {
|
||||
cfg.dead_threshold[RZ] = value;
|
||||
update_cfg();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
G_MODULE_EXPORT void bn_handler(GtkButton *bn, gpointer data)
|
||||
|
@ -380,10 +287,6 @@ G_MODULE_EXPORT void bn_handler(GtkButton *bn, gpointer data)
|
|||
const gchar* ctrlname = gtk_buildable_get_name(GTK_BUILDABLE(bn));
|
||||
|
||||
if(strcmp(ctrlname, BTN_PING) == 0) {
|
||||
tmp = CMD_PING;
|
||||
write(pipe_fd, &tmp, 1);
|
||||
read(pipe_fd, &tmp, 1);
|
||||
|
||||
if(tmp) { /* daemon alive */
|
||||
dlg = gtk_message_dialog_new(GTK_WINDOW(widgets.win), GTK_DIALOG_DESTROY_WITH_PARENT,
|
||||
GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "The spacenavd driver is running fine.");
|
||||
|
@ -397,6 +300,4 @@ G_MODULE_EXPORT void bn_handler(GtkButton *bn, gpointer data)
|
|||
g_signal_connect_swapped(dlg, "response", G_CALLBACK(gtk_widget_destroy), dlg);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Ładowanie…
Reference in New Issue