started converting GUI to use the new protocol

proto_v1
John Tsiombikas 2022-02-15 20:45:18 +02:00
rodzic 97673e7f9d
commit a3403e5ea2
8 zmienionych plików z 74 dodań i 925 usunięć

Wyświetl plik

@ -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
Wyświetl plik

@ -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
Wyświetl plik

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

Wyświetl plik

@ -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
Wyświetl plik

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

5
configure vendored
Wyświetl plik

@ -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.'

Wyświetl plik

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

Wyświetl plik

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