/*
 * 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

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";

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;
    }
}
