Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
105
Task/Simulate-input-Keyboard/OCaml/simulate-input-keyboard.ocaml
Normal file
105
Task/Simulate-input-Keyboard/OCaml/simulate-input-keyboard.ocaml
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
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;
|
||||
;;
|
||||
Loading…
Add table
Add a link
Reference in a new issue