/*
 * Copyright 2025 Zhiyi Zhang for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#ifdef __WIDL__
#pragma winrt ns_prefix
#endif

#ifndef DO_NO_IMPORTS
import "inspectable.idl";
import "asyncinfo.idl";
import "eventtoken.idl";
import "windowscontracts.idl";
import "windows.foundation.idl";
import "windows.ui.idl";
#endif

namespace Windows.UI.ViewManagement.Core
{
    typedef enum CoreInputViewKind CoreInputViewKind;
    typedef enum CoreInputViewOcclusionKind CoreInputViewOcclusionKind;
    typedef enum CoreInputViewXYFocusTransferDirection CoreInputViewXYFocusTransferDirection;

    interface ICoreInputView;
    interface ICoreInputView2;
    interface ICoreInputView3;
    interface ICoreInputView4;
    interface ICoreInputViewHidingEventArgs;
    interface ICoreInputViewOcclusion;
    interface ICoreInputViewOcclusionsChangedEventArgs;
    interface ICoreInputViewShowingEventArgs;
    interface ICoreInputViewStatics;
    interface ICoreInputViewStatics2;
    interface ICoreInputViewTransferringXYFocusEventArgs;

    runtimeclass CoreInputView;
    runtimeclass CoreInputViewHidingEventArgs;
    runtimeclass CoreInputViewOcclusion;
    runtimeclass CoreInputViewOcclusionsChangedEventArgs;
    runtimeclass CoreInputViewShowingEventArgs;
    runtimeclass CoreInputViewTransferringXYFocusEventArgs;

    declare
    {
        interface Windows.Foundation.Collections.IIterable<Windows.UI.ViewManagement.Core.CoreInputViewOcclusion *>;
        interface Windows.Foundation.Collections.IIterator<Windows.UI.ViewManagement.Core.CoreInputViewOcclusion *>;
        interface Windows.Foundation.Collections.IVectorView<Windows.UI.ViewManagement.Core.CoreInputViewOcclusion *>;
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.Core.CoreInputView *, IInspectable *>;
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.Core.CoreInputView *, Windows.UI.ViewManagement.Core.CoreInputViewHidingEventArgs *>;
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.Core.CoreInputView *, Windows.UI.ViewManagement.Core.CoreInputViewOcclusionsChangedEventArgs *>;
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.Core.CoreInputView *, Windows.UI.ViewManagement.Core.CoreInputViewShowingEventArgs *>;
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.Core.CoreInputView *, Windows.UI.ViewManagement.Core.CoreInputViewTransferringXYFocusEventArgs *>;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 7.0)
    ]
    enum CoreInputViewKind
    {
        Default = 0,
        Keyboard = 1,
        Handwriting = 2,
        Emoji = 3,
        [contract(Windows.Foundation.UniversalApiContract, 10.0)] Symbols = 4
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0)
    ]
    enum CoreInputViewOcclusionKind
    {
        Docked = 0,
        Floating = 1,
        Overlay = 2
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 6.0)
    ]
    enum CoreInputViewXYFocusTransferDirection
    {
        Up = 0,
        Right = 1,
        Down = 2,
        Left = 3
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        exclusiveto(Windows.UI.ViewManagement.Core.CoreInputView),
        uuid(c770cd7a-7001-4c32-bf94-25c1f554cbf1)
    ]
    interface ICoreInputView : IInspectable
    {
        [eventadd] HRESULT OcclusionsChanged([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.Core.CoreInputView *, Windows.UI.ViewManagement.Core.CoreInputViewOcclusionsChangedEventArgs *> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT OcclusionsChanged([in] EventRegistrationToken token);
        HRESULT GetCoreInputViewOcclusions([out, retval] Windows.Foundation.Collections.IVectorView<Windows.UI.ViewManagement.Core.CoreInputViewOcclusion *> **result);
        HRESULT TryShowPrimaryView([out, retval] boolean *result);
        HRESULT TryHidePrimaryView([out, retval] boolean *result);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 6.0),
        exclusiveto(Windows.UI.ViewManagement.Core.CoreInputView),
        uuid(0ed726c1-e09a-4ae8-aedf-dfa4857d1a01)
    ]
    interface ICoreInputView2 : IInspectable
    {
        [eventadd] HRESULT XYFocusTransferringFromPrimaryView([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.Core.CoreInputView *, Windows.UI.ViewManagement.Core.CoreInputViewTransferringXYFocusEventArgs *> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT XYFocusTransferringFromPrimaryView([in] EventRegistrationToken token);
        [eventadd] HRESULT XYFocusTransferredToPrimaryView([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.Core.CoreInputView *, IInspectable *> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT XYFocusTransferredToPrimaryView([in] EventRegistrationToken token);
        HRESULT TryTransferXYFocusToPrimaryView([in] Windows.Foundation.Rect origin, [in] Windows.UI.ViewManagement.Core.CoreInputViewXYFocusTransferDirection direction, [out, retval] boolean *result);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 7.0),
        exclusiveto(Windows.UI.ViewManagement.Core.CoreInputView),
        uuid(bc941653-3ab9-4849-8f58-46e7f0353cfc)
    ]
    interface ICoreInputView3 : IInspectable
    {
        [overload("TryShow")] HRESULT TryShow([out, retval] boolean *result);
        [overload("TryShow")] HRESULT TryShowWithKind([in] Windows.UI.ViewManagement.Core.CoreInputViewKind type, [out, retval] boolean *result);
        HRESULT TryHide([out, retval] boolean *result);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 10.0),
        exclusiveto(Windows.UI.ViewManagement.Core.CoreInputView),
        uuid(002863d6-d9ef-57eb-8cef-77f6ce1b7ee7)
    ]
    interface ICoreInputView4 : IInspectable
    {
        [eventadd] HRESULT PrimaryViewShowing([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.Core.CoreInputView *, Windows.UI.ViewManagement.Core.CoreInputViewShowingEventArgs *> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT PrimaryViewShowing([in] EventRegistrationToken token);
        [eventadd] HRESULT PrimaryViewHiding([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.Core.CoreInputView *, Windows.UI.ViewManagement.Core.CoreInputViewHidingEventArgs *> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT PrimaryViewHiding([in] EventRegistrationToken token);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 10.0),
        exclusiveto(Windows.UI.ViewManagement.Core.CoreInputViewHidingEventArgs),
        uuid(eada47bd-bac5-5336-848d-41083584daad)
    ]
    interface ICoreInputViewHidingEventArgs : IInspectable
    {
        HRESULT TryCancel([out, retval] boolean *result);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        exclusiveto(Windows.UI.ViewManagement.Core.CoreInputViewOcclusion),
        uuid(cc36ce06-3865-4177-b5f5-8b65e0b9ce84)
    ]
    interface ICoreInputViewOcclusion : IInspectable
    {
        [propget] HRESULT OccludingRect([out, retval] Windows.Foundation.Rect *rect);
        [propget] HRESULT OcclusionKind([out, retval] Windows.UI.ViewManagement.Core.CoreInputViewOcclusionKind *kind);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        exclusiveto(Windows.UI.ViewManagement.Core.CoreInputViewOcclusionsChangedEventArgs),
        uuid(be1027e8-b3ee-4df7-9554-89cdc66082c2)
    ]
    interface ICoreInputViewOcclusionsChangedEventArgs : IInspectable
    {
        [propget] HRESULT Occlusions([out, retval] Windows.Foundation.Collections.IVectorView<Windows.UI.ViewManagement.Core.CoreInputViewOcclusion *> **value);
        [propget] HRESULT Handled([out, retval] boolean *value);
        [propput] HRESULT Handled([in] boolean value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 10.0),
        exclusiveto(Windows.UI.ViewManagement.Core.CoreInputViewShowingEventArgs),
        uuid(ca52261b-fb9e-5daf-a98c-262b8b76af50)
    ]
    interface ICoreInputViewShowingEventArgs : IInspectable
    {
        HRESULT TryCancel([out, retval] boolean *result);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        exclusiveto(Windows.UI.ViewManagement.Core.CoreInputView),
        uuid(7d9b97cd-edbe-49cf-a54f-337de052907f)
    ]
    interface ICoreInputViewStatics : IInspectable
    {
        HRESULT GetForCurrentView([out, retval] Windows.UI.ViewManagement.Core.CoreInputView **result);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 8.0),
        exclusiveto(Windows.UI.ViewManagement.Core.CoreInputView),
        uuid(7ebc0862-d049-4e52-87b0-1e90e98c49ed)
    ]
    interface ICoreInputViewStatics2 : IInspectable
    {
        HRESULT GetForUIContext([in] Windows.UI.UIContext *context, [out, retval] Windows.UI.ViewManagement.Core.CoreInputView **result);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 6.0),
        exclusiveto(Windows.UI.ViewManagement.Core.CoreInputViewTransferringXYFocusEventArgs),
        uuid(04de169f-ba02-4850-8b55-d82d03ba6d7f)
    ]
    interface ICoreInputViewTransferringXYFocusEventArgs : IInspectable
    {
        [propget] HRESULT Origin([out, retval] Windows.Foundation.Rect *value);
        [propget] HRESULT Direction([out, retval] Windows.UI.ViewManagement.Core.CoreInputViewXYFocusTransferDirection *value);
        [propput] HRESULT TransferHandled([in] boolean value);
        [propget] HRESULT TransferHandled([out, retval] boolean *value);
        [propput] HRESULT KeepPrimaryViewVisible([in] boolean value);
        [propget] HRESULT KeepPrimaryViewVisible([out, retval] boolean *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        marshaling_behavior(agile),
        static(Windows.UI.ViewManagement.Core.ICoreInputViewStatics, Windows.Foundation.UniversalApiContract, 5.0),
        static(Windows.UI.ViewManagement.Core.ICoreInputViewStatics2, Windows.Foundation.UniversalApiContract, 8.0),
        threading(both)
    ]
    runtimeclass CoreInputView
    {
        [default] interface Windows.UI.ViewManagement.Core.ICoreInputView;
        [contract(Windows.Foundation.UniversalApiContract, 6.0)] interface Windows.UI.ViewManagement.Core.ICoreInputView2;
        [contract(Windows.Foundation.UniversalApiContract, 7.0)] interface Windows.UI.ViewManagement.Core.ICoreInputView3;
        [contract(Windows.Foundation.UniversalApiContract, 10.0)] interface Windows.UI.ViewManagement.Core.ICoreInputView4;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 10.0),
        marshaling_behavior(agile)
    ]
    runtimeclass CoreInputViewHidingEventArgs
    {
        [default] interface Windows.UI.ViewManagement.Core.ICoreInputViewHidingEventArgs;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        marshaling_behavior(agile)
    ]
    runtimeclass CoreInputViewOcclusion
    {
        [default] interface Windows.UI.ViewManagement.Core.ICoreInputViewOcclusion;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        marshaling_behavior(agile)
    ]
    runtimeclass CoreInputViewOcclusionsChangedEventArgs
    {
        [default] interface Windows.UI.ViewManagement.Core.ICoreInputViewOcclusionsChangedEventArgs;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 10.0),
        marshaling_behavior(agile)
    ]
    runtimeclass CoreInputViewShowingEventArgs
    {
        [default] interface Windows.UI.ViewManagement.Core.ICoreInputViewShowingEventArgs;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 6.0),
        marshaling_behavior(agile)
    ]
    runtimeclass CoreInputViewTransferringXYFocusEventArgs
    {
        [default] interface Windows.UI.ViewManagement.Core.ICoreInputViewTransferringXYFocusEventArgs;
    }
}
