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

namespace Windows.System
{
    typedef enum DispatcherQueuePriority DispatcherQueuePriority;
    typedef enum ProcessorArchitecture ProcessorArchitecture;
    typedef enum VirtualKey VirtualKey;
    typedef enum VirtualKeyModifiers VirtualKeyModifiers;

    interface IDispatcherQueue;
    interface IDispatcherQueue2;
    interface IDispatcherQueueController;
    interface IDispatcherQueueControllerStatics;
    interface IDispatcherQueueShutdownStartingEventArgs;
    interface IDispatcherQueueStatics;
    interface IDispatcherQueueTimer;
    interface IUser;
    interface IUserStatics;
    interface IUserChangedEventArgs;
    interface IUserChangedEventArgs2;

    runtimeclass DispatcherQueue;
    runtimeclass DispatcherQueueController;
    runtimeclass DispatcherQueueShutdownStartingEventArgs;
    runtimeclass DispatcherQueueTimer;
    runtimeclass User;
    runtimeclass UserChangedEventArgs;

    declare
    {
        interface Windows.Foundation.TypedEventHandler<Windows.System.DispatcherQueue *, IInspectable *>;
        interface Windows.Foundation.TypedEventHandler<Windows.System.DispatcherQueue *, Windows.System.DispatcherQueueShutdownStartingEventArgs *>;
        interface Windows.Foundation.TypedEventHandler<Windows.System.DispatcherQueueTimer *, IInspectable *>;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0)
    ]
    enum DispatcherQueuePriority
    {
        Low    = -10,
        Normal = 0,
        High   = 10,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum ProcessorArchitecture
    {
        X86        = 0,
        Arm        = 5,
        X64        = 9,
        Neutral    = 11,
        [contract(Windows.Foundation.UniversalApiContract, 8.0)]
        Arm64      = 12,
        [contract(Windows.Foundation.UniversalApiContract, 8.0)]
        X86OnArm64 = 14,
        Unknown    = 65535
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum VirtualKey
    {
        None                         = 0,
        LeftButton                   = 1,
        RightButton                  = 2,
        Cancel                       = 3,
        MiddleButton                 = 4,
        XButton1                     = 5,
        XButton2                     = 6,
        Back                         = 8,
        Tab                          = 9,
        Clear                        = 12,
        Enter                        = 13,
        Shift                        = 16,
        Control                      = 17,
        Menu                         = 18,
        Pause                        = 19,
        CapitalLock                  = 20,
        Kana                         = 21,
        Hangul                       = 21,
        [contract(Windows.Foundation.UniversalApiContract, 10.0)]
        ImeOn                        = 22,
        Junja                        = 23,
        Final                        = 24,
        Hanja                        = 25,
        Kanji                        = 25,
        [contract(Windows.Foundation.UniversalApiContract, 10.0)]
        ImeOff                       = 26,
        Escape                       = 27,
        Convert                      = 28,
        NonConvert                   = 29,
        Accept                       = 30,
        ModeChange                   = 31,
        Space                        = 32,
        PageUp                       = 33,
        PageDown                     = 34,
        End                          = 35,
        Home                         = 36,
        Left                         = 37,
        Up                           = 38,
        Right                        = 39,
        Down                         = 40,
        Select                       = 41,
        Print                        = 42,
        Execute                      = 43,
        Snapshot                     = 44,
        Insert                       = 45,
        Delete                       = 46,
        Help                         = 47,
        Number0                      = 48,
        Number1                      = 49,
        Number2                      = 50,
        Number3                      = 51,
        Number4                      = 52,
        Number5                      = 53,
        Number6                      = 54,
        Number7                      = 55,
        Number8                      = 56,
        Number9                      = 57,
        A                            = 65,
        B                            = 66,
        C                            = 67,
        D                            = 68,
        E                            = 69,
        F                            = 70,
        G                            = 71,
        H                            = 72,
        I                            = 73,
        J                            = 74,
        K                            = 75,
        L                            = 76,
        M                            = 77,
        N                            = 78,
        O                            = 79,
        P                            = 80,
        Q                            = 81,
        R                            = 82,
        S                            = 83,
        T                            = 84,
        U                            = 85,
        V                            = 86,
        W                            = 87,
        X                            = 88,
        Y                            = 89,
        Z                            = 90,
        LeftWindows                  = 91,
        RightWindows                 = 92,
        Application                  = 93,
        Sleep                        = 95,
        NumberPad0                   = 96,
        NumberPad1                   = 97,
        NumberPad2                   = 98,
        NumberPad3                   = 99,
        NumberPad4                   = 100,
        NumberPad5                   = 101,
        NumberPad6                   = 102,
        NumberPad7                   = 103,
        NumberPad8                   = 104,
        NumberPad9                   = 105,
        Multiply                     = 106,
        Add                          = 107,
        Separator                    = 108,
        Subtract                     = 109,
        Decimal                      = 110,
        Divide                       = 111,
        F1                           = 112,
        F2                           = 113,
        F3                           = 114,
        F4                           = 115,
        F5                           = 116,
        F6                           = 117,
        F7                           = 118,
        F8                           = 119,
        F9                           = 120,
        F10                          = 121,
        F11                          = 122,
        F12                          = 123,
        F13                          = 124,
        F14                          = 125,
        F15                          = 126,
        F16                          = 127,
        F17                          = 128,
        F18                          = 129,
        F19                          = 130,
        F20                          = 131,
        F21                          = 132,
        F22                          = 133,
        F23                          = 134,
        F24                          = 135,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        NavigationView               = 136,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        NavigationMenu               = 137,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        NavigationUp                 = 138,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        NavigationDown               = 139,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        NavigationLeft               = 140,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        NavigationRight              = 141,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        NavigationAccept             = 142,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        NavigationCancel             = 143,
        NumberKeyLock                = 144,
        Scroll                       = 145,
        LeftShift                    = 160,
        RightShift                   = 161,
        LeftControl                  = 162,
        RightControl                 = 163,
        LeftMenu                     = 164,
        RightMenu                    = 165,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GoBack                       = 166,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GoForward                    = 167,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        Refresh                      = 168,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        Stop                         = 169,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        Search                       = 170,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        Favorites                    = 171,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GoHome                       = 172,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadA                     = 195,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadB                     = 196,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadX                     = 197,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadY                     = 198,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadRightShoulder         = 199,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadLeftShoulder          = 200,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadLeftTrigger           = 201,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadRightTrigger          = 202,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadDPadUp                = 203,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadDPadDown              = 204,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadDPadLeft              = 205,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadDPadRight             = 206,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadMenu                  = 207,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadView                  = 208,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadLeftThumbstickButton  = 209,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadRightThumbstickButton = 210,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadLeftThumbstickUp      = 211,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadLeftThumbstickDown    = 212,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadLeftThumbstickRight   = 213,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadLeftThumbstickLeft    = 214,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadRightThumbstickUp     = 215,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadRightThumbstickDown   = 216,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadRightThumbstickRight  = 217,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        GamepadRightThumbstickLeft   = 218
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        flags
    ]
    enum VirtualKeyModifiers
    {
        None    = 0x0,
        Control = 0x1,
        Menu    = 0x2,
        Shift   = 0x4,
        Windows = 0x8
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        uuid(dfa2dc9c-1a2d-4917-98f2-939af1d6e0c8)
    ]
    delegate HRESULT DispatcherQueueHandler();

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        exclusiveto(Windows.System.DispatcherQueue),
        uuid(603e88e4-a338-4ffe-a457-a5cfb9ceb899)
    ]
    interface IDispatcherQueue : IInspectable
    {
        HRESULT CreateTimer([out, retval] Windows.System.DispatcherQueueTimer **result);
        [overload("TryEnqueue")] HRESULT TryEnqueue([in] Windows.System.DispatcherQueueHandler *callback, [out, retval] boolean *result);
        [overload("TryEnqueue")] HRESULT TryEnqueueWithPriority([in] Windows.System.DispatcherQueuePriority priority, [in] Windows.System.DispatcherQueueHandler *callback,
                                                                [out, retval] boolean *result);
        [eventadd] HRESULT ShutdownStarting([in] Windows.Foundation.TypedEventHandler<Windows.System.DispatcherQueue *, Windows.System.DispatcherQueueShutdownStartingEventArgs *> *handler,
                                            [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT ShutdownStarting([in] EventRegistrationToken token);
        [eventadd] HRESULT ShutdownCompleted([in] Windows.Foundation.TypedEventHandler<Windows.System.DispatcherQueue *, IInspectable *> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT ShutdownCompleted([in] EventRegistrationToken token);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 8.0),
        exclusiveto(Windows.System.DispatcherQueue),
        uuid(c822c647-30ef-506e-bd1e-a647ae6675ff)
    ]
    interface IDispatcherQueue2 : IInspectable
    {
        [propget] HRESULT HasThreadAccess([out, retval] boolean *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        exclusiveto(Windows.System.DispatcherQueueController),
        uuid(22f34e66-50db-4e36-a98d-61c01b384d20)
    ]
    interface IDispatcherQueueController : IInspectable
    {
        [propget] HRESULT DispatcherQueue([out, retval] Windows.System.DispatcherQueue **value);
        HRESULT ShutdownQueueAsync([out, retval] Windows.Foundation.IAsyncAction **operation);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        exclusiveto(Windows.System.DispatcherQueueController),
        uuid(0a6c98e0-5198-49a2-a313-3f70d1f13c27)
    ]
    interface IDispatcherQueueControllerStatics : IInspectable
    {
        HRESULT CreateOnDedicatedThread([out, retval] Windows.System.DispatcherQueueController **result);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        exclusiveto(Windows.System.DispatcherQueueShutdownStartingEventArgs),
        uuid(c4724c4c-ff97-40c0-a226-cc0aaa545e89)
    ]
    interface IDispatcherQueueShutdownStartingEventArgs : IInspectable
    {
        HRESULT GetDeferral([out, retval] Windows.Foundation.Deferral **result);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        exclusiveto(Windows.System.DispatcherQueue),
        uuid(a96d83d7-9371-4517-9245-d0824ac12c74)
    ]
    interface IDispatcherQueueStatics : IInspectable
    {
        HRESULT GetForCurrentThread([out, retval] Windows.System.DispatcherQueue **result);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        exclusiveto(Windows.System.DispatcherQueueTimer),
        uuid(5feabb1d-a31c-4727-b1ac-37454649d56a)
    ]
    interface IDispatcherQueueTimer : IInspectable
    {
        [propget] HRESULT Interval([out, retval] Windows.Foundation.TimeSpan *value);
        [propput] HRESULT Interval([in] Windows.Foundation.TimeSpan value);
        [propget] HRESULT IsRunning([out, retval] boolean *value);
        [propget] HRESULT IsRepeating([out, retval] boolean *value);
        [propput] HRESULT IsRepeating([in] boolean value);
        HRESULT Start();
        HRESULT Stop();
        [eventadd] HRESULT Tick([in] Windows.Foundation.TypedEventHandler<Windows.System.DispatcherQueueTimer *, IInspectable *> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT Tick([in] EventRegistrationToken token);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.System.UserChangedEventArgs),
        uuid(086459dc-18c6-48db-bc99-724fb9203ccc)
    ]
    interface IUserChangedEventArgs : IInspectable
    {
        [propget] HRESULT User([out, retval] Windows.System.User **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        marshaling_behavior(agile),
        static(Windows.System.IDispatcherQueueStatics, Windows.Foundation.UniversalApiContract, 5.0),
        threading(both)
    ]
    runtimeclass DispatcherQueue
    {
        [default] interface Windows.System.IDispatcherQueue;
        [contract(Windows.Foundation.UniversalApiContract, 8.0)] interface Windows.System.IDispatcherQueue2;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        marshaling_behavior(agile),
        static(Windows.System.IDispatcherQueueControllerStatics, Windows.Foundation.UniversalApiContract, 5.0),
        threading(both)
    ]
    runtimeclass DispatcherQueueController
    {
        [default] interface Windows.System.IDispatcherQueueController;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        marshaling_behavior(agile)
    ]
    runtimeclass DispatcherQueueShutdownStartingEventArgs
    {
        [default] interface Windows.System.IDispatcherQueueShutdownStartingEventArgs;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        marshaling_behavior(agile)
    ]
    runtimeclass DispatcherQueueTimer
    {
        [default] interface Windows.System.IDispatcherQueueTimer;
    }

#ifndef _CORE_MESSAGING
    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        static(Windows.System.IUserStatics, Windows.Foundation.UniversalApiContract, 1.0),
        threading(both),
    ]
    runtimeclass User
    {
        [default] interface Windows.System.IUser;
    }
#endif

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile)
    ]
    runtimeclass UserChangedEventArgs
    {
        [default] interface Windows.System.IUserChangedEventArgs;
        [contract(Windows.Foundation.UniversalApiContract, 10.0)] interface Windows.System.IUserChangedEventArgs2;
    }
}
