|
|
|
@@ -3,6 +3,7 @@
|
|
|
|
|
#include <libinput.h>
|
|
|
|
|
#include <math.h>
|
|
|
|
|
#include <signal.h>
|
|
|
|
|
#include <sys/signalfd.h>
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
@@ -39,10 +40,12 @@ typedef struct {
|
|
|
|
|
|
|
|
|
|
/* Globals */
|
|
|
|
|
Gesture *gestsarr;
|
|
|
|
|
Gesture *originalgestures;
|
|
|
|
|
int gestsarrlen;
|
|
|
|
|
Swipe pendingswipe;
|
|
|
|
|
double xstart[MAXSLOTS], xend[MAXSLOTS], ystart[MAXSLOTS], yend[MAXSLOTS];
|
|
|
|
|
unsigned nfdown = 0, nfpendingswipe = 0;
|
|
|
|
|
unsigned orientationdirty = 0;
|
|
|
|
|
struct timespec timedown;
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
@@ -141,6 +144,22 @@ swipereorient(Swipe swipe, int orientation) {
|
|
|
|
|
return swipe;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
reorientgestures(int orientation) {
|
|
|
|
|
for (int i = 0; i < gestsarrlen; i++)
|
|
|
|
|
gestsarr[i].swipe = swipereorient(originalgestures[i].swipe, orientation);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
changeorientation(int _signal, siginfo_t *info, void *_none) {
|
|
|
|
|
int new_orientation = (info->si_value).sival_int;
|
|
|
|
|
|
|
|
|
|
if (orientation != new_orientation) {
|
|
|
|
|
orientation = new_orientation;
|
|
|
|
|
orientationdirty = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
touchdown(struct libinput_event *e)
|
|
|
|
|
{
|
|
|
|
@@ -212,6 +231,25 @@ touchup(struct libinput_event *e)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
sigusr1fd() {
|
|
|
|
|
sigset_t mask;
|
|
|
|
|
int sfd;
|
|
|
|
|
|
|
|
|
|
sigemptyset(&mask);
|
|
|
|
|
sigaddset(&mask, SIGUSR1);
|
|
|
|
|
if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) {
|
|
|
|
|
die("Can't block SIGUSR1.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sfd = signalfd(-1, &mask, 0);
|
|
|
|
|
if (sfd == -1) {
|
|
|
|
|
die("Can't open signalfd on SIGUSR1.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return sfd;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
run()
|
|
|
|
|
{
|
|
|
|
@@ -221,7 +259,12 @@ run()
|
|
|
|
|
struct libinput_event_touch *tevent;
|
|
|
|
|
struct libinput_device *d;
|
|
|
|
|
int selectresult;
|
|
|
|
|
|
|
|
|
|
fd_set fdset;
|
|
|
|
|
int li_fd;
|
|
|
|
|
int sig_fd;
|
|
|
|
|
int sfdrsize;
|
|
|
|
|
struct signalfd_siginfo sfdinfo;
|
|
|
|
|
|
|
|
|
|
const static struct libinput_interface interface = {
|
|
|
|
|
.open_restricted = libinputopenrestricted,
|
|
|
|
@@ -246,13 +289,28 @@ run()
|
|
|
|
|
ystart[i] = NOMOTION;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FD_ZERO(&fdset);
|
|
|
|
|
FD_SET(libinput_get_fd(li), &fdset);
|
|
|
|
|
sig_fd = sigusr1fd();
|
|
|
|
|
li_fd = libinput_get_fd(li);
|
|
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
|
FD_ZERO(&fdset);
|
|
|
|
|
FD_SET(sig_fd, &fdset);
|
|
|
|
|
FD_SET(li_fd, &fdset);
|
|
|
|
|
selectresult = select(FD_SETSIZE, &fdset, NULL, NULL, NULL);
|
|
|
|
|
|
|
|
|
|
if (selectresult == -1) {
|
|
|
|
|
die("Can't select on device node?");
|
|
|
|
|
} else {
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (FD_ISSET(sig_fd, &fdset)) {
|
|
|
|
|
sfdrsize = read(sig_fd, &sfdinfo, sizeof(struct signalfd_siginfo));
|
|
|
|
|
|
|
|
|
|
if (sfdrsize != sizeof(struct signalfd_siginfo)) {
|
|
|
|
|
die("Couldn't read reorient signal.");
|
|
|
|
|
}
|
|
|
|
|
reorientgestures(sfdinfo.ssi_int);
|
|
|
|
|
}
|
|
|
|
|
if (FD_ISSET(li_fd, &fdset)) {
|
|
|
|
|
libinput_dispatch(li);
|
|
|
|
|
while ((event = libinput_get_event(li)) != NULL) {
|
|
|
|
|
switch(libinput_event_get_type(event)) {
|
|
|
|
@@ -264,6 +322,7 @@ run()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
libinput_unref(li);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -329,9 +388,12 @@ main(int argc, char *argv[])
|
|
|
|
|
memcpy(gestsarr, gestures, sizeof(gestures));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Save original gestures for runtime orientation change
|
|
|
|
|
originalgestures = malloc(sizeof(Gesture) * gestsarrlen);
|
|
|
|
|
memcpy(originalgestures, gestsarr, sizeof(Gesture) * gestsarrlen);
|
|
|
|
|
|
|
|
|
|
// Modify gestures swipes based on orientation provided
|
|
|
|
|
for (i = 0; i < gestsarrlen; i++)
|
|
|
|
|
gestsarr[i].swipe = swipereorient(gestsarr[i].swipe, orientation);
|
|
|
|
|
reorientgestures(orientation);
|
|
|
|
|
|
|
|
|
|
run();
|
|
|
|
|
return 0;
|
|
|
|
|