XTESTではマウスカーソルを動かす事もできるので
マウスカーソルを正多角形の頂点の形にうごかすというのをやってみました。
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <math.h> #include <X11/Xlib.h> #include <X11/extensions/XTest.h> #define PI 3.141592 void usage(); void finish(int sig); double deg2rad(double deg); //Global Display Screen Display* display; double *polyX, *polyY; int main(int argc, char** argv) { int nodes; int radius; int i; int width, height; if (argc <= 2) { usage(); exit(-1); } nodes = atoi(argv[1]); radius = atoi(argv[2]); polyX = (double *)malloc(sizeof(double) * nodes); polyY = (double *)malloc(sizeof(double) * nodes); if ((display = XOpenDisplay("")) == NULL) { fprintf(stderr, "Failed to open dislay"); exit(-1); } width = DisplayWidth(display, DefaultScreen(display)); height = DisplayHeight(display, DefaultScreen(display)); for (i = 0; i < nodes; i++) { polyX[i] = radius * cos(deg2rad(360.0 / nodes * i + 90.0)) + width / 2.0; polyY[i] = height / 2.0 - radius * sin(deg2rad(360.0 / nodes * i + 90.0)); printf("%d: (%lf %lf)\n", i, polyX[i], polyY[i]); } signal(SIGKILL, finish); while(1) { for (i = 0; i < nodes; i++) { XTestFakeMotionEvent(display, DefaultScreen(display), (int)polyX[i], (int)polyY[i], CurrentTime); XFlush(display); usleep(200 * 1000); } } } double deg2rad(double deg) { return (deg / 180.0 * PI); } void usage() { printf("Usage: \n"); printf("poly [millisec] [radius]\n"); } void finish(int signal) { XCloseDisplay(display); free(polyX); free(polyY); exit(0); }
直接画面のバッファーに書きこんだりできないですかねぇ.
./a.out 5 300
これで半径300の円に内接する動きで五角形上にマウスカーソルが動きます。