Let's write β

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

XTESTを利用してオートクリッカー

Synergyのソースコードを久々に読みなおして各OSでクリック動作など各動作を疑似再現する
方法を確認しなおしていたのでちょっと練習にとオートクリッカーをつくってみました。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/extensions/XTest.h>

void usage();
void finish(int sig);
//X11 Display
Display* dpy;

int main(int argc, char** argv)
{
        //Click margin
        int margin;
        if (argc <= 1) {
                usage();
                return -1;
        }
        if ((dpy = XOpenDisplay("")) == NULL) {
                fprintf(stderr, "Failed to open display\n");
                exit(-1);
        }
        margin = atoi(argv[1]);
        signal(SIGKILL, finish);
        while(1) {
                printf("CLick\n");
                //Click
                XTestFakeButtonEvent(dpy, 1, True, CurrentTime);
                XFlush(dpy);
                XTestFakeButtonEvent(dpy, 1, False, CurrentTime);
                XFlush(dpy);

                usleep(margin * 1000);
        }
        return 0;
}

void usage()
{
        printf("Usage:\n");
        printf("takahash [millsec]\n");
}

void finish(int sig)
{
        printf("Finish..");
        XCloseDisplay(dpy);
        exit(0);
}

指定された間隔をミリ秒として解釈してその間隔でクリックを連打するようにしています。
高橋名人の一秒16連打!!

./a.out 62

連打されます。