X11 è molto tosto da studiare spero tu lo conosca abbastanza bene per metterci le mani.
Ti consiglio di utilizzare toolkit che stanno sopra Xlib tipo gtk o qt che hanno il porting verso il ++
cmq, ecco un esempio funzionante su Xlib alias X11:
#include <X11/extensions/XTest.h>
#include <X11/Xlib.h>
#include <stdio.h>
int main()
{
Display *dpy = XOpenDisplay(NULL);
if (!dpy) return 1;
XTestFakeButtonEvent(dpy,3,True,1);
XCloseDisplay(dpy);
return 0;
}
g++ -lX11 -lXtst -L/usr/include/X11 fake.c -o fake
A me funziona anche se personalmente userei la xsendevent. tipo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
void FakeClick(int button)
{
Display *display = XOpenDisplay(NULL);
XEvent event;
if(display == NULL)
{
fprintf(stderr, "Errore nell'apertura del Display !!!\n");
exit(EXIT_FAILURE);
}
memset(&event, 0x00, sizeof(event));
event.type = ButtonPress;
event.xbutton.button = button;
event.xbutton.same_screen = True;
XQueryPointer(display, RootWindow(display, DefaultScreen(display)), &event.xbutton.root, &event.xbutton.window, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
event.xbutton.subwindow = event.xbutton.window;
while(event.xbutton.subwindow)
{
event.xbutton.window = event.xbutton.subwindow;
XQueryPointer(display, event.xbutton.window, &event.xbutton.root, &event.xbutton.subwindow, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
}
if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Errore nell'invio dell'evento !!!\n");
XFlush(display);
usleep(100000);
event.type = ButtonRelease;
event.xbutton.state = 0x100;
if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Errore nell'invio dell'evento !!!\n");
XFlush(display);
XCloseDisplay(display);
}
g++ -lX11 -L/usr/include/X11 fakeclick.c -o fakeclick
Saluti,
Max