RosettaCodeData/Task/Simulate-input-Keyboard/OCaml/simulate-input-keyboard.ocaml

106 lines
3.1 KiB
Plaintext

open Xlib
let () =
(* open connection with the server *)
let d = xOpenDisplay "" in
let s = xDefaultScreen d in
Random.self_init();
(* create window *)
let w = xCreateSimpleWindow d (xRootWindow d s) 10 10 300 200 1
(xBlackPixel d s) (xWhitePixel d s) in
(* set window name *)
xStoreName d w Sys.argv.(0);
(* select kind of events we are interested in *)
xSelectInput d w [ExposureMask; KeyPressMask; ButtonPressMask];
(* map (show) the window *)
xMapWindow d w;
xFlush d;
let dbl = w in
let gc = xDefaultGC d s in
(* connect the close button in the window handle *)
let wm_delete_window = xInternAtom d "WM_DELETE_WINDOW" true in
xSetWMProtocols d w wm_delete_window 1;
(* event loop *)
let e = new_xEvent() in
try while true do
xNextEvent d e;
(* draw or redraw the window *)
match xEventKind e with
| XExposeEvent _ ->
xDrawString d dbl gc 10 20 "Clic in the window to generate";
xDrawString d dbl gc 10 35 "a key press event";
| XButtonPressedEvent event ->
let dat = xButtonEvent_datas event in
(*
Printf.printf "button x,y : %d %d\n%!"
dat.button_x
dat.button_y;
*)
let xKeyEvent_contents = {
key_serial = dat.button_serial;
key_send_event = dat.button_send_event;
key_display = dat.button_display;
key_window = dat.button_window;
key_root = dat.button_root;
key_subwindow = dat.button_subwindow;
key_time = dat.button_time;
key_x = dat.button_x;
key_y = dat.button_y;
key_x_root = dat.button_x_root;
key_y_root = dat.button_y_root;
key_state = [ShiftMask];
key_keycode = (24 + Random.int 33);
key_same_screen = true;
} in
let propagate = true in
let event_mask = KeyPressMask in
xSendEvent d w propagate event_mask (XKeyPressedEvCnt xKeyEvent_contents);
(* delete window event *)
| XClientMessageEvent xclient ->
let atom = xEvent_xclient_data xclient in
if atom = wm_delete_window then
raise Exit
(* handle key press *)
| XKeyPressedEvent event ->
print_endline "Key Pressed Event";
begin
let d = xKeyEvent_datas event in
Printf.printf "keycode: %d\n%!" d.key_keycode;
end;
(* exit if q or escape are pressed *)
let keysym = xLookupKeysym event 0 in
if keysym = Keysym.xK_q ||
keysym = Keysym.xK_Escape then
raise Exit
else
let printable, c =
let buf = " " in
let n, _ = xLookupString event buf in
if (n = 1)
then (true, buf.[0])
else (false, '\000')
in
if printable then
Printf.printf "Key '%c' pressed\n%!" c;
| _ -> ()
done with
| Exit ->
xDestroyWindow d w;
(* close connection to server *)
xCloseDisplay d;
;;