Let's write β

プログラミング中にできたことか、思ったこととか

XTESTでマウスカーソルを動かしてみた。

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の円に内接する動きで五角形上にマウスカーソルが動きます。