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

#ifndef DO_NO_IMPORTS
import "inspectable.idl";
import "asyncinfo.idl";
import "eventtoken.idl";
import "windowscontracts.idl";
import "windows.foundation.idl";
import "windows.devices.enumeration.idl";
/* import "windows.phone.idl"; */
import "windows.ui.idl";
import "windows.ui.core.idl";
/* import "windows.ui.popups.idl"; */
import "windows.ui.windowmanagement.idl";
#endif

namespace Windows.UI.ViewManagement
{
    apicontract ViewManagementViewScalingContract;

    typedef enum ApplicationViewBoundsMode ApplicationViewBoundsMode;
    typedef enum ApplicationViewMode ApplicationViewMode;
    typedef enum ApplicationViewOrientation ApplicationViewOrientation;
    typedef enum ApplicationViewState ApplicationViewState;
    typedef enum ApplicationViewSwitchingOptions ApplicationViewSwitchingOptions;
    typedef enum ApplicationViewWindowingMode ApplicationViewWindowingMode;
    typedef enum FullScreenSystemOverlayMode FullScreenSystemOverlayMode;
    typedef enum HandPreference HandPreference;
    typedef enum UIColorType UIColorType;
    typedef enum UIElementType UIElementType;
    typedef enum UserInteractionMode UserInteractionMode;
    typedef enum ViewSizePreference ViewSizePreference;

    interface IAccessibilitySettings;
    interface IApplicationView;
    interface IApplicationView2;
    interface IApplicationView3;
    interface IApplicationView4;
    interface IApplicationView7;
    interface IApplicationView9;
    interface IApplicationViewConsolidatedEventArgs;
    interface IApplicationViewConsolidatedEventArgs2;
    interface IApplicationViewFullscreenStatics;
    interface IApplicationViewInteropStatics;
    interface IApplicationViewScaling;
    interface IApplicationViewScalingStatics;
    interface IApplicationViewStatics;
    interface IApplicationViewStatics2;
    interface IApplicationViewStatics3;
    interface IApplicationViewStatics4;
    interface IApplicationViewSwitcherStatics;
    interface IApplicationViewSwitcherStatics2;
    interface IApplicationViewSwitcherStatics3;
    interface IApplicationViewTitleBar;
    interface IApplicationViewTransferContext;
    interface IApplicationViewTransferContextStatics;
    interface IApplicationViewWithContext;

    interface IUISettings;
    interface IUISettings2;
    interface IUISettings3;
    interface IUISettings4;
    interface IUISettings5;
    interface IUISettings6;
    interface IUISettingsAnimationsEnabledChangedEventArgs;
    interface IUISettingsAutoHideScrollBarsChangedEventArgs;
    interface IUISettingsMessageDurationChangedEventArgs;

    interface IUIViewSettings;
    interface IUIViewSettingsStatics;
    interface IViewModePreferences;
    interface IViewModePreferencesStatics;

    interface IInputPane;
    interface IInputPane2;
    interface IInputPaneControl;
    interface IInputPaneVisibilityEventArgs;
    interface IInputPaneStatics;
    interface IInputPaneStatics2;

    runtimeclass AccessibilitySettings;
    runtimeclass ApplicationView;
    runtimeclass ApplicationViewConsolidatedEventArgs;
    runtimeclass ApplicationViewScaling;
    runtimeclass ApplicationViewSwitcher;
    runtimeclass ApplicationViewTitleBar;
    runtimeclass ApplicationViewTransferContext;
    runtimeclass UISettings;
    runtimeclass UISettingsAnimationsEnabledChangedEventArgs;
    runtimeclass UISettingsAutoHideScrollBarsChangedEventArgs;
    runtimeclass UISettingsMessageDurationChangedEventArgs;
    runtimeclass UIViewSettings;
    runtimeclass InputPane;
    runtimeclass InputPaneVisibilityEventArgs;
    runtimeclass ViewModePreferences;

    declare {
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.AccessibilitySettings *, IInspectable *>;
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.ApplicationView *, IInspectable *>;
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.ApplicationView *, Windows.UI.ViewManagement.ApplicationViewConsolidatedEventArgs *>;
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, IInspectable *>;
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, Windows.UI.ViewManagement.UISettingsAnimationsEnabledChangedEventArgs *>;
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, Windows.UI.ViewManagement.UISettingsAutoHideScrollBarsChangedEventArgs *>;
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, Windows.UI.ViewManagement.UISettingsMessageDurationChangedEventArgs *>;
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.InputPane*, Windows.UI.ViewManagement.InputPaneVisibilityEventArgs*>;
    }

    [
        contractversion(1.0)
    ]
    apicontract ViewManagementViewScalingContract
    {
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum ApplicationViewBoundsMode
    {
        UseVisible    = 0,
        UseCoreWindow = 1,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0)
    ]
    enum ApplicationViewMode
    {
        Default        = 0,
        CompactOverlay = 1,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum ApplicationViewOrientation
    {
        Landscape = 0,
        Portrait  = 1,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum ApplicationViewState
    {
        FullScreenLandscape = 0,
        Filled              = 1,
        Snapped             = 2,
        FullScreenPortrait  = 3,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        flags
    ]
    enum ApplicationViewSwitchingOptions
    {
        Default          = 0x0,
        SkipAnimation    = 0x1,
        ConsolidateViews = 0x2,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum ApplicationViewWindowingMode
    {
        Auto                    = 0,
        PreferredLaunchViewSize = 1,
        FullScreen              = 2,
        [
            contract(Windows.Foundation.UniversalApiContract, 7.0)
        ]
        CompactOverlay          = 3,
        [
            contract(Windows.Foundation.UniversalApiContract, 7.0)
        ]
        Maximized               = 4,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum FullScreenSystemOverlayMode
    {
        Standard = 0,
        Minimal  = 1,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum HandPreference
    {
        LeftHanded  = 0,
        RightHanded = 1,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum UIColorType
    {
        Background   = 0,
        Foreground   = 1,
        AccentDark3  = 2,
        AccentDark2  = 3,
        AccentDark1  = 4,
        Accent       = 5,
        AccentLight1 = 6,
        AccentLight2 = 7,
        AccentLight3 = 8,
        Complement   = 9,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum UIElementType
    {
        ActiveCaption        = 0,
        Background           = 1,
        ButtonFace           = 2,
        ButtonText           = 3,
        CaptionText          = 4,
        GrayText             = 5,
        Highlight            = 6,
        HighlightText        = 7,
        Hotlight             = 8,
        InactiveCaption      = 9,
        InactiveCaptionText  = 10,
        Window               = 11,
        WindowText           = 12,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        AccentColor          = 1000,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        TextHigh             = 1001,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        TextMedium           = 1002,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        TextLow              = 1003,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        TextContrastWithHigh = 1004,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        NonTextHigh          = 1005,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        NonTextMediumHigh    = 1006,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        NonTextMedium        = 1007,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        NonTextMediumLow     = 1008,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        NonTextLow           = 1009,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        PageBackground       = 1010,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        PopupBackground      = 1011,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        OverlayOutsidePopup  = 1012,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum UserInteractionMode
    {
        Mouse = 0,
        Touch = 1,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum ViewSizePreference
    {
        Default    = 0,
        UseLess    = 1,
        UseHalf    = 2,
        UseMore    = 3,
        UseMinimum = 4,
        UseNone    = 5,
        [
            contract(Windows.Foundation.UniversalApiContract, 4.0)
        ]
        Custom     = 6,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.AccessibilitySettings),
        uuid(fe0e8147-c4c0-4562-b962-1327b52ad5b9)
    ]
    interface IAccessibilitySettings : IInspectable
    {
        [propget] HRESULT HighContrast([out, retval] boolean *value);
        [propget] HRESULT HighContrastScheme([out, retval] HSTRING *value);
        [eventadd] HRESULT HighContrastChanged([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.AccessibilitySettings *, IInspectable *> *handler, [out, retval] EventRegistrationToken *cookie);
        [eventremove] HRESULT HighContrastChanged([in] EventRegistrationToken cookie);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(d222d519-4361-451e-96c4-60f4f9742db0)
    ]
    interface IApplicationView : IInspectable
    {
        [propget] HRESULT Orientation([out, retval] Windows.UI.ViewManagement.ApplicationViewOrientation *value);
        [propget] HRESULT AdjacentToLeftDisplayEdge([out, retval] boolean *value);
        [propget] HRESULT AdjacentToRightDisplayEdge([out, retval] boolean *value);
        [propget] HRESULT IsFullScreen([out, retval] boolean *value);
        [propget] HRESULT IsOnLockScreen([out, retval] boolean *value);
        [propget] HRESULT IsScreenCaptureEnabled([out, retval] boolean *value);
        [propput] HRESULT IsScreenCaptureEnabled([in] boolean value);
        [propput] HRESULT Title([in] HSTRING value);
        [propget] HRESULT Title([out, retval] HSTRING *value);
        [propget] HRESULT Id([out, retval] INT32 *value);
        [eventadd] HRESULT Consolidated([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.ApplicationView *, Windows.UI.ViewManagement.ApplicationViewConsolidatedEventArgs *> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT Consolidated([in] EventRegistrationToken token);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(e876b196-a545-40dc-b594-450cba68cc00)
    ]
    interface IApplicationView2 : IInspectable
    {
        [propget] HRESULT SuppressSystemOverlays([out, retval] boolean *value);
        [propput] HRESULT SuppressSystemOverlays([in] boolean value);
        [propget] HRESULT VisibleBounds([out, retval] Windows.Foundation.Rect *value);
        [eventadd] HRESULT VisibleBoundsChanged([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.ApplicationView *, IInspectable *> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT VisibleBoundsChanged([in] EventRegistrationToken token);
        HRESULT SetDesiredBoundsMode([in] Windows.UI.ViewManagement.ApplicationViewBoundsMode mode, [out, retval] boolean *success);
        [propget] HRESULT DesiredBoundsMode([out, retval] Windows.UI.ViewManagement.ApplicationViewBoundsMode *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(903c9ce5-793a-4fdf-a2b2-af1ac21e3108)
    ]
    interface IApplicationView3 : IInspectable
    {
        [propget] HRESULT TitleBar([out, retval] Windows.UI.ViewManagement.ApplicationViewTitleBar **value);
        [propget] HRESULT FullScreenSystemOverlayMode([out, retval] Windows.UI.ViewManagement.FullScreenSystemOverlayMode *value);
        [propput] HRESULT FullScreenSystemOverlayMode([in] Windows.UI.ViewManagement.FullScreenSystemOverlayMode value);
        [propget] HRESULT IsFullScreenMode([out, retval] boolean *value);
        HRESULT TryEnterFullScreenMode([out, retval] boolean *success);
        HRESULT ExitFullScreenMode();
        HRESULT ShowStandardSystemOverlays();
        HRESULT TryResizeView([in] Windows.Foundation.Size value, [out, retval] boolean *success);
        HRESULT SetPreferredMinSize([in] Windows.Foundation.Size size);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(15e5cbec-9e0f-46b5-bc3f-9bf653e74b5e)
    ]
    interface IApplicationView4 : IInspectable
    {
        [propget] HRESULT ViewMode([out, retval] Windows.UI.ViewManagement.ApplicationViewMode *value);
        HRESULT IsViewModeSupported([in] Windows.UI.ViewManagement.ApplicationViewMode mode, [out, retval] boolean *is_mode_supported);
        [overload("TryEnterViewModeAsync")] HRESULT TryEnterViewModeAsync([in] Windows.UI.ViewManagement.ApplicationViewMode mode, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
        [overload("TryEnterViewModeAsync")] HRESULT TryEnterViewModeWithPreferencesAsync([in] Windows.UI.ViewManagement.ApplicationViewMode mode, [in] Windows.UI.ViewManagement.ViewModePreferences *preferences, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
        HRESULT TryConsolidateAsync([out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 8.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(a0369647-5faf-5aa6-9c38-befbb12a071e)
    ]
    interface IApplicationView7 : IInspectable
    {
        [propget] HRESULT PersistedStateId([out, retval] HSTRING *value);
        [propput] HRESULT PersistedStateId([in] HSTRING value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 8.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(9c6516f9-021a-5f01-93e5-9bdad2647574)
    ]
    interface IApplicationView9 : IInspectable
    {
        [propget] HRESULT WindowingEnvironment([out, retval] Windows.UI.WindowManagement.WindowingEnvironment **value);
        HRESULT GetDisplayRegions([out, retval] Windows.Foundation.Collections.IVectorView<Windows.UI.WindowManagement.DisplayRegion *> **result);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewConsolidatedEventArgs),
        uuid(514449ec-7ea2-4de7-a6a6-7dfbaaebb6fb)
    ]
    interface IApplicationViewConsolidatedEventArgs : IInspectable
    {
        [propget] HRESULT IsUserInitiated([out, retval] boolean *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewConsolidatedEventArgs),
        uuid(1c199ecc-6dc1-40f4-afee-07d9ea296430)
    ]
    interface IApplicationViewConsolidatedEventArgs2 : IInspectable
    {
        [propget] HRESULT IsAppInitiated([out, retval] boolean *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(bc792ebd-64fe-4b65-a0c0-901ce2b68636)
    ]
    interface IApplicationViewFullscreenStatics : IInspectable
    {
        HRESULT TryUnsnapToFullscreen([out, retval] boolean *success);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(c446fb5d-4793-4896-a8e2-be57a8bb0f50)
    ]
    interface IApplicationViewInteropStatics : IInspectable
    {
        HRESULT GetApplicationViewIdForWindow([in] Windows.UI.Core.ICoreWindow *window, [out, retval] INT32 *id);
    }

    [
        contract(Windows.UI.ViewManagement.ViewManagementViewScalingContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewScaling),
        uuid(1d0ddc23-23f3-4b2d-84fe-74bf37b48b66)
    ]
    interface IApplicationViewScaling : IInspectable
    {
    }

    [
        contract(Windows.UI.ViewManagement.ViewManagementViewScalingContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewScaling),
        uuid(b08fecf0-b946-45c8-a5e3-71f5aa78f861)
    ]
    interface IApplicationViewScalingStatics : IInspectable
    {
        [propget] HRESULT DisableLayoutScaling([out, retval] boolean *value);
        HRESULT TrySetDisableLayoutScaling([in] boolean disabled, [out, retval] boolean *success);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(010a6306-c433-44e5-a9f2-bd84d4030a95)
    ]
    interface IApplicationViewStatics : IInspectable
    {
        [propget] HRESULT Value([out, retval] Windows.UI.ViewManagement.ApplicationViewState *value);
        HRESULT TryUnsnap([out, retval] boolean *success);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(af338ae5-cf64-423c-85e5-f3e72448fb23)
    ]
    interface IApplicationViewStatics2 : IInspectable
    {
        HRESULT GetForCurrentView([out, retval] Windows.UI.ViewManagement.ApplicationView **current);
        [propget] HRESULT TerminateAppOnFinalViewClose([out, retval] boolean *value);
        [propput] HRESULT TerminateAppOnFinalViewClose([in] boolean value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(a28d7594-8c41-4e13-9719-5164796fe4c7)
    ]
    interface IApplicationViewStatics3 : IInspectable
    {
        [propget] HRESULT PreferredLaunchWindowingMode([out, retval] Windows.UI.ViewManagement.ApplicationViewWindowingMode *value);
        [propput] HRESULT PreferredLaunchWindowingMode([in] Windows.UI.ViewManagement.ApplicationViewWindowingMode value);
        [propget] HRESULT PreferredLaunchViewSize([out, retval] Windows.Foundation.Size *value);
        [propput] HRESULT PreferredLaunchViewSize([in] Windows.Foundation.Size value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 8.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(08fd8d33-2611-5336-a315-d98e6366c9db)
    ]
    interface IApplicationViewStatics4 : IInspectable
    {
        HRESULT ClearAllPersistedState();
        HRESULT ClearPersistedState([in] HSTRING key);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewSwitcher),
        uuid(975f2f1e-e656-4c5e-a0a1-717c6ffa7d64)
    ]
    interface IApplicationViewSwitcherStatics : IInspectable
    {
        HRESULT DisableShowingMainViewOnActivation();
        [overload("TryShowAsStandaloneAsync")] HRESULT TryShowAsStandaloneAsync([in] INT32 view_id, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
        [overload("TryShowAsStandaloneAsync")] HRESULT TryShowAsStandaloneWithSizePreferenceAsync([in] INT32 view_id, [in] Windows.UI.ViewManagement.ViewSizePreference preference, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
        [overload("TryShowAsStandaloneAsync")] HRESULT TryShowAsStandaloneWithAnchorViewAndSizePreferenceAsync([in] INT32 view_id, [in] Windows.UI.ViewManagement.ViewSizePreference size_preference, [in] INT32 anchor_view_id, [in] Windows.UI.ViewManagement.ViewSizePreference anchor_size_preference, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
        [overload("SwitchAsync")] HRESULT SwitchAsync([in] INT32 view_id, [out, retval] Windows.Foundation.IAsyncAction **operation);
        [overload("SwitchAsync")] HRESULT SwitchFromViewAsync([in] INT32 to_view_id, [in] INT32 from_view_id, [out, retval] Windows.Foundation.IAsyncAction **operation);
        [overload("SwitchAsync")] HRESULT SwitchFromViewWithOptionsAsync([in] INT32 to_view_id, [in] INT32 from_view_id, [in] Windows.UI.ViewManagement.ApplicationViewSwitchingOptions options, [out, retval] Windows.Foundation.IAsyncAction **operation);
        HRESULT PrepareForCustomAnimatedSwitchAsync([in] INT32 to_view_id, [in] INT32 from_view_id, [in] Windows.UI.ViewManagement.ApplicationViewSwitchingOptions options, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewSwitcher),
        uuid(60e995cd-4fc2-48c4-b8e3-395f2b9f0fc1)
    ]
    interface IApplicationViewSwitcherStatics2 : IInspectable
    {
        HRESULT DisableSystemViewActivationPolicy();
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewSwitcher),
        uuid(92059420-80a7-486d-b21f-c7a4a242a383)
    ]
    interface IApplicationViewSwitcherStatics3 : IInspectable
    {
        [overload("TryShowAsViewModeAsync")] HRESULT TryShowAsViewModeAsync([in] INT32 view_id, [in] Windows.UI.ViewManagement.ApplicationViewMode mode, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
        [overload("TryShowAsViewModeAsync")] HRESULT TryShowAsViewModeWithPreferencesAsync([in] INT32 view_id, [in] Windows.UI.ViewManagement.ApplicationViewMode mode, [in] Windows.UI.ViewManagement.ViewModePreferences *preferences, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewTitleBar),
        uuid(00924ac0-932b-4a6b-9c4b-dc38c82478ce)
    ]
    interface IApplicationViewTitleBar : IInspectable
    {
        [propput] HRESULT ForegroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT ForegroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT BackgroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT BackgroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT ButtonForegroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT ButtonForegroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT ButtonBackgroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT ButtonBackgroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT ButtonHoverForegroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT ButtonHoverForegroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT ButtonHoverBackgroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT ButtonHoverBackgroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT ButtonPressedForegroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT ButtonPressedForegroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT ButtonPressedBackgroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT ButtonPressedBackgroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT InactiveForegroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT InactiveForegroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT InactiveBackgroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT InactiveBackgroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT ButtonInactiveForegroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT ButtonInactiveForegroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT ButtonInactiveBackgroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT ButtonInactiveBackgroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 2.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewTransferContext),
        uuid(8574bc63-3c17-408e-9408-8a1a9ea81bfa)
    ]
    interface IApplicationViewTransferContext : IInspectable
    {
        [propget] HRESULT ViewId([out, retval] INT32 *value);
        [propput] HRESULT ViewId([in] INT32 value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 2.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewTransferContext),
        uuid(15a89d92-dd79-4b0b-bc47-d5f195f14661)
    ]
    interface IApplicationViewTransferContextStatics : IInspectable
    {
        [propget] HRESULT DataPackageFormatId([out, retval] HSTRING *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 8.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(bd55d512-9dc1-44fc-8501-666625df60dc)
    ]
    interface IApplicationViewWithContext : IInspectable
    {
        [propget] HRESULT UIContext([out, retval] Windows.UI.UIContext **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.UISettings),
        uuid(85361600-1c63-4627-bcb1-3a89e0bc9c55)
    ]
    interface IUISettings : IInspectable
    {
        [propget] HRESULT HandPreference([out, retval] Windows.UI.ViewManagement.HandPreference *value);
        [propget] HRESULT CursorSize([out, retval] Windows.Foundation.Size *value);
        [propget] HRESULT ScrollBarSize([out, retval] Windows.Foundation.Size *value);
        [propget] HRESULT ScrollBarArrowSize([out, retval] Windows.Foundation.Size *value);
        [propget] HRESULT ScrollBarThumbBoxSize([out, retval] Windows.Foundation.Size *value);
        [propget] HRESULT MessageDuration([out, retval] UINT32 *value);
        [propget] HRESULT AnimationsEnabled([out, retval] boolean *value);
        [propget] HRESULT CaretBrowsingEnabled([out, retval] boolean *value);
        [propget] HRESULT CaretBlinkRate([out, retval] UINT32 *value);
        [propget] HRESULT CaretWidth([out, retval] UINT32 *value);
        [propget] HRESULT DoubleClickTime([out, retval] UINT32 *value);
        [propget] HRESULT MouseHoverTime([out, retval] UINT32 *value);
        HRESULT UIElementColor([in] Windows.UI.ViewManagement.UIElementType element, [out, retval] Windows.UI.Color *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.UISettings),
        uuid(bad82401-2721-44f9-bb91-2bb228be442f)
    ]
    interface IUISettings2 : IInspectable
    {
        [propget] HRESULT TextScaleFactor([out, retval] DOUBLE *value);
        [eventadd] HRESULT TextScaleFactorChanged([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, IInspectable *> *handler,
                                                  [out, retval] EventRegistrationToken *cookie);
        [eventremove] HRESULT TextScaleFactorChanged([in] EventRegistrationToken cookie);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.UISettings),
        uuid(03021be4-5254-4781-8194-5168f7d06d7b)
    ]
    interface IUISettings3 : IInspectable
    {
        HRESULT GetColorValue([in] Windows.UI.ViewManagement.UIColorType color, [out, retval] Windows.UI.Color *value);
        [eventadd] HRESULT ColorValuesChanged([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, IInspectable *> *handler,
                                              [out, retval] EventRegistrationToken *cookie);
        [eventremove] HRESULT ColorValuesChanged([in] EventRegistrationToken cookie);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.UI.ViewManagement.UISettings),
        uuid(52bb3002-919b-4d6b-9b78-8dd66ff4b93b)
    ]
    interface IUISettings4 : IInspectable
    {
        [propget] HRESULT AdvancedEffectsEnabled([out, retval] boolean *value);
        [eventadd] HRESULT AdvancedEffectsEnabledChanged(
            [in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, IInspectable *> *handler,
            [out, retval] EventRegistrationToken *cookie);
        [eventremove] HRESULT AdvancedEffectsEnabledChanged([in] EventRegistrationToken cookie);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 8.0),
        exclusiveto(Windows.UI.ViewManagement.UISettings),
        uuid(5349d588-0cb5-5f05-bd34-706b3231f0bd)
    ]
    interface IUISettings5 : IInspectable
    {
        [propget] HRESULT AutoHideScrollBars([out, retval] boolean *value);
        [eventadd] HRESULT AutoHideScrollBarsChanged(
            [in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, Windows.UI.ViewManagement.UISettingsAutoHideScrollBarsChangedEventArgs *> *handler,
            [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT AutoHideScrollBarsChanged([in] EventRegistrationToken token);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 10.0),
        exclusiveto(Windows.UI.ViewManagement.UISettings),
        uuid(aef19bd7-fe31-5a04-ada4-469aaec6dfa9)
    ]
    interface IUISettings6 : IInspectable
    {
        [eventadd] HRESULT AnimationsEnabledChanged(
            [in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, Windows.UI.ViewManagement.UISettingsAnimationsEnabledChangedEventArgs *> *handler,
            [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT AnimationsEnabledChanged([in] EventRegistrationToken token);
        [eventadd] HRESULT MessageDurationChanged(
            [in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, Windows.UI.ViewManagement.UISettingsMessageDurationChangedEventArgs *> *handler,
            [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT MessageDurationChanged([in] EventRegistrationToken token);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 10.0),
        exclusiveto(Windows.UI.ViewManagement.UISettingsAnimationsEnabledChangedEventArgs),
        uuid(0c7b4b3d-2ea1-533e-894d-415bc5243c29)
    ]
    interface IUISettingsAnimationsEnabledChangedEventArgs : IInspectable
    {
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 8.0),
        exclusiveto(Windows.UI.ViewManagement.UISettingsAutoHideScrollBarsChangedEventArgs),
        uuid(87afd4b2-9146-5f02-8f6b-06d454174c0f)
    ]
    interface IUISettingsAutoHideScrollBarsChangedEventArgs : IInspectable
    {
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 10.0),
        exclusiveto(Windows.UI.ViewManagement.UISettingsMessageDurationChangedEventArgs),
        uuid(338aad52-4a5d-5b59-8002-d930f608fd6e)
    ]
    interface IUISettingsMessageDurationChangedEventArgs : IInspectable
    {
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.UIViewSettings),
        uuid(c63657f6-8850-470d-88f8-455e16ea2c26)
    ]
    interface IUIViewSettings : IInspectable
    {
        [propget] HRESULT UserInteractionMode([out, retval] Windows.UI.ViewManagement.UserInteractionMode *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.UIViewSettings),
        uuid(595c97a5-f8f6-41cf-b0fb-aacdb81fd5f6)
    ]
    interface IUIViewSettingsStatics : IInspectable
    {
        HRESULT GetForCurrentView([out, retval] Windows.UI.ViewManagement.UIViewSettings **current);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.InputPane),
        uuid(640ada70-06f3-4c87-a678-9829c9127c28)
    ]
    interface IInputPane : IInspectable
    {
        [eventadd] HRESULT Showing([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.InputPane*, Windows.UI.ViewManagement.InputPaneVisibilityEventArgs*> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT Showing([in] EventRegistrationToken token);
        [eventadd] HRESULT Hiding([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.InputPane*, Windows.UI.ViewManagement.InputPaneVisibilityEventArgs*> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT Hiding([in] EventRegistrationToken token);
        [propget] HRESULT OccludedRect([out, retval] Windows.Foundation.Rect *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.InputPane),
        uuid(8a6b3f26-7090-4793-944c-c3f2cde26276)
    ]
    interface IInputPane2 : IInspectable
    {
        HRESULT TryShow([out, retval] boolean *result);
        HRESULT TryHide([out, retval] boolean *result);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.InputPane),
        uuid(088bb24f-962f-489d-aa6e-c6be1a0a6e52)
    ]
    interface IInputPaneControl : IInspectable
    {
        [propget] HRESULT Visible([out, retval] boolean *value);
        [propput] HRESULT Visible([in] boolean value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.InputPaneVisibilityEventArgs),
        uuid(d243e016-d907-4fcc-bb8d-f77baa5028f1)
    ]
    interface IInputPaneVisibilityEventArgs : IInspectable
    {
        [propget] HRESULT OccludedRect([out, retval] Windows.Foundation.Rect *value);
        [propput] HRESULT EnsuredFocusedElementInView([in] boolean value);
        [propget] HRESULT EnsuredFocusedElementInView([out, retval] boolean *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.InputPane),
        uuid(95f4af3a-ef47-424a-9741-fd2815eba2bd)
    ]
    interface IInputPaneStatics : IInspectable
    {
        HRESULT GetForCurrentView([out, retval] Windows.UI.ViewManagement.InputPane **input_pane);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 8.0),
        exclusiveto(Windows.UI.ViewManagement.InputPane),
        uuid(1b63529b-d9ec-4531-8445-71bab9fb828e)
    ]
    interface IInputPaneStatics2 : IInspectable
    {
        HRESULT GetForUIContext([in] Windows.UI.UIContext *context, [out, retval] Windows.UI.ViewManagement.InputPane **result);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.UI.ViewManagement.ViewModePreferences),
        uuid(878fcd3a-0b99-42c9-84d0-d3f1d403554b)
    ]
    interface IViewModePreferences : IInspectable
    {
        [propget] HRESULT ViewSizePreference([out, retval] Windows.UI.ViewManagement.ViewSizePreference *value);
        [propput] HRESULT ViewSizePreference([in] Windows.UI.ViewManagement.ViewSizePreference value);
        [propget] HRESULT CustomSize([out, retval] Windows.Foundation.Size *value);
        [propput] HRESULT CustomSize([in] Windows.Foundation.Size value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.UI.ViewManagement.ViewModePreferences),
        uuid(69b60a65-5de5-40d8-8306-3833df7a2274)
    ]
    interface IViewModePreferencesStatics : IInspectable
    {
        HRESULT CreateDefault([in] Windows.UI.ViewManagement.ApplicationViewMode mode, [out, retval] Windows.UI.ViewManagement.ViewModePreferences **result);
    }

    [
        activatable(Windows.Foundation.UniversalApiContract, 1.0),
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile)
    ]
    runtimeclass AccessibilitySettings
    {
        [default] interface Windows.UI.ViewManagement.IAccessibilitySettings;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        static(Windows.UI.ViewManagement.IApplicationViewFullscreenStatics, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.UI.ViewManagement.IApplicationViewInteropStatics, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.UI.ViewManagement.IApplicationViewStatics, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.UI.ViewManagement.IApplicationViewStatics2, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.UI.ViewManagement.IApplicationViewStatics3, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.UI.ViewManagement.IApplicationViewStatics4, Windows.Foundation.UniversalApiContract, 8.0),
        threading(both)
    ]
    runtimeclass ApplicationView
    {
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] [default] interface Windows.UI.ViewManagement.IApplicationView;
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.UI.ViewManagement.IApplicationView2;
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.UI.ViewManagement.IApplicationView3;
        [contract(Windows.Foundation.UniversalApiContract, 4.0)] interface Windows.UI.ViewManagement.IApplicationView4;
        [contract(Windows.Foundation.UniversalApiContract, 8.0)] interface Windows.UI.ViewManagement.IApplicationView7;
        [contract(Windows.Foundation.UniversalApiContract, 8.0)] interface Windows.UI.ViewManagement.IApplicationView9;
        [contract(Windows.Foundation.UniversalApiContract, 8.0)] interface Windows.UI.ViewManagement.IApplicationViewWithContext;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile)
    ]
    runtimeclass ApplicationViewConsolidatedEventArgs
    {
        [default] interface Windows.UI.ViewManagement.IApplicationViewConsolidatedEventArgs;
        [contract(Windows.Foundation.UniversalApiContract, 4.0)] interface Windows.UI.ViewManagement.IApplicationViewConsolidatedEventArgs2;
    }

    [
        contract(Windows.UI.ViewManagement.ViewManagementViewScalingContract, 1.0),
        static(Windows.UI.ViewManagement.IApplicationViewScalingStatics, Windows.UI.ViewManagement.ViewManagementViewScalingContract, 1.0)
    ]
    runtimeclass ApplicationViewScaling
    {
        [default] interface Windows.UI.ViewManagement.IApplicationViewScaling;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        static(Windows.UI.ViewManagement.IApplicationViewSwitcherStatics, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.UI.ViewManagement.IApplicationViewSwitcherStatics2, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.UI.ViewManagement.IApplicationViewSwitcherStatics3, Windows.Foundation.UniversalApiContract, 4.0),
        threading(both)
    ]
    runtimeclass ApplicationViewSwitcher
    {
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile)
    ]
    runtimeclass ApplicationViewTitleBar
    {
        [contract(Windows.Foundation.UniversalApiContract, 1.0), default] interface Windows.UI.ViewManagement.IApplicationViewTitleBar;
    }

    [
        activatable(Windows.Foundation.UniversalApiContract, 2.0),
        contract(Windows.Foundation.UniversalApiContract, 2.0),
        static(Windows.UI.ViewManagement.IApplicationViewTransferContextStatics, Windows.Foundation.UniversalApiContract, 2.0)
    ]
    runtimeclass ApplicationViewTransferContext
    {
        [contract(Windows.Foundation.UniversalApiContract, 2.0), default] interface Windows.UI.ViewManagement.IApplicationViewTransferContext;
    }

    [
        activatable(Windows.Foundation.UniversalApiContract, 1.0),
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile)
    ]
    runtimeclass UISettings
    {
        [default] interface Windows.UI.ViewManagement.IUISettings;
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.UI.ViewManagement.IUISettings2;
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.UI.ViewManagement.IUISettings3;
        [contract(Windows.Foundation.UniversalApiContract, 4.0)] interface Windows.UI.ViewManagement.IUISettings4;
        [contract(Windows.Foundation.UniversalApiContract, 8.0)] interface Windows.UI.ViewManagement.IUISettings5;
        [contract(Windows.Foundation.UniversalApiContract, 10.0)] interface Windows.UI.ViewManagement.IUISettings6;
    }

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

    [
        contract(Windows.Foundation.UniversalApiContract, 8.0),
        marshaling_behavior(agile)
    ]
    runtimeclass UISettingsAutoHideScrollBarsChangedEventArgs
    {
        [default] interface Windows.UI.ViewManagement.IUISettingsAutoHideScrollBarsChangedEventArgs;
    }

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

    [
        static(Windows.UI.ViewManagement.IUIViewSettingsStatics, Windows.Foundation.UniversalApiContract, 1.0),
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile)
    ]
    runtimeclass UIViewSettings
    {
        [default] interface Windows.UI.ViewManagement.IUIViewSettings;
    }

    [
        static(Windows.UI.ViewManagement.IInputPaneStatics, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.UI.ViewManagement.IInputPaneStatics2, Windows.Foundation.UniversalApiContract, 8.0),
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(standard)
    ]
    runtimeclass InputPane
    {
        [default] interface Windows.UI.ViewManagement.IInputPane;
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.UI.ViewManagement.IInputPane2;
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.UI.ViewManagement.IInputPaneControl;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(standard)
    ]
    runtimeclass InputPaneVisibilityEventArgs
    {
        [default] interface Windows.UI.ViewManagement.IInputPaneVisibilityEventArgs;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        static(Windows.UI.ViewManagement.IViewModePreferencesStatics, Windows.Foundation.UniversalApiContract, 4.0)
    ]
    runtimeclass ViewModePreferences
    {
        [contract(Windows.Foundation.UniversalApiContract, 4.0), default] interface Windows.UI.ViewManagement.IViewModePreferences;
    }
}
