// C++/WinRT v2.0.250303.1

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

#pragma once
#ifndef WINRT_Windows_UI_Input_Preview_Injection_2_H
#define WINRT_Windows_UI_Input_Preview_Injection_2_H
#include "winrt/impl/Windows.Gaming.Input.2.h"
#include "winrt/impl/Windows.UI.Input.Preview.Injection.1.h"
WINRT_EXPORT namespace winrt::Windows::UI::Input::Preview::Injection
{
    struct InjectedInputPoint
    {
        int32_t PositionX {};
        int32_t PositionY {};
    };
    inline bool operator==(InjectedInputPoint const& left, InjectedInputPoint const& right) noexcept
    {
        return left.PositionX == right.PositionX && left.PositionY == right.PositionY;
    }
    inline bool operator!=(InjectedInputPoint const& left, InjectedInputPoint const& right) noexcept
    {
        return !(left == right);
    }
    struct InjectedInputPointerInfo
    {
        uint32_t PointerId {};
        winrt::Windows::UI::Input::Preview::Injection::InjectedInputPointerOptions PointerOptions {};
        winrt::Windows::UI::Input::Preview::Injection::InjectedInputPoint PixelLocation {};
        uint32_t TimeOffsetInMilliseconds {};
        uint64_t PerformanceCount {};
    };
    inline bool operator==(InjectedInputPointerInfo const& left, InjectedInputPointerInfo const& right) noexcept
    {
        return left.PointerId == right.PointerId && left.PointerOptions == right.PointerOptions && left.PixelLocation == right.PixelLocation && left.TimeOffsetInMilliseconds == right.TimeOffsetInMilliseconds && left.PerformanceCount == right.PerformanceCount;
    }
    inline bool operator!=(InjectedInputPointerInfo const& left, InjectedInputPointerInfo const& right) noexcept
    {
        return !(left == right);
    }
    struct InjectedInputRectangle
    {
        int32_t Left {};
        int32_t Top {};
        int32_t Bottom {};
        int32_t Right {};
    };
    inline bool operator==(InjectedInputRectangle const& left, InjectedInputRectangle const& right) noexcept
    {
        return left.Left == right.Left && left.Top == right.Top && left.Bottom == right.Bottom && left.Right == right.Right;
    }
    inline bool operator!=(InjectedInputRectangle const& left, InjectedInputRectangle const& right) noexcept
    {
        return !(left == right);
    }
    struct WINRT_IMPL_EMPTY_BASES InjectedInputGamepadInfo : winrt::Windows::UI::Input::Preview::Injection::IInjectedInputGamepadInfo
    {
        InjectedInputGamepadInfo(std::nullptr_t) noexcept {}
        InjectedInputGamepadInfo(void* ptr, take_ownership_from_abi_t) noexcept : winrt::Windows::UI::Input::Preview::Injection::IInjectedInputGamepadInfo(ptr, take_ownership_from_abi) {}
        InjectedInputGamepadInfo();
        explicit InjectedInputGamepadInfo(winrt::Windows::Gaming::Input::GamepadReading const& reading);
    };
    struct WINRT_IMPL_EMPTY_BASES InjectedInputKeyboardInfo : winrt::Windows::UI::Input::Preview::Injection::IInjectedInputKeyboardInfo
    {
        InjectedInputKeyboardInfo(std::nullptr_t) noexcept {}
        InjectedInputKeyboardInfo(void* ptr, take_ownership_from_abi_t) noexcept : winrt::Windows::UI::Input::Preview::Injection::IInjectedInputKeyboardInfo(ptr, take_ownership_from_abi) {}
        InjectedInputKeyboardInfo();
    };
    struct WINRT_IMPL_EMPTY_BASES InjectedInputMouseInfo : winrt::Windows::UI::Input::Preview::Injection::IInjectedInputMouseInfo
    {
        InjectedInputMouseInfo(std::nullptr_t) noexcept {}
        InjectedInputMouseInfo(void* ptr, take_ownership_from_abi_t) noexcept : winrt::Windows::UI::Input::Preview::Injection::IInjectedInputMouseInfo(ptr, take_ownership_from_abi) {}
        InjectedInputMouseInfo();
    };
    struct WINRT_IMPL_EMPTY_BASES InjectedInputPenInfo : winrt::Windows::UI::Input::Preview::Injection::IInjectedInputPenInfo
    {
        InjectedInputPenInfo(std::nullptr_t) noexcept {}
        InjectedInputPenInfo(void* ptr, take_ownership_from_abi_t) noexcept : winrt::Windows::UI::Input::Preview::Injection::IInjectedInputPenInfo(ptr, take_ownership_from_abi) {}
        InjectedInputPenInfo();
    };
    struct WINRT_IMPL_EMPTY_BASES InjectedInputTouchInfo : winrt::Windows::UI::Input::Preview::Injection::IInjectedInputTouchInfo
    {
        InjectedInputTouchInfo(std::nullptr_t) noexcept {}
        InjectedInputTouchInfo(void* ptr, take_ownership_from_abi_t) noexcept : winrt::Windows::UI::Input::Preview::Injection::IInjectedInputTouchInfo(ptr, take_ownership_from_abi) {}
        InjectedInputTouchInfo();
    };
    struct WINRT_IMPL_EMPTY_BASES InputInjector : winrt::Windows::UI::Input::Preview::Injection::IInputInjector,
        impl::require<InputInjector, winrt::Windows::UI::Input::Preview::Injection::IInputInjector2>
    {
        InputInjector(std::nullptr_t) noexcept {}
        InputInjector(void* ptr, take_ownership_from_abi_t) noexcept : winrt::Windows::UI::Input::Preview::Injection::IInputInjector(ptr, take_ownership_from_abi) {}
        static auto TryCreate();
        static auto TryCreateForAppBroadcastOnly();
    };
}
#endif
