/*
 * Copyright (C) 2023 Mohamad Al-Jaf
 *
 * 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

import "inspectable.idl";
import "asyncinfo.idl";
import "eventtoken.idl";
import "windowscontracts.idl";
import "windows.foundation.idl";
/* import "windows.graphics.idl"; */
import "windows.graphics.directx.idl";
import "windows.graphics.directx.direct3d11.idl";
/* import "windows.security.authorization.appcapabilityaccess.idl"; */
import "windows.system.idl";
import "windows.ui.idl";
/* import "windows.ui.composition.idl"; */

namespace Windows.Graphics.Capture {
    interface IGraphicsCaptureSession;
    interface IGraphicsCaptureSession2;
    interface IGraphicsCaptureSession3;
    interface IGraphicsCaptureSessionStatics;

    runtimeclass GraphicsCaptureSession;

    [
        contract(Windows.Foundation.UniversalApiContract, 6.0),
        exclusiveto(Windows.Graphics.Capture.GraphicsCaptureSession),
        uuid(814e42a9-f70f-4ad7-939b-fddcc6eb880d)
    ]
    interface IGraphicsCaptureSession : IInspectable
    {
        HRESULT StartCapture();
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 6.0),
        exclusiveto(Windows.Graphics.Capture.GraphicsCaptureSession),
        uuid(2224a540-5974-49aa-b232-0882536f4cb5)
    ]
    interface IGraphicsCaptureSessionStatics : IInspectable
    {
        HRESULT IsSupported([out, retval] boolean *result);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 6.0),
        marshaling_behavior(agile),
        static(Windows.Graphics.Capture.IGraphicsCaptureSessionStatics, Windows.Foundation.UniversalApiContract, 6.0),
        threading(both)
    ]
    runtimeclass GraphicsCaptureSession
    {
        [default] interface Windows.Graphics.Capture.IGraphicsCaptureSession;
        [contract(Windows.Foundation.UniversalApiContract, 10.0)] interface Windows.Graphics.Capture.IGraphicsCaptureSession2;
        [contract(Windows.Foundation.UniversalApiContract, 12.0)] interface Windows.Graphics.Capture.IGraphicsCaptureSession3;
        interface Windows.Foundation.IClosable;
    }
}
