#include #include #include #include #include #include #include #include #include #include #include int j2m[] = { Button1, Button2, Button3, Button4, Button5 }; int j2m_size = sizeof(j2m)/sizeof(int); int main(int argc, char* argv[]) { Display* display; Window root; XEvent ev; XButtonEvent* be; int dev; int jx = 0, jy = 0; fd_set fds; display = XOpenDisplay((argc == 1) ? ":0" : argv[1]); root = XDefaultRootWindow(display); be = &ev.xbutton; dev = open("/dev/input/js0", O_RDONLY); if (dev == -1) { perror("open"); return 1; } while (1) { int ret; int mx = 0, my = 0; struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 10000; FD_ZERO(&fds); FD_SET(dev, &fds); /* in not linux system, it will run differently */ while (ret = select(dev+1, &fds, NULL, NULL, &tv)) { struct js_event j; if (ret < 0) { perror("select"); return 1; } read(dev, &j, sizeof(j)); if (j.type == 0x02) { if (j.number == 0x00) { jx = (j.value > 1000) - (j.value < -1000); } else if (j.number == 0x01) { jy = (j.value > 1000) - (j.value < -1000); } } else if (j.type == 0x01) { int em; int d; Window child; if (j.number >= j2m_size) continue; if (j2m[j.number] == -1) continue; child = root; do { be->window = child; XQueryPointer(display, be->window, &be->root, &child, &be->x_root, &be->y_root, &be->x, &be->y, &be->state); } while (child); ev.type = (j.value) ? ButtonPress : ButtonRelease; em = (j.value) ? ButtonPressMask : ButtonReleaseMask; be->display = display; be->subwindow = None; be->time = CurrentTime; be->button = j2m[j.number]; be->same_screen = True; XSendEvent(display, be->window, True, em, &ev); XFlush(display); } } jx += (jx > 0) - (jx < 0); jy += (jy > 0) - (jy < 0); if (jx > 0) mx += 5; if (jx > 30) mx += 10; if (jx < 0) mx -= 5; if (jx < -30) mx -= 10; if (jy > 0) my += 5; if (jy > 30) my += 10; if (jy < 0) my -= 5; if (jy < -30) my -= 10; if (mx || my) { XWarpPointer(display, None, None, 0, 0, 0, 0, mx, my); XFlush(display); } } close(dev); return 0; }