106 lines
3.1 KiB
Plaintext
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;
|
|
;;
|