/*
 * Copyright 2021 Rémi Bernon 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.devices.haptics.idl";
import "windows.gaming.input.forcefeedback.idl";
import "windows.system.idl";
import "windows.devices.power.idl";
#endif

namespace Windows.Gaming.Input {
    typedef enum ArcadeStickButtons ArcadeStickButtons;
    typedef enum FlightStickButtons FlightStickButtons;
    typedef enum GamepadButtons GamepadButtons;
    typedef enum GameControllerButtonLabel GameControllerButtonLabel;
    typedef enum GameControllerSwitchKind GameControllerSwitchKind;
    typedef enum GameControllerSwitchPosition GameControllerSwitchPosition;
    typedef enum RacingWheelButtons RacingWheelButtons;
    typedef struct ArcadeStickReading ArcadeStickReading;
    typedef struct FlightStickReading FlightStickReading;
    typedef struct GamepadReading GamepadReading;
    typedef struct GamepadVibration GamepadVibration;
    typedef struct RacingWheelReading RacingWheelReading;
    interface IArcadeStick;
    interface IArcadeStickStatics;
    interface IArcadeStickStatics2;
    interface IFlightStick;
    interface IFlightStickStatics;
    interface IGameController;
    interface IGameControllerBatteryInfo;
    interface IGamepad;
    interface IGamepad2;
    interface IGamepadStatics;
    interface IGamepadStatics2;
    interface IRacingWheel;
    interface IRacingWheelStatics;
    interface IRacingWheelStatics2;
    interface IRawGameController;
    interface IRawGameController2;
    runtimeclass ArcadeStick;
    runtimeclass FlightStick;
    runtimeclass Gamepad;
    runtimeclass Headset;
    runtimeclass RacingWheel;
    runtimeclass RawGameController;

    declare {
        interface Windows.Foundation.EventHandler<Windows.Gaming.Input.ArcadeStick *>;
        interface Windows.Foundation.EventHandler<Windows.Gaming.Input.FlightStick *>;
        interface Windows.Foundation.EventHandler<Windows.Gaming.Input.Gamepad *>;
        interface Windows.Foundation.EventHandler<Windows.Gaming.Input.RacingWheel *>;
        interface Windows.Foundation.EventHandler<Windows.Gaming.Input.RawGameController *>;
        interface Windows.Foundation.TypedEventHandler<Windows.Gaming.Input.IGameController *, Windows.Gaming.Input.Headset *>;
        interface Windows.Foundation.TypedEventHandler<Windows.Gaming.Input.IGameController *, Windows.System.UserChangedEventArgs *>;
        interface Windows.Foundation.Collections.IIterator<Windows.Gaming.Input.ArcadeStick *>;
        interface Windows.Foundation.Collections.IIterable<Windows.Gaming.Input.ArcadeStick *>;
        interface Windows.Foundation.Collections.IVectorView<Windows.Gaming.Input.ArcadeStick *>;
        interface Windows.Foundation.Collections.IIterator<Windows.Gaming.Input.FlightStick *>;
        interface Windows.Foundation.Collections.IIterable<Windows.Gaming.Input.FlightStick *>;
        interface Windows.Foundation.Collections.IVectorView<Windows.Gaming.Input.FlightStick *>;
        interface Windows.Foundation.Collections.IIterator<Windows.Gaming.Input.Gamepad *>;
        interface Windows.Foundation.Collections.IIterable<Windows.Gaming.Input.Gamepad *>;
        interface Windows.Foundation.Collections.IVectorView<Windows.Gaming.Input.Gamepad *>;
        interface Windows.Foundation.Collections.IVector<Windows.Gaming.Input.Gamepad *>;
        interface Windows.Foundation.Collections.IIterator<Windows.Gaming.Input.RacingWheel *>;
        interface Windows.Foundation.Collections.IIterable<Windows.Gaming.Input.RacingWheel *>;
        interface Windows.Foundation.Collections.IVectorView<Windows.Gaming.Input.RacingWheel *>;
        interface Windows.Foundation.Collections.IVector<Windows.Gaming.Input.RacingWheel *>;
        interface Windows.Foundation.Collections.IIterator<Windows.Gaming.Input.RawGameController *>;
        interface Windows.Foundation.Collections.IIterable<Windows.Gaming.Input.RawGameController *>;
        interface Windows.Foundation.Collections.IVectorView<Windows.Gaming.Input.RawGameController *>;
        interface Windows.Foundation.Collections.IVector<Windows.Gaming.Input.RawGameController *>;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 3.0),
        flags
    ]
    enum ArcadeStickButtons
    {
        None = 0x0,
        StickUp = 0x1,
        StickDown = 0x2,
        StickLeft = 0x4,
        StickRight = 0x8,
        Action1 = 0x10,
        Action2 = 0x20,
        Action3 = 0x40,
        Action4 = 0x80,
        Action5 = 0x100,
        Action6 = 0x200,
        Special1 = 0x400,
        Special2 = 0x800
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        flags
    ]
    enum FlightStickButtons
    {
        None = 0x0,
        FirePrimary = 0x1,
        FireSecondary = 0x2,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        flags
    ]
    enum GamepadButtons
    {
        None = 0x0,
        Menu = 0x1,
        View = 0x2,
        A = 0x4,
        B = 0x8,
        X = 0x10,
        Y = 0x20,
        DPadUp = 0x40,
        DPadDown = 0x80,
        DPadLeft = 0x100,
        DPadRight = 0x200,
        LeftShoulder = 0x400,
        RightShoulder = 0x800,
        LeftThumbstick = 0x1000,
        RightThumbstick = 0x2000,
        [contract(Windows.Foundation.UniversalApiContract, 3.0)]
        Paddle1 = 0x4000,
        [contract(Windows.Foundation.UniversalApiContract, 3.0)]
        Paddle2 = 0x8000,
        [contract(Windows.Foundation.UniversalApiContract, 3.0)]
        Paddle3 = 0x10000,
        [contract(Windows.Foundation.UniversalApiContract, 3.0)]
        Paddle4 = 0x20000
    };

    [contract(Windows.Foundation.UniversalApiContract, 3.0)]
    enum GameControllerButtonLabel
    {
        None                 = 0,
        XboxBack             = 1,
        XboxStart            = 2,
        XboxMenu             = 3,
        XboxView             = 4,
        XboxUp               = 5,
        XboxDown             = 6,
        XboxLeft             = 7,
        XboxRight            = 8,
        XboxA                = 9,
        XboxB                = 10,
        XboxX                = 11,
        XboxY                = 12,
        XboxLeftBumper       = 13,
        XboxLeftTrigger      = 14,
        XboxLeftStickButton  = 15,
        XboxRightBumper      = 16,
        XboxRightTrigger     = 17,
        XboxRightStickButton = 18,
        XboxPaddle1          = 19,
        XboxPaddle2          = 20,
        XboxPaddle3          = 21,
        XboxPaddle4          = 22,
        Mode                 = 23,
        Select               = 24,
        Menu                 = 25,
        View                 = 26,
        Back                 = 27,
        Start                = 28,
        Options              = 29,
        Share                = 30,
        Up                   = 31,
        Down                 = 32,
        Left                 = 33,
        Right                = 34,
        LetterA              = 35,
        LetterB              = 36,
        LetterC              = 37,
        LetterL              = 38,
        LetterR              = 39,
        LetterX              = 40,
        LetterY              = 41,
        LetterZ              = 42,
        Cross                = 43,
        Circle               = 44,
        Square               = 45,
        Triangle             = 46,
        LeftBumper           = 47,
        LeftTrigger          = 48,
        LeftStickButton      = 49,
        Left1                = 50,
        Left2                = 51,
        Left3                = 52,
        RightBumper          = 53,
        RightTrigger         = 54,
        RightStickButton     = 55,
        Right1               = 56,
        Right2               = 57,
        Right3               = 58,
        Paddle1              = 59,
        Paddle2              = 60,
        Paddle3              = 61,
        Paddle4              = 62,
        Plus                 = 63,
        Minus                = 64,
        DownLeftArrow        = 65,
        DialLeft             = 66,
        DialRight            = 67,
        Suspension           = 68
    };

    [contract(Windows.Foundation.UniversalApiContract, 4.0)]
    enum GameControllerSwitchKind
    {
        TwoWay   = 0,
        FourWay  = 1,
        EightWay = 2
    };

    [contract(Windows.Foundation.UniversalApiContract, 4.0)]
    enum GameControllerSwitchPosition
    {
        Center    = 0,
        Up        = 1,
        UpRight   = 2,
        Right     = 3,
        DownRight = 4,
        Down      = 5,
        DownLeft  = 6,
        Left      = 7,
        UpLeft    = 8
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 3.0),
        flags
    ]
    enum RacingWheelButtons
    {
        None         = 0x0,
        PreviousGear = 0x1,
        NextGear     = 0x2,
        DPadUp       = 0x4,
        DPadDown     = 0x8,
        DPadLeft     = 0x10,
        DPadRight    = 0x20,
        Button1      = 0x40,
        Button2      = 0x80,
        Button3      = 0x100,
        Button4      = 0x200,
        Button5      = 0x400,
        Button6      = 0x800,
        Button7      = 0x1000,
        Button8      = 0x2000,
        Button9      = 0x4000,
        Button10     = 0x8000,
        Button11     = 0x10000,
        Button12     = 0x20000,
        Button13     = 0x40000,
        Button14     = 0x80000,
        Button15     = 0x100000,
        Button16     = 0x200000,
    };

    [contract(Windows.Foundation.UniversalApiContract, 3.0)]
    struct ArcadeStickReading
    {
        UINT64 Timestamp;
        Windows.Gaming.Input.ArcadeStickButtons Buttons;
    };

    [contract(Windows.Foundation.UniversalApiContract, 4.0)]
    struct FlightStickReading
    {
        UINT64 Timestamp;
        Windows.Gaming.Input.FlightStickButtons Buttons;
        Windows.Gaming.Input.GameControllerSwitchPosition HatSwitch;
        DOUBLE Roll;
        DOUBLE Pitch;
        DOUBLE Yaw;
        DOUBLE Throttle;
    };

    [contract(Windows.Foundation.UniversalApiContract, 1.0)]
    struct GamepadReading
    {
        UINT64 Timestamp;
        Windows.Gaming.Input.GamepadButtons Buttons;
        DOUBLE LeftTrigger;
        DOUBLE RightTrigger;
        DOUBLE LeftThumbstickX;
        DOUBLE LeftThumbstickY;
        DOUBLE RightThumbstickX;
        DOUBLE RightThumbstickY;
    };

    [contract(Windows.Foundation.UniversalApiContract, 1.0)]
    struct GamepadVibration
    {
        DOUBLE LeftMotor;
        DOUBLE RightMotor;
        DOUBLE LeftTrigger;
        DOUBLE RightTrigger;
    };

    [contract(Windows.Foundation.UniversalApiContract, 3.0)]
    struct RacingWheelReading
    {
        UINT64 Timestamp;
        Windows.Gaming.Input.RacingWheelButtons Buttons;
        INT32 PatternShifterGear;
        DOUBLE Wheel;
        DOUBLE Throttle;
        DOUBLE Brake;
        DOUBLE Clutch;
        DOUBLE Handbrake;
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 3.0),
        exclusiveto(Windows.Gaming.Input.ArcadeStick),
        uuid(b14a539d-befb-4c81-8051-15ecf3b13036)
    ]
    interface IArcadeStick : IInspectable
        requires Windows.Gaming.Input.IGameController
    {
        HRESULT GetButtonLabel([in] Windows.Gaming.Input.ArcadeStickButtons button,
                               [out, retval] Windows.Gaming.Input.GameControllerButtonLabel *value);
        HRESULT GetCurrentReading([out, retval] Windows.Gaming.Input.ArcadeStickReading *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 3.0),
        exclusiveto(Windows.Gaming.Input.ArcadeStick),
        uuid(5c37b8c8-37b1-4ad8-9458-200f1a30018e)
    ]
    interface IArcadeStickStatics : IInspectable
    {
        [eventadd] HRESULT ArcadeStickAdded([in] Windows.Foundation.EventHandler<Windows.Gaming.Input.ArcadeStick *> *value,
                                            [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT ArcadeStickAdded([in] EventRegistrationToken token);
        [eventadd] HRESULT ArcadeStickRemoved([in] Windows.Foundation.EventHandler<Windows.Gaming.Input.ArcadeStick *> *value,
                                              [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT ArcadeStickRemoved([in] EventRegistrationToken token);
        [propget] HRESULT ArcadeSticks([out, retval] Windows.Foundation.Collections.IVectorView<Windows.Gaming.Input.ArcadeStick *> **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.Gaming.Input.ArcadeStick),
        uuid(52b5d744-bb86-445a-b59c-596f0e2a49df)
    ]
    interface IArcadeStickStatics2 : IInspectable
        requires Windows.Gaming.Input.IArcadeStickStatics
    {
        HRESULT FromGameController([in] Windows.Gaming.Input.IGameController *controller,
                                   [out, retval] Windows.Gaming.Input.ArcadeStick **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.Gaming.Input.FlightStick),
        uuid(b4a2c01c-b83b-4459-a1a9-97b03c33da7c)
    ]
    interface IFlightStick : IInspectable
        requires Windows.Gaming.Input.IGameController
    {
        [propget] HRESULT HatSwitchKind([out, retval] Windows.Gaming.Input.GameControllerSwitchKind *value);
        HRESULT GetButtonLabel([in] Windows.Gaming.Input.FlightStickButtons button,
                               [out, retval] Windows.Gaming.Input.GameControllerButtonLabel *value);
        HRESULT GetCurrentReading([out, retval] Windows.Gaming.Input.FlightStickReading *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.Gaming.Input.FlightStick),
        uuid(5514924a-fecc-435e-83dc-5cec8a18a520)
    ]
    interface IFlightStickStatics : IInspectable
    {
        [eventadd] HRESULT FlightStickAdded([in] Windows.Foundation.EventHandler<Windows.Gaming.Input.FlightStick *> *value,
                                            [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT FlightStickAdded([in] EventRegistrationToken token);
        [eventadd] HRESULT FlightStickRemoved([in] Windows.Foundation.EventHandler<Windows.Gaming.Input.FlightStick *> *value,
                                              [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT FlightStickRemoved([in] EventRegistrationToken token);
        [propget] HRESULT FlightSticks([out, retval] Windows.Foundation.Collections.IVectorView<Windows.Gaming.Input.FlightStick *> **value);
        HRESULT FromGameController([in] Windows.Gaming.Input.IGameController *controller,
                                   [out, retval] Windows.Gaming.Input.FlightStick **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        uuid(1baf6522-5f64-42c5-8267-b9fe2215bfbd)
    ]
    interface IGameController : IInspectable
    {
        [eventadd] HRESULT HeadsetConnected([in] Windows.Foundation.TypedEventHandler<Windows.Gaming.Input.IGameController *, Windows.Gaming.Input.Headset *> *handler,
                                            [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT HeadsetConnected([in] EventRegistrationToken token);
        [eventadd] HRESULT HeadsetDisconnected([in] Windows.Foundation.TypedEventHandler<Windows.Gaming.Input.IGameController *, Windows.Gaming.Input.Headset *> *handler,
                                               [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT HeadsetDisconnected([in] EventRegistrationToken token);
        [eventadd] HRESULT UserChanged([in] Windows.Foundation.TypedEventHandler<Windows.Gaming.Input.IGameController *, Windows.System.UserChangedEventArgs *> *handler,
                                       [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT UserChanged([in] EventRegistrationToken token);
        [propget] HRESULT Headset([out, retval] Windows.Gaming.Input.Headset **value);
        [propget] HRESULT IsWireless([out, retval] boolean *value);
        [propget] HRESULT User([out, retval] Windows.System.User **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Gaming.Input.Gamepad),
        uuid(bc7bb43c-0a69-3903-9e9d-a50f86a45de5)
    ]
    interface IGamepad : IInspectable
        requires Windows.Gaming.Input.IGameController
    {
        [propget] HRESULT Vibration([out, retval] Windows.Gaming.Input.GamepadVibration *value);
        [propput] HRESULT Vibration([in] Windows.Gaming.Input.GamepadVibration value);
        HRESULT GetCurrentReading([out, retval] Windows.Gaming.Input.GamepadReading *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 3.0),
        exclusiveto(Windows.Gaming.Input.Gamepad),
        uuid(3c1689bd-5915-4245-b0c0-c89fae0308ff)
    ]
    interface IGamepad2 : IInspectable
        requires Windows.Gaming.Input.IGamepad,
                 Windows.Gaming.Input.IGameController
    {
        HRESULT GetButtonLabel([in] Windows.Gaming.Input.GamepadButtons button,
                               [out, retval] Windows.Gaming.Input.GameControllerButtonLabel *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 3.0),
        exclusiveto(Windows.Gaming.Input.RacingWheel),
        uuid(f546656f-e106-4c82-a90f-554012904b85)
    ]
    interface IRacingWheel : IInspectable
        requires Windows.Gaming.Input.IGameController
    {
        [propget] HRESULT HasClutch([out, retval] boolean *value);
        [propget] HRESULT HasHandbrake([out, retval] boolean *value);
        [propget] HRESULT HasPatternShifter([out, retval] boolean *value);
        [propget] HRESULT MaxPatternShifterGear([out, retval] INT32 *value);
        [propget] HRESULT MaxWheelAngle([out, retval] DOUBLE *value);
        [propget] HRESULT WheelMotor([out, retval] Windows.Gaming.Input.ForceFeedback.ForceFeedbackMotor **value);
        HRESULT GetButtonLabel([in] Windows.Gaming.Input.RacingWheelButtons button, [out, retval] Windows.Gaming.Input.GameControllerButtonLabel *value);
        HRESULT GetCurrentReading([out, retval] Windows.Gaming.Input.RacingWheelReading *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 3.0),
        exclusiveto(Windows.Gaming.Input.RacingWheel),
        uuid(3ac12cd5-581b-4936-9f94-69f1e6514c7d)
    ]
    interface IRacingWheelStatics : IInspectable
    {
        [eventadd] HRESULT RacingWheelAdded([in] Windows.Foundation.EventHandler<RacingWheel *> *value, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT RacingWheelAdded([in] EventRegistrationToken token);
        [eventadd] HRESULT RacingWheelRemoved([in] Windows.Foundation.EventHandler<RacingWheel *> *value, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT RacingWheelRemoved([in] EventRegistrationToken token);
        [propget] HRESULT RacingWheels([out, retval] Windows.Foundation.Collections.IVectorView<RacingWheel *> **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.Gaming.Input.RacingWheel),
        uuid(e666bcaa-edfd-4323-a9f6-3c384048d1ed)
    ]
    interface IRacingWheelStatics2 : IInspectable
        requires Windows.Gaming.Input.IRacingWheelStatics
    {
        HRESULT FromGameController([in] Windows.Gaming.Input.IGameController *controller,
                                   [out, retval] Windows.Gaming.Input.RacingWheel **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.Gaming.Input.RawGameController),
        uuid(7cad6d91-a7e1-4f71-9a78-33e9c5dfea62)
    ]
    interface IRawGameController : IInspectable
        requires Windows.Gaming.Input.IGameController
    {
        [propget] HRESULT AxisCount([out, retval] INT32 *value);
        [propget] HRESULT ButtonCount([out, retval] INT32 *value);
        [propget] HRESULT ForceFeedbackMotors([out, retval] Windows.Foundation.Collections.IVectorView<Windows.Gaming.Input.ForceFeedback.ForceFeedbackMotor *> **value);
        [propget] HRESULT HardwareProductId([out, retval] UINT16 *value);
        [propget] HRESULT HardwareVendorId([out, retval] UINT16 *value);
        [propget] HRESULT SwitchCount([out, retval] INT32 *value);
        HRESULT GetButtonLabel([in] INT32 index, [out, retval] Windows.Gaming.Input.GameControllerButtonLabel *value);
        HRESULT GetCurrentReading([in] UINT32 buttons_size, [out, size_is(buttons_size)] boolean *buttons,
                                  [in] UINT32 switches_size, [out, size_is(switches_size)] Windows.Gaming.Input.GameControllerSwitchPosition *switches,
                                  [in] UINT32 axes_size, [out, size_is(axes_size)] DOUBLE *axes,
                                  [out, retval] UINT64 *timestamp);
        HRESULT GetSwitchKind([in] INT32 index, [out, retval] Windows.Gaming.Input.GameControllerSwitchKind *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        exclusiveto(Windows.Gaming.Input.RawGameController),
        uuid(43c0c035-bb73-4756-a787-3ed6bea617bd)
    ]
    interface IRawGameController2 : IInspectable
        requires Windows.Gaming.Input.IRawGameController,
                 Windows.Gaming.Input.IGameController
    {
        [propget] HRESULT SimpleHapticsControllers([out, retval] Windows.Foundation.Collections.IVectorView<Windows.Devices.Haptics.SimpleHapticsController *> **value);
        [propget] HRESULT NonRoamableId([out, retval] HSTRING *value);
        [propget] HRESULT DisplayName([out, retval] HSTRING *value);
    }

    [
        object,
        uuid(8bbce529-d49c-39e9-9560-e47dde96b7c8)
    ]
    interface IGamepadStatics : IInspectable
    {
        [eventadd] HRESULT GamepadAdded([in] Windows.Foundation.EventHandler<Gamepad *> *value, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT GamepadAdded([in] EventRegistrationToken token);
        [eventadd] HRESULT GamepadRemoved([in] Windows.Foundation.EventHandler<Gamepad *> *value, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT GamepadRemoved([in] EventRegistrationToken token);
        [propget] HRESULT Gamepads([out, retval] Windows.Foundation.Collections.IVectorView<Gamepad *> **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.Gaming.Input.Gamepad),
        uuid(42676dc5-0856-47c4-9213-b395504c3a3c)
    ]
    interface IGamepadStatics2 : IInspectable
        requires Windows.Gaming.Input.IGamepadStatics
    {
        HRESULT FromGameController([in] Windows.Gaming.Input.IGameController *controller,
                                   [out, retval] Windows.Gaming.Input.Gamepad **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Gaming.Input.Headset),
        uuid(3fd156ef-6925-3fa8-9181-029c5223ae3b)
    ]
    interface IHeadset : IInspectable
    {
        [propget] HRESULT CaptureDeviceId([out, retval] HSTRING *value);
        [propget] HRESULT RenderDeviceId([out, retval] HSTRING *value);
    }

    [
        object,
        uuid(eb8d0792-e95a-4b19-afc7-0a59f8bf759e)
    ]
    interface IRawGameControllerStatics : IInspectable
    {
        [eventadd] HRESULT RawGameControllerAdded([in] Windows.Foundation.EventHandler<Windows.Gaming.Input.RawGameController *> *handler,
                                                  [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT RawGameControllerAdded([in] EventRegistrationToken token);
        [eventadd] HRESULT RawGameControllerRemoved([in] Windows.Foundation.EventHandler<Windows.Gaming.Input.RawGameController *> *handler,
                                                    [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT RawGameControllerRemoved([in] EventRegistrationToken token);
        [propget] HRESULT RawGameControllers([out, retval] Windows.Foundation.Collections.IVectorView<Windows.Gaming.Input.RawGameController *> **value);
        HRESULT FromGameController([in] Windows.Gaming.Input.IGameController *game_controller, [out, retval] Windows.Gaming.Input.RawGameController **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        uuid(dcecc681-3963-4da6-955d-553f3b6f6161)
    ]
    interface IGameControllerBatteryInfo : IInspectable
    {
        HRESULT TryGetBatteryReport([out, retval] Windows.Devices.Power.BatteryReport **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 3.0),
        marshaling_behavior(agile),
        static(Windows.Gaming.Input.IArcadeStickStatics, Windows.Foundation.UniversalApiContract, 3.0),
        static(Windows.Gaming.Input.IArcadeStickStatics2, Windows.Foundation.UniversalApiContract, 4.0),
        threading(both)
    ]
    runtimeclass ArcadeStick
    {
        [default] interface Windows.Gaming.Input.IArcadeStick;
        interface Windows.Gaming.Input.IGameController;
        [contract(Windows.Foundation.UniversalApiContract, 4.0)] interface Windows.Gaming.Input.IGameControllerBatteryInfo;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        marshaling_behavior(agile),
        static(Windows.Gaming.Input.IFlightStickStatics, Windows.Foundation.UniversalApiContract, 4.0),
        threading(both)
    ]
    runtimeclass FlightStick
    {
        [default] interface Windows.Gaming.Input.IFlightStick;
        interface Windows.Gaming.Input.IGameController;
        interface Windows.Gaming.Input.IGameControllerBatteryInfo;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        static(Windows.Gaming.Input.IGamepadStatics, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.Gaming.Input.IGamepadStatics2, Windows.Foundation.UniversalApiContract, 4.0),
        threading(both)
    ]
    runtimeclass Gamepad
    {
        [default] interface Windows.Gaming.Input.IGamepad;
        interface Windows.Gaming.Input.IGameController;
        [contract(Windows.Foundation.UniversalApiContract, 3.0)] interface Windows.Gaming.Input.IGamepad2;
        [contract(Windows.Foundation.UniversalApiContract, 4.0)] interface Windows.Gaming.Input.IGameControllerBatteryInfo;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        threading(both)
    ]
    runtimeclass Headset
    {
        [default] interface Windows.Gaming.Input.IHeadset;
        [contract(Windows.Foundation.UniversalApiContract, 4.0)] interface Windows.Gaming.Input.IGameControllerBatteryInfo;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 3.0),
        marshaling_behavior(agile),
        static(Windows.Gaming.Input.IRacingWheelStatics, Windows.Foundation.UniversalApiContract, 3.0),
        static(Windows.Gaming.Input.IRacingWheelStatics2, Windows.Foundation.UniversalApiContract, 4.0),
        threading(both)
    ]
    runtimeclass RacingWheel
    {
        [default] interface Windows.Gaming.Input.IRacingWheel;
        interface Windows.Gaming.Input.IGameController;
        [contract(Windows.Foundation.UniversalApiContract, 4.0)] interface Windows.Gaming.Input.IGameControllerBatteryInfo;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        marshaling_behavior(agile),
        static(Windows.Gaming.Input.IRawGameControllerStatics, Windows.Foundation.UniversalApiContract, 4.0),
        threading(both)
    ]
    runtimeclass RawGameController
    {
        [default] interface Windows.Gaming.Input.IRawGameController;
        interface Windows.Gaming.Input.IGameController;
        interface Windows.Gaming.Input.IGameControllerBatteryInfo;
        [contract(Windows.Foundation.UniversalApiContract, 5.0)] interface Windows.Gaming.Input.IRawGameController2;
    }
}
