[@Cpp(::vl::presentation::INativeWindowListener::HitTestResult)]
[@CppNamespace(::vl::presentation::INativeWindowListener)]
enum WindowHitTestResult
{
    BorderNoSizing,
    BorderLeft,
    BorderRight,
    BorderTop,
    BorderBottom,
    BorderLeftTop,
    BorderRightTop,
    BorderLeftBottom,
    BorderRightBottom,
    Title,
    ButtonMinimum,
    ButtonMaximum,
    ButtonClose,
    Client,
    Icon,
    NoDecision,
}

[@Cpp(::vl::presentation::INativeCursor::SystemCursorType)]
[@CppNamespace(::vl::presentation::INativeCursor)]
enum WindowSystemCursorType
{
    SmallWaiting,
    LargeWaiting,
    Arrow,
    Cross,
    Hand,
    Help,
    IBeam,
    SizeAll,
    SizeNESW,
    SizeNS,
    SizeNWSE,
    SizeWE,
}

[@Cpp(::vl::presentation::INativeWindow::WindowSizeState)]
enum WindowSizeState
{
    Minimized,
    Restored,
    Maximized,
}

struct WindowSizingConfig
{
    var bounds: NativeRect;
    var clientBounds: NativeRect;
    var sizeState: WindowSizeState;
    var customFramePadding: NativeMargin;
}

message WindowGetBounds
{
    response: WindowSizingConfig;
}

[@DropRepeat] message WindowNotifySetTitle              { request: string; }
[@DropRepeat] message WindowNotifySetEnabled            { request: bool; }
[@DropRepeat] message WindowNotifySetTopMost            { request: bool; }
[@DropRepeat] message WindowNotifySetShowInTaskBar      { request: bool; }
[@DropRepeat] message WindowNotifySetCustomFrameMode    { request: bool; }
[@DropRepeat] message WindowNotifySetMaximizedBox       { request: bool; }
[@DropRepeat] message WindowNotifySetMinimizedBox       { request: bool; }
[@DropRepeat] message WindowNotifySetBorder             { request: bool; }
[@DropRepeat] message WindowNotifySetSizeBox            { request: bool; }
[@DropRepeat] message WindowNotifySetIconVisible        { request: bool; }
[@DropRepeat] message WindowNotifySetTitleBar           { request: bool; }
[@DropRepeat] message WindowNotifySetBounds             { request: NativeRect; }
[@DropRepeat] message WindowNotifySetClientSize         { request: NativeSize; }

struct WindowShowing
{
    var activate: bool;
    var sizeState: WindowSizeState;
}

[@DropRepeat] message WindowNotifyActivate  {}
[@DropRepeat] message WindowNotifyShow      { request: WindowShowing; }
[@DropRepeat] message WindowNotifyMinSize   { request: NativeSize; }
[@DropRepeat] message WindowNotifySetCaret  { request: NativePoint; }

[@DropRepeat] event WindowBoundsUpdated     { request: WindowSizingConfig; }
[@DropRepeat] event WindowActivatedUpdated  { request: bool; }