Blame builtin/builtin_bind.ml

Packit bd2e5d
##ifdef CAMLTK
Packit bd2e5d
Packit bd2e5d
open Widget;;
Packit bd2e5d
Packit bd2e5d
(* Events and bindings *)
Packit bd2e5d
(* Builtin types *)
Packit bd2e5d
(* type *)
Packit bd2e5d
type xEvent =
Packit bd2e5d
  | Activate
Packit bd2e5d
  | ButtonPress (* also Button, but we omit it *)
Packit bd2e5d
  | ButtonPressDetail of int
Packit bd2e5d
  | ButtonRelease
Packit bd2e5d
  | ButtonReleaseDetail of int
Packit bd2e5d
  | Circulate
Packit bd2e5d
  | ColorMap (* not Colormap, avoiding confusion between the Colormap option *)
Packit bd2e5d
  | Configure
Packit bd2e5d
  | Deactivate
Packit bd2e5d
  | Destroy
Packit bd2e5d
  | Enter
Packit bd2e5d
  | Expose
Packit bd2e5d
  | FocusIn
Packit bd2e5d
  | FocusOut
Packit bd2e5d
  | Gravity
Packit bd2e5d
  | KeyPress (* also Key, but we omit it *)
Packit bd2e5d
  | KeyPressDetail of string      (* /usr/include/X11/keysymdef.h *)
Packit bd2e5d
  | KeyRelease
Packit bd2e5d
  | KeyReleaseDetail of string
Packit bd2e5d
  | Leave
Packit bd2e5d
  | Map
Packit bd2e5d
  | Motion
Packit bd2e5d
  | Property
Packit bd2e5d
  | Reparent
Packit bd2e5d
  | Unmap
Packit bd2e5d
  | Visibility
Packit bd2e5d
  | Virtual of string (* Virtual event. Must be without modifiers *)
Packit bd2e5d
;;
Packit bd2e5d
(* /type *)
Packit bd2e5d
Packit bd2e5d
(* type *)
Packit bd2e5d
type modifier =
Packit bd2e5d
  | Control
Packit bd2e5d
  | Shift
Packit bd2e5d
  | Lock
Packit bd2e5d
  | Button1
Packit bd2e5d
  | Button2
Packit bd2e5d
  | Button3
Packit bd2e5d
  | Button4
Packit bd2e5d
  | Button5
Packit bd2e5d
  | Double
Packit bd2e5d
  | Triple
Packit bd2e5d
  | Mod1
Packit bd2e5d
  | Mod2
Packit bd2e5d
  | Mod3
Packit bd2e5d
  | Mod4
Packit bd2e5d
  | Mod5
Packit bd2e5d
  | Meta
Packit bd2e5d
  | Alt
Packit bd2e5d
;;
Packit bd2e5d
(* /type *)
Packit bd2e5d
Packit bd2e5d
(* Event structure, passed to bounded functions *)
Packit bd2e5d
Packit bd2e5d
(* type *)
Packit bd2e5d
type eventInfo =
Packit bd2e5d
  {
Packit bd2e5d
  (* %# : event serial number is unsupported *)
Packit bd2e5d
  mutable ev_Above : int;               (* tk: %a *)
Packit bd2e5d
  mutable ev_ButtonNumber : int;        (* tk: %b *)
Packit bd2e5d
  mutable ev_Count : int;               (* tk: %c *)
Packit bd2e5d
  mutable ev_Detail : string;           (* tk: %d *)
Packit bd2e5d
  mutable ev_Focus : bool;              (* tk: %f *)
Packit bd2e5d
  mutable ev_Height : int;              (* tk: %h *)
Packit bd2e5d
  mutable ev_KeyCode : int;             (* tk: %k *)
Packit bd2e5d
  mutable ev_Mode : string;             (* tk: %m *)
Packit bd2e5d
  mutable ev_OverrideRedirect : bool;   (* tk: %o *)
Packit bd2e5d
  mutable ev_Place : string;            (* tk: %p *)
Packit bd2e5d
  mutable ev_State : string;            (* tk: %s *)
Packit bd2e5d
  mutable ev_Time : int;                (* tk: %t *)
Packit bd2e5d
  mutable ev_Width : int;               (* tk: %w *)
Packit bd2e5d
  mutable ev_MouseX : int;              (* tk: %x *)
Packit bd2e5d
  mutable ev_MouseY : int;              (* tk: %y *)
Packit bd2e5d
  mutable ev_Char : string;             (* tk: %A *)
Packit bd2e5d
  mutable ev_BorderWidth : int;         (* tk: %B *)
Packit bd2e5d
  mutable ev_SendEvent : bool;          (* tk: %E *)
Packit bd2e5d
  mutable ev_KeySymString : string;     (* tk: %K *)
Packit bd2e5d
  mutable ev_KeySymInt : int;           (* tk: %N *)
Packit bd2e5d
  mutable ev_RootWindow : int;          (* tk: %R *)
Packit bd2e5d
  mutable ev_SubWindow : int;           (* tk: %S *)
Packit bd2e5d
  mutable ev_Type : int;                (* tk: %T *)
Packit bd2e5d
  mutable ev_Widget : widget;           (* tk: %W *)
Packit bd2e5d
  mutable ev_RootX : int;               (* tk: %X *)
Packit bd2e5d
  mutable ev_RootY : int                (* tk: %Y *)
Packit bd2e5d
  }
Packit bd2e5d
;;
Packit bd2e5d
(* /type *)
Packit bd2e5d
Packit bd2e5d
Packit bd2e5d
(* To avoid collision with other constructors (Width, State),
Packit bd2e5d
   use Ev_ prefix *)
Packit bd2e5d
(* type *)
Packit bd2e5d
type eventField =
Packit bd2e5d
  | Ev_Above
Packit bd2e5d
  | Ev_ButtonNumber
Packit bd2e5d
  | Ev_Count
Packit bd2e5d
  | Ev_Detail
Packit bd2e5d
  | Ev_Focus
Packit bd2e5d
  | Ev_Height
Packit bd2e5d
  | Ev_KeyCode
Packit bd2e5d
  | Ev_Mode
Packit bd2e5d
  | Ev_OverrideRedirect
Packit bd2e5d
  | Ev_Place
Packit bd2e5d
  | Ev_State
Packit bd2e5d
  | Ev_Time
Packit bd2e5d
  | Ev_Width
Packit bd2e5d
  | Ev_MouseX
Packit bd2e5d
  | Ev_MouseY
Packit bd2e5d
  | Ev_Char
Packit bd2e5d
  | Ev_BorderWidth
Packit bd2e5d
  | Ev_SendEvent
Packit bd2e5d
  | Ev_KeySymString
Packit bd2e5d
  | Ev_KeySymInt
Packit bd2e5d
  | Ev_RootWindow
Packit bd2e5d
  | Ev_SubWindow
Packit bd2e5d
  | Ev_Type
Packit bd2e5d
  | Ev_Widget
Packit bd2e5d
  | Ev_RootX
Packit bd2e5d
  | Ev_RootY
Packit bd2e5d
;;
Packit bd2e5d
(* /type *)
Packit bd2e5d
Packit bd2e5d
let filleventInfo ev v = function
Packit bd2e5d
  | Ev_Above    ->      ev.ev_Above <- int_of_string v
Packit bd2e5d
  | Ev_ButtonNumber ->  ev.ev_ButtonNumber <- int_of_string v
Packit bd2e5d
  | Ev_Count ->         ev.ev_Count <- int_of_string v
Packit bd2e5d
  | Ev_Detail ->        ev.ev_Detail <- v
Packit bd2e5d
  | Ev_Focus ->         ev.ev_Focus <- v = "1"
Packit bd2e5d
  | Ev_Height ->        ev.ev_Height <- int_of_string v
Packit bd2e5d
  | Ev_KeyCode ->       ev.ev_KeyCode <- int_of_string v
Packit bd2e5d
  | Ev_Mode ->          ev.ev_Mode <- v
Packit bd2e5d
  | Ev_OverrideRedirect -> ev.ev_OverrideRedirect <- v = "1"
Packit bd2e5d
  | Ev_Place ->         ev.ev_Place <- v
Packit bd2e5d
  | Ev_State ->         ev.ev_State <- v
Packit bd2e5d
  | Ev_Time ->          ev.ev_Time <- int_of_string v
Packit bd2e5d
  | Ev_Width ->         ev.ev_Width <- int_of_string v
Packit bd2e5d
  | Ev_MouseX ->        ev.ev_MouseX <- int_of_string v
Packit bd2e5d
  | Ev_MouseY ->        ev.ev_MouseY <- int_of_string v
Packit bd2e5d
  | Ev_Char ->          ev.ev_Char <- v
Packit bd2e5d
  | Ev_BorderWidth ->   ev.ev_BorderWidth <- int_of_string v
Packit bd2e5d
  | Ev_SendEvent ->     ev.ev_SendEvent <- v = "1"
Packit bd2e5d
  | Ev_KeySymString ->  ev.ev_KeySymString <- v
Packit bd2e5d
  | Ev_KeySymInt ->     ev.ev_KeySymInt <- int_of_string v
Packit bd2e5d
  | Ev_RootWindow ->    ev.ev_RootWindow <- int_of_string v
Packit bd2e5d
  | Ev_SubWindow ->     ev.ev_SubWindow <- int_of_string v
Packit bd2e5d
  | Ev_Type ->          ev.ev_Type <- int_of_string v
Packit bd2e5d
  | Ev_Widget ->        ev.ev_Widget <- cTKtoCAMLwidget v
Packit bd2e5d
  | Ev_RootX ->         ev.ev_RootX <- int_of_string v
Packit bd2e5d
  | Ev_RootY ->         ev.ev_RootY <- int_of_string v
Packit bd2e5d
;;
Packit bd2e5d
Packit bd2e5d
let wrapeventInfo f what =
Packit bd2e5d
  let ev = {
Packit bd2e5d
    ev_Above = 0;
Packit bd2e5d
    ev_ButtonNumber = 0;
Packit bd2e5d
    ev_Count = 0;
Packit bd2e5d
    ev_Detail = "";
Packit bd2e5d
    ev_Focus = false;
Packit bd2e5d
    ev_Height = 0;
Packit bd2e5d
    ev_KeyCode = 0;
Packit bd2e5d
    ev_Mode = "";
Packit bd2e5d
    ev_OverrideRedirect = false;
Packit bd2e5d
    ev_Place = "";
Packit bd2e5d
    ev_State = "";
Packit bd2e5d
    ev_Time = 0;
Packit bd2e5d
    ev_Width = 0;
Packit bd2e5d
    ev_MouseX = 0;
Packit bd2e5d
    ev_MouseY = 0;
Packit bd2e5d
    ev_Char = "";
Packit bd2e5d
    ev_BorderWidth = 0;
Packit bd2e5d
    ev_SendEvent = false;
Packit bd2e5d
    ev_KeySymString = "";
Packit bd2e5d
    ev_KeySymInt = 0;
Packit bd2e5d
    ev_RootWindow = 0;
Packit bd2e5d
    ev_SubWindow = 0;
Packit bd2e5d
    ev_Type = 0;
Packit bd2e5d
    ev_Widget = Widget.default_toplevel;
Packit bd2e5d
    ev_RootX = 0;
Packit bd2e5d
    ev_RootY = 0 } in
Packit bd2e5d
  function args ->
Packit bd2e5d
    let l = ref args in
Packit bd2e5d
    List.iter (function field ->
Packit bd2e5d
      match !l with
Packit bd2e5d
        [] -> ()
Packit bd2e5d
      | v::rest -> filleventInfo ev v field; l:=rest)
Packit bd2e5d
      what;
Packit bd2e5d
    f ev
Packit bd2e5d
;;
Packit bd2e5d
Packit bd2e5d
let rec writeeventField = function
Packit bd2e5d
  | [] -> ""
Packit bd2e5d
  | field::rest ->
Packit bd2e5d
    begin
Packit bd2e5d
    match field with
Packit bd2e5d
    | Ev_Above ->     " %a"
Packit bd2e5d
    | Ev_ButtonNumber ->" %b"
Packit bd2e5d
    | Ev_Count ->     " %c"
Packit bd2e5d
    | Ev_Detail ->    " %d"
Packit bd2e5d
    | Ev_Focus ->     " %f"
Packit bd2e5d
    | Ev_Height ->    " %h"
Packit bd2e5d
    | Ev_KeyCode ->   " %k"
Packit bd2e5d
    | Ev_Mode ->      " %m"
Packit bd2e5d
    | Ev_OverrideRedirect -> " %o"
Packit bd2e5d
    | Ev_Place ->     " %p"
Packit bd2e5d
    | Ev_State ->     " %s"
Packit bd2e5d
    | Ev_Time ->      " %t"
Packit bd2e5d
    | Ev_Width ->     " %w"
Packit bd2e5d
    | Ev_MouseX ->    " %x"
Packit bd2e5d
    | Ev_MouseY ->    " %y"
Packit bd2e5d
    (* Quoting is done by Tk *)
Packit bd2e5d
    | Ev_Char ->      " %A"
Packit bd2e5d
    | Ev_BorderWidth -> " %B"
Packit bd2e5d
    | Ev_SendEvent -> " %E"
Packit bd2e5d
    | Ev_KeySymString -> " %K"
Packit bd2e5d
    | Ev_KeySymInt -> " %N"
Packit bd2e5d
    | Ev_RootWindow ->" %R"
Packit bd2e5d
    | Ev_SubWindow -> " %S"
Packit bd2e5d
    | Ev_Type ->      " %T"
Packit bd2e5d
    | Ev_Widget ->" %W"
Packit bd2e5d
    | Ev_RootX ->     " %X"
Packit bd2e5d
    | Ev_RootY ->     " %Y"
Packit bd2e5d
    end
Packit bd2e5d
    ^ writeeventField rest
Packit bd2e5d
;;
Packit bd2e5d
Packit bd2e5d
##else
Packit bd2e5d
Packit bd2e5d
open Widget;;
Packit bd2e5d
Packit bd2e5d
(* Events and bindings *)
Packit bd2e5d
(* Builtin types *)
Packit bd2e5d
Packit bd2e5d
(* type *)
Packit bd2e5d
type event = [
Packit bd2e5d
  | `Activate
Packit bd2e5d
  | `ButtonPress (* also Button, but we omit it *)
Packit bd2e5d
  | `ButtonPressDetail of int
Packit bd2e5d
  | `ButtonRelease
Packit bd2e5d
  | `ButtonReleaseDetail of int
Packit bd2e5d
  | `Circulate
Packit bd2e5d
  | `Colormap
Packit bd2e5d
  | `Configure
Packit bd2e5d
  | `Deactivate
Packit bd2e5d
  | `Destroy
Packit bd2e5d
  | `Enter
Packit bd2e5d
  | `Expose
Packit bd2e5d
  | `FocusIn
Packit bd2e5d
  | `FocusOut
Packit bd2e5d
  | `Gravity
Packit bd2e5d
  | `KeyPress (* also Key, but we omit it *)
Packit bd2e5d
  | `KeyPressDetail of string      (* /usr/include/X11/keysymdef.h *)
Packit bd2e5d
  | `KeyRelease
Packit bd2e5d
  | `KeyReleaseDetail of string
Packit bd2e5d
  | `Leave
Packit bd2e5d
  | `Map
Packit bd2e5d
  | `Motion
Packit bd2e5d
  | `Property
Packit bd2e5d
  | `Reparent
Packit bd2e5d
  | `Unmap
Packit bd2e5d
  | `Visibility
Packit bd2e5d
  | `Virtual of string  (* Virtual event. Must be without modifiers *)
Packit bd2e5d
  | `Modified of modifier list * event
Packit bd2e5d
]
Packit bd2e5d
Packit bd2e5d
and modifier = [
Packit bd2e5d
  | `Control
Packit bd2e5d
  | `Shift
Packit bd2e5d
  | `Lock
Packit bd2e5d
  | `Button1
Packit bd2e5d
  | `Button2
Packit bd2e5d
  | `Button3
Packit bd2e5d
  | `Button4
Packit bd2e5d
  | `Button5
Packit bd2e5d
  | `Double
Packit bd2e5d
  | `Triple
Packit bd2e5d
  | `Mod1
Packit bd2e5d
  | `Mod2
Packit bd2e5d
  | `Mod3
Packit bd2e5d
  | `Mod4
Packit bd2e5d
  | `Mod5
Packit bd2e5d
  | `Meta
Packit bd2e5d
  | `Alt
Packit bd2e5d
]
Packit bd2e5d
;;
Packit bd2e5d
(* /type *)
Packit bd2e5d
Packit bd2e5d
(* Event structure, passed to bounded functions *)
Packit bd2e5d
Packit bd2e5d
(* type *)
Packit bd2e5d
type eventInfo = {
Packit bd2e5d
  (* %# : event serial number is unsupported *)
Packit bd2e5d
    mutable ev_Above : int;               (* tk: %a *)
Packit bd2e5d
    mutable ev_ButtonNumber : int;        (* tk: %b *)
Packit bd2e5d
    mutable ev_Count : int;               (* tk: %c *)
Packit bd2e5d
    mutable ev_Detail : string;           (* tk: %d *)
Packit bd2e5d
    mutable ev_Focus : bool;              (* tk: %f *)
Packit bd2e5d
    mutable ev_Height : int;              (* tk: %h *)
Packit bd2e5d
    mutable ev_KeyCode : int;             (* tk: %k *)
Packit bd2e5d
    mutable ev_Mode : string;             (* tk: %m *)
Packit bd2e5d
    mutable ev_OverrideRedirect : bool;   (* tk: %o *)
Packit bd2e5d
    mutable ev_Place : string;            (* tk: %p *)
Packit bd2e5d
    mutable ev_State : string;            (* tk: %s *)
Packit bd2e5d
    mutable ev_Time : int;                (* tk: %t *)
Packit bd2e5d
    mutable ev_Width : int;               (* tk: %w *)
Packit bd2e5d
    mutable ev_MouseX : int;              (* tk: %x *)
Packit bd2e5d
    mutable ev_MouseY : int;              (* tk: %y *)
Packit bd2e5d
    mutable ev_Char : string;             (* tk: %A *)
Packit bd2e5d
    mutable ev_BorderWidth : int;         (* tk: %B *)
Packit bd2e5d
    mutable ev_SendEvent : bool;          (* tk: %E *)
Packit bd2e5d
    mutable ev_KeySymString : string;     (* tk: %K *)
Packit bd2e5d
    mutable ev_KeySymInt : int;           (* tk: %N *)
Packit bd2e5d
    mutable ev_RootWindow : int;          (* tk: %R *)
Packit bd2e5d
    mutable ev_SubWindow : int;           (* tk: %S *)
Packit bd2e5d
    mutable ev_Type : int;                (* tk: %T *)
Packit bd2e5d
    mutable ev_Widget : any widget;       (* tk: %W *)
Packit bd2e5d
    mutable ev_RootX : int;               (* tk: %X *)
Packit bd2e5d
    mutable ev_RootY : int                (* tk: %Y *)
Packit bd2e5d
  }
Packit bd2e5d
;;
Packit bd2e5d
(* /type *)
Packit bd2e5d
Packit bd2e5d
Packit bd2e5d
(* To avoid collision with other constructors (Width, State),
Packit bd2e5d
   use Ev_ prefix *)
Packit bd2e5d
(* type *)
Packit bd2e5d
type eventField = [
Packit bd2e5d
  | `Above
Packit bd2e5d
  | `ButtonNumber
Packit bd2e5d
  | `Count
Packit bd2e5d
  | `Detail
Packit bd2e5d
  | `Focus
Packit bd2e5d
  | `Height
Packit bd2e5d
  | `KeyCode
Packit bd2e5d
  | `Mode
Packit bd2e5d
  | `OverrideRedirect
Packit bd2e5d
  | `Place
Packit bd2e5d
  | `State
Packit bd2e5d
  | `Time
Packit bd2e5d
  | `Width
Packit bd2e5d
  | `MouseX
Packit bd2e5d
  | `MouseY
Packit bd2e5d
  | `Char
Packit bd2e5d
  | `BorderWidth
Packit bd2e5d
  | `SendEvent
Packit bd2e5d
  | `KeySymString
Packit bd2e5d
  | `KeySymInt
Packit bd2e5d
  | `RootWindow
Packit bd2e5d
  | `SubWindow
Packit bd2e5d
  | `Type
Packit bd2e5d
  | `Widget
Packit bd2e5d
  | `RootX
Packit bd2e5d
  | `RootY
Packit bd2e5d
]
Packit bd2e5d
;;
Packit bd2e5d
(* /type *)
Packit bd2e5d
Packit bd2e5d
let filleventInfo ev v : eventField -> unit = function
Packit bd2e5d
  | `Above    ->        ev.ev_Above <- int_of_string v
Packit bd2e5d
  | `ButtonNumber ->    ev.ev_ButtonNumber <- int_of_string v
Packit bd2e5d
  | `Count ->           ev.ev_Count <- int_of_string v
Packit bd2e5d
  | `Detail ->          ev.ev_Detail <- v
Packit bd2e5d
  | `Focus ->           ev.ev_Focus <- v = "1"
Packit bd2e5d
  | `Height ->          ev.ev_Height <- int_of_string v
Packit bd2e5d
  | `KeyCode ->         ev.ev_KeyCode <- int_of_string v
Packit bd2e5d
  | `Mode ->            ev.ev_Mode <- v
Packit bd2e5d
  | `OverrideRedirect -> ev.ev_OverrideRedirect <- v = "1"
Packit bd2e5d
  | `Place ->           ev.ev_Place <- v
Packit bd2e5d
  | `State ->           ev.ev_State <- v
Packit bd2e5d
  | `Time ->            ev.ev_Time <- int_of_string v
Packit bd2e5d
  | `Width ->           ev.ev_Width <- int_of_string v
Packit bd2e5d
  | `MouseX ->          ev.ev_MouseX <- int_of_string v
Packit bd2e5d
  | `MouseY ->          ev.ev_MouseY <- int_of_string v
Packit bd2e5d
  | `Char ->            ev.ev_Char <- v
Packit bd2e5d
  | `BorderWidth ->     ev.ev_BorderWidth <- int_of_string v
Packit bd2e5d
  | `SendEvent ->       ev.ev_SendEvent <- v = "1"
Packit bd2e5d
  | `KeySymString ->    ev.ev_KeySymString <- v
Packit bd2e5d
  | `KeySymInt ->       ev.ev_KeySymInt <- int_of_string v
Packit bd2e5d
  | `RootWindow ->      ev.ev_RootWindow <- int_of_string v
Packit bd2e5d
  | `SubWindow ->       ev.ev_SubWindow <- int_of_string v
Packit bd2e5d
  | `Type ->            ev.ev_Type <- int_of_string v
Packit bd2e5d
  | `Widget ->          ev.ev_Widget <- cTKtoCAMLwidget v
Packit bd2e5d
  | `RootX ->           ev.ev_RootX <- int_of_string v
Packit bd2e5d
  | `RootY ->           ev.ev_RootY <- int_of_string v
Packit bd2e5d
;;
Packit bd2e5d
Packit bd2e5d
let wrapeventInfo f (what : eventField list) =
Packit bd2e5d
  let ev = {
Packit bd2e5d
    ev_Above = 0;
Packit bd2e5d
    ev_ButtonNumber = 0;
Packit bd2e5d
    ev_Count = 0;
Packit bd2e5d
    ev_Detail = "";
Packit bd2e5d
    ev_Focus = false;
Packit bd2e5d
    ev_Height = 0;
Packit bd2e5d
    ev_KeyCode = 0;
Packit bd2e5d
    ev_Mode = "";
Packit bd2e5d
    ev_OverrideRedirect = false;
Packit bd2e5d
    ev_Place = "";
Packit bd2e5d
    ev_State = "";
Packit bd2e5d
    ev_Time = 0;
Packit bd2e5d
    ev_Width = 0;
Packit bd2e5d
    ev_MouseX = 0;
Packit bd2e5d
    ev_MouseY = 0;
Packit bd2e5d
    ev_Char = "";
Packit bd2e5d
    ev_BorderWidth = 0;
Packit bd2e5d
    ev_SendEvent = false;
Packit bd2e5d
    ev_KeySymString = "";
Packit bd2e5d
    ev_KeySymInt = 0;
Packit bd2e5d
    ev_RootWindow = 0;
Packit bd2e5d
    ev_SubWindow = 0;
Packit bd2e5d
    ev_Type = 0;
Packit bd2e5d
    ev_Widget = forget_type default_toplevel;
Packit bd2e5d
    ev_RootX = 0;
Packit bd2e5d
    ev_RootY = 0 } in
Packit bd2e5d
     function args ->
Packit bd2e5d
       let l = ref args in
Packit bd2e5d
       List.iter what ~f:
Packit bd2e5d
         begin fun field ->
Packit bd2e5d
           match !l with
Packit bd2e5d
           | [] -> ()
Packit bd2e5d
           | v :: rest -> filleventInfo ev v field; l := rest
Packit bd2e5d
         end;
Packit bd2e5d
       f ev
Packit bd2e5d
;;
Packit bd2e5d
Packit bd2e5d
let rec writeeventField : eventField list -> string = function
Packit bd2e5d
  | [] -> ""
Packit bd2e5d
  | field :: rest ->
Packit bd2e5d
    begin
Packit bd2e5d
    match field with
Packit bd2e5d
    | `Above ->     " %a"
Packit bd2e5d
    | `ButtonNumber ->" %b"
Packit bd2e5d
    | `Count ->     " %c"
Packit bd2e5d
    | `Detail ->    " %d"
Packit bd2e5d
    | `Focus ->     " %f"
Packit bd2e5d
    | `Height ->    " %h"
Packit bd2e5d
    | `KeyCode ->   " %k"
Packit bd2e5d
    | `Mode ->      " %m"
Packit bd2e5d
    | `OverrideRedirect -> " %o"
Packit bd2e5d
    | `Place ->     " %p"
Packit bd2e5d
    | `State ->     " %s"
Packit bd2e5d
    | `Time ->      " %t"
Packit bd2e5d
    | `Width ->     " %w"
Packit bd2e5d
    | `MouseX ->    " %x"
Packit bd2e5d
    | `MouseY ->    " %y"
Packit bd2e5d
    (* Quoting is done by Tk *)
Packit bd2e5d
    | `Char ->      " %A"
Packit bd2e5d
    | `BorderWidth -> " %B"
Packit bd2e5d
    | `SendEvent -> " %E"
Packit bd2e5d
    | `KeySymString -> " %K"
Packit bd2e5d
    | `KeySymInt -> " %N"
Packit bd2e5d
    | `RootWindow ->" %R"
Packit bd2e5d
    | `SubWindow -> " %S"
Packit bd2e5d
    | `Type ->      " %T"
Packit bd2e5d
    | `Widget ->    " %W"
Packit bd2e5d
    | `RootX ->     " %X"
Packit bd2e5d
    | `RootY ->     " %Y"
Packit bd2e5d
    end
Packit bd2e5d
    ^ writeeventField rest
Packit bd2e5d
;;
Packit bd2e5d
Packit bd2e5d
##endif