unit inputsimulator;
{$mode objfpc}
{$linklib C}
{$linklib X11}
// unit keysym contains the key codes, part of X11 package.
interface
uses
X, Xlib, Xutil, keysym;
procedure Simulate_KeyPress(keySym: cardinal; shiftState: boolean = false);
procedure Simulate_Mouse_Click(x, y: integer; button: integer = 1);
procedure Simulate_Mouse_move(x, y: integer);
implementation
procedure Simulate_KeyPress(keySym: cardinal; shiftState: boolean = false);
var
display: PDisplay;
event: TXKeyEvent;
keyCode: TKeyCode;
begin
display := XOpenDisplay(nil);
if display = nil then Exit;
keyCode := XKeysymToKeycode(display, keySym);
event.display := display;
event.window := XDefaultRootWindow(display);
event.root := XDefaultRootWindow(display);
event.subwindow := None;
event.time := CurrentTime;
event.x := 1;
event.y := 1;
event.x_root := 1;
event.y_root := 1;
event.same_screen := 1;
event.keycode := keyCode;
event.state := 0;
if shiftState then
event.state := event.state or ShiftMask;
// Key press
event._type := KeyPress;
XSendEvent(display, XDefaultRootWindow(display), 1, KeyPressMask, @event);
// Small delay (optional)
// Sleep(10);
// Key release
event._type := KeyRelease;
XSendEvent(display, XDefaultRootWindow(display), 1, KeyReleaseMask, @event);
XFlush(display);
XCloseDisplay(display);
end;
procedure Simulate_Mouse_Click(x, y: integer; button: integer = 1);
var
display: PDisplay;
event: TXButtonEvent;
begin
display := XOpenDisplay(nil);
if display = nil then Exit;
// Move mouse to position
XWarpPointer(display, None, XDefaultRootWindow(display), 0, 0, 0, 0, x, y);
XFlush(display);
// Set up event
event.display := display;
event.window := XDefaultRootWindow(display);
event.root := XDefaultRootWindow(display);
event.subwindow := None;
event.time := CurrentTime;
event.x := x;
event.y := y;
event.x_root := x;
event.y_root := y;
event.same_screen := 1;
event.state := 0;
event.button := button;
// Press
event._type := ButtonPress;
XSendEvent(display, XDefaultRootWindow(display), 1, ButtonPressMask, @event);
XFlush(display);
// Release
event._type := ButtonRelease;
XSendEvent(display, XDefaultRootWindow(display), 1, ButtonReleaseMask, @event);
XFlush(display);
XCloseDisplay(display);
end;
procedure Simulate_Mouse_move(x, y: integer);
var
display: PDisplay;
begin
display := XOpenDisplay(nil);
if display = nil then Exit;
XWarpPointer(display, None, XDefaultRootWindow(display), 0, 0, 0, 0, x, y);
XFlush(display);
XCloseDisplay(display);
end;
end.