kopia lustrzana https://github.com/FreeSpacenav/spacenavd
forgot to add the new xdetect files
git-svn-id: svn+ssh://svn.code.sf.net/p/spacenav/code/trunk/spacenavd@89 ef983eb1-d774-4af8-acfd-baaf7b16a646pull/1/head v0.4
rodzic
fc771d996c
commit
e87cbc9ad5
|
@ -31,6 +31,6 @@ stop)
|
|||
;;
|
||||
|
||||
reload|restart|force-reload)
|
||||
$0 stop && $0 start
|
||||
$0 stop && sleep 1 && $0 start
|
||||
;;
|
||||
esac
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
spacenavd - a free software replacement driver for 6dof space-mice.
|
||||
Copyright (C) 2007-2009 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 XDETECT_H_
|
||||
#define XDETECT_H_
|
||||
|
||||
#include "config.h"
|
||||
|
||||
int xdet_start(void);
|
||||
void xdet_stop(void);
|
||||
|
||||
int xdet_get_fd(void);
|
||||
|
||||
int handle_xdet_events(fd_set *rset);
|
||||
|
||||
#endif /* XDETECT_H_ */
|
|
@ -0,0 +1,147 @@
|
|||
/*
|
||||
spacenavd - a free software replacement driver for 6dof space-mice.
|
||||
Copyright (C) 2007-2009 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 "config.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <ctype.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/inotify.h>
|
||||
#include "proto_x11.h"
|
||||
#include "spnavd.h"
|
||||
|
||||
/* TODO implement fallback to polling if inotify is not available */
|
||||
|
||||
static int fd = -1;
|
||||
static int watch_tmp = -1, watch_x11 = -1;
|
||||
|
||||
int xdet_start(void)
|
||||
{
|
||||
if((fd = inotify_init()) == -1) {
|
||||
perror("failed to create inotify queue");
|
||||
return -1;
|
||||
}
|
||||
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);
|
||||
|
||||
if((watch_x11 = inotify_add_watch(fd, "/tmp/.X11-unix", IN_CREATE)) == -1) {
|
||||
if((watch_tmp = inotify_add_watch(fd, "/tmp", IN_CREATE)) == -1) {
|
||||
perror("failed to watch /tmp for file events");
|
||||
close(fd);
|
||||
fd = -1;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if(verbose) {
|
||||
printf("waiting for X socket file to appear\n");
|
||||
}
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
||||
/* this is called by init_x11 if it's successful */
|
||||
void xdet_stop(void)
|
||||
{
|
||||
if(fd != -1) {
|
||||
if(verbose) {
|
||||
printf("stopping X watch\n");
|
||||
}
|
||||
|
||||
close(fd);
|
||||
fd = watch_tmp = watch_x11 = -1;
|
||||
}
|
||||
}
|
||||
|
||||
int xdet_get_fd(void)
|
||||
{
|
||||
return fd;
|
||||
}
|
||||
|
||||
int handle_xdet_events(fd_set *rset)
|
||||
{
|
||||
char buf[512];
|
||||
struct inotify_event *ev = (struct inotify_event*)buf;
|
||||
ssize_t res;
|
||||
|
||||
if(fd == -1 || !FD_ISSET(fd, rset)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
for(;;) {
|
||||
if((res = read(fd, buf, sizeof buf)) <= 0) {
|
||||
if(res == 0) {
|
||||
/* kernels before 2.6.14 returned 0 for not enough space */
|
||||
errno = EINVAL;
|
||||
}
|
||||
if(errno == EINTR) continue;
|
||||
if(errno != EAGAIN) {
|
||||
perror("failed to read inotify event");
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(ev->wd == watch_tmp) {
|
||||
if(watch_x11 != -1) {
|
||||
inotify_rm_watch(fd, watch_tmp);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(ev->len > 0 && strcmp(ev->name, ".X11-unix") == 0) {
|
||||
if((watch_x11 = inotify_add_watch(fd, "/tmp/.X11-unix", IN_CREATE)) == -1) {
|
||||
perror("failed to add /tmp/.X11-unix to the watch queue");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
} else if(ev->wd == watch_x11) {
|
||||
char *dpystr, sock_file[64];
|
||||
int dpynum = 0;
|
||||
|
||||
if((dpystr = getenv("DISPLAY"))) {
|
||||
char *tmp = strchr(dpystr, ':');
|
||||
if(tmp && isdigit(tmp[1])) {
|
||||
dpynum = atoi(tmp + 1);
|
||||
}
|
||||
}
|
||||
sprintf(sock_file, "X%d", dpynum);
|
||||
|
||||
if(ev->len > 0 && strcmp(ev->name, sock_file) == 0) {
|
||||
int i;
|
||||
|
||||
if(verbose) {
|
||||
printf("found X socket, will now attempt to connect to the X server\n");
|
||||
}
|
||||
|
||||
/* poll for approximately 30 seconds (well a bit more than that) */
|
||||
for(i=0; i<30; i++) {
|
||||
sleep(1);
|
||||
if(init_x11() != -1) {
|
||||
return 0; /* success */
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "found X socket yet failed to connect\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
Ładowanie…
Reference in New Issue