enum IOMouseButton
{
    Left,
    Middle,
    Right,
}

[@Cpp(::vl::presentation::NativeWindowMouseInfo)]
struct IOMouseInfo
{
    var ctrl: bool;
    var shift: bool;
    var left: bool;
    var middle: bool;
    var right: bool;
    var x: NativeCoordinate;
    var y: NativeCoordinate;
    var wheel: int;
    var nonClient: bool;
}

struct IOMouseInfoWithButton
{
    var button: IOMouseButton;
    var info: IOMouseInfo;
}

[@Cpp(::vl::presentation::NativeWindowKeyInfo)]
struct IOKeyInfo
{
    var code: key;
    var ctrl: bool;
    var shift: bool;
    var alt: bool;
    var capslock: bool;
    var autoRepeatKeyDown: bool;
}

[@Cpp(::vl::presentation::NativeWindowCharInfo)]
struct IOCharInfo
{
    var code: char;
    var ctrl: bool;
    var shift: bool;
    var alt: bool;
    var capslock: bool;
}

struct GlobalShortcutKey
{
    var id : int;
    var ctrl : bool;
    var shift : bool;
    var alt : bool;
    var code : key;
}

message IOUpdateGlobalShortcutKey       { request: GlobalShortcutKey[]; }
event IOGlobalShortcutKey             { request: int; }

message IORequireCapture    {}
message IOReleaseCapture    {}
message IOIsKeyPressing     { request: key; response: bool; }
message IOIsKeyToggled      { request: key; response: bool; }

event IOButtonDown          { request: IOMouseInfoWithButton; }
event IOButtonDoubleClick   { request: IOMouseInfoWithButton; }
event IOButtonUp            { request: IOMouseInfoWithButton; }
event IOHWheel              { request: IOMouseInfo; }
event IOVWheel              { request: IOMouseInfo; }

[@DropConsecutive]
event IOMouseMoving         { request: IOMouseInfo; }
event IOMouseEntered        {}
event IOMouseLeaved         {}

event IOKeyDown             { request: IOKeyInfo; }
event IOKeyUp               { request: IOKeyInfo; }
event IOChar                { request: IOCharInfo; }