< Summary

Class:Imagini.WindowStateChangeEventArgs
Assembly:Imagini.Core
File(s):/home/razer/vscode-projects/project-grove/imagini/Imagini.Core/Events.Types.cs
Covered lines:11
Uncovered lines:9
Coverable lines:20
Total lines:1453
Line coverage:55% (11 of 20)
Covered branches:4
Total branches:4
Branch coverage:100% (4 of 4)

Metrics

MethodCyclomatic complexity NPath complexity Sequence coverage Branch coverage
.ctor(...)2033.33%100%
.ctor(...)20100%100%
AsEvent()100%100%

File(s)

/home/razer/vscode-projects/project-grove/imagini/Imagini.Core/Events.Types.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Runtime.InteropServices;
 5using System.Text;
 6
 7using SDL2;
 8using static SDL2.SDL_events;
 9using static SDL2.SDL_joystick;
 10using static SDL2.SDL_keyboard;
 11using static SDL2.SDL_keycode;
 12using static SDL2.SDL_scancode;
 13
 14namespace Imagini
 15{
 16    /// <summary>
 17    /// Describes event args shared by all available event types.
 18    /// </summary>
 19    public abstract class CommonEventArgs : EventArgs
 20    {
 21        public long Timestamp { get; internal set; }
 22        internal CommonEventArgs() => Timestamp = AppBase.TotalTime;
 23        internal unsafe CommonEventArgs(SDL_CommonEvent e) => Timestamp = e.timestamp;
 24        internal abstract SDL_Event AsEvent();
 25    }
 26
 27    /* Window events */
 28    /// <summary>
 29    /// Describes various window state modifications.
 30    /// </summary>
 31    /// <seealso cref="WindowStateChangeEventArgs" />
 32    /// <seealso cref="Events.WindowEvents" />
 33    public enum WindowStateChange
 34    {
 35        None,
 36        Shown,
 37        Hidden,
 38        Exposed,
 39        Moved,
 40        Resized,
 41        SizeChanged,
 42        Minimized,
 43        Maximized,
 44        Restored,
 45        MouseEnter,
 46        MouseLeave,
 47        FocusGained,
 48        FocusLost,
 49        Closed
 50    }
 51
 52    /// <summary>
 53    /// Describes window state change event data.
 54    /// </summary>
 55    /// <seealso cref="Events.WindowEvents" />
 56    public sealed class WindowStateChangeEventArgs : CommonEventArgs
 57    {
 58        /// <summary>
 59        /// The window for which the event was fired.
 60        /// </summary>
 6961        public Window Window { get; private set; }
 62        /// <summary>
 63        /// Target window state.
 64        /// </summary>
 16365        public WindowStateChange State { get; private set; }
 66        /// <summary>
 67        /// Contains X coordinate or horizontal size if the window was moved, resized or it's size have changed.
 68        /// </summary>
 2269        public int? X { get; private set; }
 70        /// <summary>
 71        /// Contains Y coordinate or vertical size if the window was moved, resized or it's size have changed.
 72        /// </summary>
 2073        public int? Y { get; private set; }
 74
 75        /// <summary>
 76        /// Creates an event args object.
 77        /// </summary>
 78        /// <param name="window">Target window. If null, the currently focused one is used.</param>
 79        public WindowStateChangeEventArgs(WindowStateChange state,
 180            Window window = null, int? x = null, int? y = null) : base()
 81            =>
 082            (this.Window, this.State, this.X, this.Y) =
 083            (window ?? Window.Current, state, x, y);
 84
 85        internal WindowStateChangeEventArgs(SDL_WindowEvent e)
 5186            : base(e)
 87        {
 5188            State = (WindowStateChange)e.@event;
 5189            Window = Window.GetByID(e.windowID);
 5190            switch (State)
 91            {
 92                case WindowStateChange.Moved:
 93                case WindowStateChange.Resized:
 94                case WindowStateChange.SizeChanged:
 3295                    X = e.data1; Y = e.data2; break;
 96            }
 5197        }
 98
 99        internal override SDL_Event AsEvent() =>
 0100            new SDL_WindowEvent()
 0101            {
 0102                type = (uint)SDL_EventType.SDL_WINDOWEVENT,
 0103                windowID = Window.ID,
 0104                data1 = X ?? 0,
 0105                data2 = Y ?? 0
 0106            };
 107    }
 108
 109    /* Keyboard events */
 110    /// <summary>
 111    /// Keyboard scancode.
 112    /// </summary>
 113    public enum Scancode // renamed SDL_Scancode
 114    {
 115
 116        UNKNOWN = 0,
 117        A = 4,
 118        B = 5,
 119        C = 6,
 120        D = 7,
 121        E = 8,
 122        F = 9,
 123        G = 10,
 124        H = 11,
 125        I = 12,
 126        J = 13,
 127        K = 14,
 128        L = 15,
 129        M = 16,
 130        N = 17,
 131        O = 18,
 132        P = 19,
 133        Q = 20,
 134        R = 21,
 135        S = 22,
 136        T = 23,
 137        U = 24,
 138        V = 25,
 139        W = 26,
 140        X = 27,
 141        Y = 28,
 142        Z = 29,
 143        NUMBER_1 = 30,
 144        NUMBER_2 = 31,
 145        NUMBER_3 = 32,
 146        NUMBER_4 = 33,
 147        NUMBER_5 = 34,
 148        NUMBER_6 = 35,
 149        NUMBER_7 = 36,
 150        NUMBER_8 = 37,
 151        NUMBER_9 = 38,
 152        NUMBER_0 = 39,
 153
 154        RETURN = 40,
 155        ESCAPE = 41,
 156        BACKSPACE = 42,
 157        TAB = 43,
 158        SPACE = 44,
 159        MINUS = 45,
 160        EQUALS = 46,
 161        LEFTBRACKET = 47,
 162        RIGHTBRACKET = 48,
 163        BACKSLASH = 49,
 164        NONUSHASH = 50,
 165        SEMICOLON = 51,
 166        APOSTROPHE = 52,
 167        GRAVE = 53,
 168        COMMA = 54,
 169        PERIOD = 55,
 170        SLASH = 56,
 171        CAPSLOCK = 57,
 172        F1 = 58,
 173        F2 = 59,
 174        F3 = 60,
 175        F4 = 61,
 176        F5 = 62,
 177        F6 = 63,
 178        F7 = 64,
 179        F8 = 65,
 180        F9 = 66,
 181        F10 = 67,
 182        F11 = 68,
 183        F12 = 69,
 184        PRINTSCREEN = 70,
 185        SCROLLLOCK = 71,
 186        PAUSE = 72,
 187        INSERT = 73,
 188        HOME = 74,
 189        PAGEUP = 75,
 190        DELETE = 76,
 191        END = 77,
 192        PAGEDOWN = 78,
 193        RIGHT = 79,
 194        LEFT = 80,
 195        DOWN = 81,
 196        UP = 82,
 197        NUMLOCKCLEAR = 83,
 198        KP_DIVIDE = 84,
 199        KP_MULTIPLY = 85,
 200        KP_MINUS = 86,
 201        KP_PLUS = 87,
 202        KP_ENTER = 88,
 203        KP_1 = 89,
 204        KP_2 = 90,
 205        KP_3 = 91,
 206        KP_4 = 92,
 207        KP_5 = 93,
 208        KP_6 = 94,
 209        KP_7 = 95,
 210        KP_8 = 96,
 211        KP_9 = 97,
 212        KP_0 = 98,
 213        KP_PERIOD = 99,
 214        NONUSBACKSLASH = 100,
 215        APPLICATION = 101,
 216        POWER = 102,
 217        KP_EQUALS = 103,
 218        F13 = 104,
 219        F14 = 105,
 220        F15 = 106,
 221        F16 = 107,
 222        F17 = 108,
 223        F18 = 109,
 224        F19 = 110,
 225        F20 = 111,
 226        F21 = 112,
 227        F22 = 113,
 228        F23 = 114,
 229        F24 = 115,
 230        EXECUTE = 116,
 231        HELP = 117,
 232        MENU = 118,
 233        SELECT = 119,
 234        STOP = 120,
 235        AGAIN = 121,
 236        UNDO = 122,
 237        CUT = 123,
 238        COPY = 124,
 239        PASTE = 125,
 240        FIND = 126,
 241        MUTE = 127,
 242        VOLUMEUP = 128,
 243        VOLUMEDOWN = 129,
 244        KP_COMMA = 133,
 245        KP_EQUALSAS400 = 134,
 246        INTERNATIONAL1 = 135,
 247        INTERNATIONAL2 = 136,
 248        INTERNATIONAL3 = 137,
 249        INTERNATIONAL4 = 138,
 250        INTERNATIONAL5 = 139,
 251        INTERNATIONAL6 = 140,
 252        INTERNATIONAL7 = 141,
 253        INTERNATIONAL8 = 142,
 254        INTERNATIONAL9 = 143,
 255        LANG1 = 144,
 256        LANG2 = 145,
 257        LANG3 = 146,
 258        LANG4 = 147,
 259        LANG5 = 148,
 260        LANG6 = 149,
 261        LANG7 = 150,
 262        LANG8 = 151,
 263        LANG9 = 152,
 264        ALTERASE = 153,
 265        SYSREQ = 154,
 266        CANCEL = 155,
 267        CLEAR = 156,
 268        PRIOR = 157,
 269        RETURN2 = 158,
 270        SEPARATOR = 159,
 271        OUT = 160,
 272        OPER = 161,
 273        CLEARAGAIN = 162,
 274        CRSEL = 163,
 275        EXSEL = 164,
 276        KP_00 = 176,
 277        KP_000 = 177,
 278        THOUSANDSSEPARATOR = 178,
 279        DECIMALSEPARATOR = 179,
 280        CURRENCYUNIT = 180,
 281        CURRENCYSUBUNIT = 181,
 282        KP_LEFTPAREN = 182,
 283        KP_RIGHTPAREN = 183,
 284        KP_LEFTBRACE = 184,
 285        KP_RIGHTBRACE = 185,
 286        KP_TAB = 186,
 287        KP_BACKSPACE = 187,
 288        KP_A = 188,
 289        KP_B = 189,
 290        KP_C = 190,
 291        KP_D = 191,
 292        KP_E = 192,
 293        KP_F = 193,
 294        KP_XOR = 194,
 295        KP_POWER = 195,
 296        KP_PERCENT = 196,
 297        KP_LESS = 197,
 298        KP_GREATER = 198,
 299        KP_AMPERSAND = 199,
 300        KP_DBLAMPERSAND = 200,
 301        KP_VERTICALBAR = 201,
 302        KP_DBLVERTICALBAR = 202,
 303        KP_COLON = 203,
 304        KP_HASH = 204,
 305        KP_SPACE = 205,
 306        KP_AT = 206,
 307        KP_EXCLAM = 207,
 308        KP_MEMSTORE = 208,
 309        KP_MEMRECALL = 209,
 310        KP_MEMCLEAR = 210,
 311        KP_MEMADD = 211,
 312        KP_MEMSUBTRACT = 212,
 313        KP_MEMMULTIPLY = 213,
 314        KP_MEMDIVIDE = 214,
 315        KP_PLUSMINUS = 215,
 316        KP_CLEAR = 216,
 317        KP_CLEARENTRY = 217,
 318        KP_BINARY = 218,
 319        KP_OCTAL = 219,
 320        KP_DECIMAL = 220,
 321        KP_HEXADECIMAL = 221,
 322        LCTRL = 224,
 323        LSHIFT = 225,
 324        LALT = 226,
 325        LGUI = 227,
 326        RCTRL = 228,
 327        RSHIFT = 229,
 328        RALT = 230,
 329        RGUI = 231,
 330        MODE = 257,
 331        AUDIONEXT = 258,
 332        AUDIOPREV = 259,
 333        AUDIOSTOP = 260,
 334        AUDIOPLAY = 261,
 335        AUDIOMUTE = 262,
 336        MEDIASELECT = 263,
 337        WWW = 264,
 338        MAIL = 265,
 339        CALCULATOR = 266,
 340        COMPUTER = 267,
 341        AC_SEARCH = 268,
 342        AC_HOME = 269,
 343        AC_BACK = 270,
 344        AC_FORWARD = 271,
 345        AC_STOP = 272,
 346        AC_REFRESH = 273,
 347        AC_BOOKMARKS = 274,
 348        BRIGHTNESSDOWN = 275,
 349        BRIGHTNESSUP = 276,
 350        DISPLAYSWITCH = 277,
 351        KBDILLUMTOGGLE = 278,
 352        KBDILLUMDOWN = 279,
 353        KBDILLUMUP = 280,
 354        EJECT = 281,
 355        SLEEP = 282,
 356        APP1 = 283,
 357        APP2 = 284,
 358    }
 359
 360    /// <summary>
 361    /// Keyboard virtual key.
 362    /// </summary>
 363    public enum Keycode
 364    {
 365        UNKNOWN = 0,
 366        BACKSPACE = 8,
 367        TAB = 9,
 368        RETURN = 13,
 369        ESCAPE = 27,
 370        SPACE = 32,
 371        EXCLAIM = 33,
 372        QUOTEDBL = 34,
 373        HASH = 35,
 374        DOLLAR = 36,
 375        PERCENT = 37,
 376        AMPERSAND = 38,
 377        QUOTE = 39,
 378        LEFTPAREN = 40,
 379        RIGHTPAREN = 41,
 380        ASTERISK = 42,
 381        PLUS = 43,
 382        COMMA = 44,
 383        MINUS = 45,
 384        PERIOD = 46,
 385        SLASH = 47,
 386        NUMBER_0 = 48,
 387        NUMBER_1 = 49,
 388        NUMBER_2 = 50,
 389        NUMBER_3 = 51,
 390        NUMBER_4 = 52,
 391        NUMBER_5 = 53,
 392        NUMBER_6 = 54,
 393        NUMBER_7 = 55,
 394        NUMBER_8 = 56,
 395        NUMBER_9 = 57,
 396        COLON = 58,
 397        SEMICOLON = 59,
 398        LESS = 60,
 399        EQUALS = 61,
 400        GREATER = 62,
 401        QUESTION = 63,
 402        AT = 64,
 403        LEFTBRACKET = 91,
 404        BACKSLASH = 92,
 405        RIGHTBRACKET = 93,
 406        CARET = 94,
 407        UNDERSCORE = 95,
 408        BACKQUOTE = 96,
 409        a = 97,
 410        b = 98,
 411        c = 99,
 412        d = 100,
 413        e = 101,
 414        f = 102,
 415        g = 103,
 416        h = 104,
 417        i = 105,
 418        j = 106,
 419        k = 107,
 420        l = 108,
 421        m = 109,
 422        n = 110,
 423        o = 111,
 424        p = 112,
 425        q = 113,
 426        r = 114,
 427        s = 115,
 428        t = 116,
 429        u = 117,
 430        v = 118,
 431        w = 119,
 432        x = 120,
 433        y = 121,
 434        z = 122,
 435        DELETE = 127,
 436        CAPSLOCK = 1073741881,
 437        F1 = 1073741882,
 438        F2 = 1073741883,
 439        F3 = 1073741884,
 440        F4 = 1073741885,
 441        F5 = 1073741886,
 442        F6 = 1073741887,
 443        F7 = 1073741888,
 444        F8 = 1073741889,
 445        F9 = 1073741890,
 446        F10 = 1073741891,
 447        F11 = 1073741892,
 448        F12 = 1073741893,
 449        PRINTSCREEN = 1073741894,
 450        SCROLLLOCK = 1073741895,
 451        PAUSE = 1073741896,
 452        INSERT = 1073741897,
 453        HOME = 1073741898,
 454        PAGEUP = 1073741899,
 455        END = 1073741901,
 456        PAGEDOWN = 1073741902,
 457        RIGHT = 1073741903,
 458        LEFT = 1073741904,
 459        DOWN = 1073741905,
 460        UP = 1073741906,
 461        NUMLOCKCLEAR = 1073741907,
 462        KP_DIVIDE = 1073741908,
 463        KP_MULTIPLY = 1073741909,
 464        KP_MINUS = 1073741910,
 465        KP_PLUS = 1073741911,
 466        KP_ENTER = 1073741912,
 467        KP_1 = 1073741913,
 468        KP_2 = 1073741914,
 469        KP_3 = 1073741915,
 470        KP_4 = 1073741916,
 471        KP_5 = 1073741917,
 472        KP_6 = 1073741918,
 473        KP_7 = 1073741919,
 474        KP_8 = 1073741920,
 475        KP_9 = 1073741921,
 476        KP_0 = 1073741922,
 477        KP_PERIOD = 1073741923,
 478        APPLICATION = 1073741925,
 479        POWER = 1073741926,
 480        KP_EQUALS = 1073741927,
 481        F13 = 1073741928,
 482        F14 = 1073741929,
 483        F15 = 1073741930,
 484        F16 = 1073741931,
 485        F17 = 1073741932,
 486        F18 = 1073741933,
 487        F19 = 1073741934,
 488        F20 = 1073741935,
 489        F21 = 1073741936,
 490        F22 = 1073741937,
 491        F23 = 1073741938,
 492        F24 = 1073741939,
 493        EXECUTE = 1073741940,
 494        HELP = 1073741941,
 495        MENU = 1073741942,
 496        SELECT = 1073741943,
 497        STOP = 1073741944,
 498        AGAIN = 1073741945,
 499        UNDO = 1073741946,
 500        CUT = 1073741947,
 501        COPY = 1073741948,
 502        PASTE = 1073741949,
 503        FIND = 1073741950,
 504        MUTE = 1073741951,
 505        VOLUMEUP = 1073741952,
 506        VOLUMEDOWN = 1073741953,
 507        KP_COMMA = 1073741957,
 508        KP_EQUALSAS400 = 1073741958,
 509        ALTERASE = 1073741977,
 510        SYSREQ = 1073741978,
 511        CANCEL = 1073741979,
 512        CLEAR = 1073741980,
 513        PRIOR = 1073741981,
 514        RETURN2 = 1073741982,
 515        SEPARATOR = 1073741983,
 516        OUT = 1073741984,
 517        OPER = 1073741985,
 518        CLEARAGAIN = 1073741986,
 519        CRSEL = 1073741987,
 520        EXSEL = 1073741988,
 521        KP_00 = 1073742000,
 522        KP_000 = 1073742001,
 523        THOUSANDSSEPARATOR = 1073742002,
 524        DECIMALSEPARATOR = 1073742003,
 525        CURRENCYUNIT = 1073742004,
 526        CURRENCYSUBUNIT = 1073742005,
 527        KP_LEFTPAREN = 1073742006,
 528        KP_RIGHTPAREN = 1073742007,
 529        KP_LEFTBRACE = 1073742008,
 530        KP_RIGHTBRACE = 1073742009,
 531        KP_TAB = 1073742010,
 532        KP_BACKSPACE = 1073742011,
 533        KP_A = 1073742012,
 534        KP_B = 1073742013,
 535        KP_C = 1073742014,
 536        KP_D = 1073742015,
 537        KP_E = 1073742016,
 538        KP_F = 1073742017,
 539        KP_XOR = 1073742018,
 540        KP_POWER = 1073742019,
 541        KP_PERCENT = 1073742020,
 542        KP_LESS = 1073742021,
 543        KP_GREATER = 1073742022,
 544        KP_AMPERSAND = 1073742023,
 545        KP_DBLAMPERSAND = 1073742024,
 546        KP_VERTICALBAR = 1073742025,
 547        KP_DBLVERTICALBAR = 1073742026,
 548        KP_COLON = 1073742027,
 549        KP_HASH = 1073742028,
 550        KP_SPACE = 1073742029,
 551        KP_AT = 1073742030,
 552        KP_EXCLAM = 1073742031,
 553        KP_MEMSTORE = 1073742032,
 554        KP_MEMRECALL = 1073742033,
 555        KP_MEMCLEAR = 1073742034,
 556        KP_MEMADD = 1073742035,
 557        KP_MEMSUBTRACT = 1073742036,
 558        KP_MEMMULTIPLY = 1073742037,
 559        KP_MEMDIVIDE = 1073742038,
 560        KP_PLUSMINUS = 1073742039,
 561        KP_CLEAR = 1073742040,
 562        KP_CLEARENTRY = 1073742041,
 563        KP_BINARY = 1073742042,
 564        KP_OCTAL = 1073742043,
 565        KP_DECIMAL = 1073742044,
 566        KP_HEXADECIMAL = 1073742045,
 567        LCTRL = 1073742048,
 568        LSHIFT = 1073742049,
 569        LALT = 1073742050,
 570        LGUI = 1073742051,
 571        RCTRL = 1073742052,
 572        RSHIFT = 1073742053,
 573        RALT = 1073742054,
 574        RGUI = 1073742055,
 575        MODE = 1073742081,
 576        AUDIONEXT = 1073742082,
 577        AUDIOPREV = 1073742083,
 578        AUDIOSTOP = 1073742084,
 579        AUDIOPLAY = 1073742085,
 580        AUDIOMUTE = 1073742086,
 581        MEDIASELECT = 1073742087,
 582        WWW = 1073742088,
 583        MAIL = 1073742089,
 584        CALCULATOR = 1073742090,
 585        COMPUTER = 1073742091,
 586        AC_SEARCH = 1073742092,
 587        AC_HOME = 1073742093,
 588        AC_BACK = 1073742094,
 589        AC_FORWARD = 1073742095,
 590        AC_STOP = 1073742096,
 591        AC_REFRESH = 1073742097,
 592        AC_BOOKMARKS = 1073742098,
 593        BRIGHTNESSDOWN = 1073742099,
 594        BRIGHTNESSUP = 1073742100,
 595        DISPLAYSWITCH = 1073742101,
 596        KBDILLUMTOGGLE = 1073742102,
 597        KBDILLUMDOWN = 1073742103,
 598        KBDILLUMUP = 1073742104,
 599        EJECT = 1073742105,
 600        SLEEP = 1073742106
 601    }
 602
 603    [Flags]
 604    /// <summary>
 605    /// Keyboard key modifiers.
 606    /// </summary>
 607    public enum KeyModifier
 608    {
 609        NONE = 0x0000,
 610        LSHIFT = 0x0001,
 611        RSHIFT = 0x0002,
 612        LCTRL = 0x0040,
 613        RCTRL = 0x0080,
 614        LALT = 0x0100,
 615        RALT = 0x0200,
 616        LGUI = 0x0400,
 617        RGUI = 0x0800,
 618        NUM = 0x1000,
 619        CAPS = 0x2000,
 620        MODE = 0x4000,
 621        RESERVED = 0x8000
 622    }
 623
 624    /// <summary>
 625    /// Represents a keyboard key.
 626    /// </summary>
 627    public struct KeyboardKey
 628    {
 629        public Scancode Scancode;
 630        public Keycode Keycode;
 631        public KeyModifier Modifiers;
 632
 633        internal KeyboardKey(SDL_KeyboardEvent e)
 634        {
 635            Scancode = (Scancode)(int)e.keysym.scancode;
 636            Keycode = (Keycode)(int)e.keysym.sym;
 637            Modifiers = (KeyModifier)(int)e.keysym.mod;
 638        }
 639
 640        internal SDL_Keysym AsKeysym()
 641        {
 642            return new SDL_Keysym()
 643            {
 644                scancode = (SDL_Scancode)(int)Scancode,
 645                sym = (SDL_Keycode)(int)Keycode,
 646                mod = (ushort)Modifiers
 647            };
 648        }
 649    }
 650
 651    /// <summary>
 652    /// Describes keyboard event data.
 653    /// </summary>
 654    public sealed class KeyboardEventArgs : CommonEventArgs
 655    {
 656        /// <summary>
 657        /// Target window.
 658        /// </summary>
 659        public Window Window { get; private set; }
 660        /// <summary>
 661        /// Returns the pressed or released key.
 662        /// </summary>
 663        public KeyboardKey Key { get; private set; }
 664        /// <summary>
 665        /// Defines if the key is pressed or released.
 666        /// </summary>
 667        public bool IsPressed { get; private set; }
 668        /// <summary>
 669        /// Defines if this is a key repeat
 670        /// </summary>
 671        public bool IsRepeat { get; private set; }
 672        /// <summary>
 673        /// Creates a new event args object.
 674        /// </summary>
 675        /// <param name="window">Target window. If null, the currently focused one is used.</param>
 676        public KeyboardEventArgs(KeyboardKey key, bool isPressed,
 677            Window window = null, bool isRepeat = false) : base()
 678            =>
 679            (this.Window, this.Key, this.IsPressed, this.IsRepeat) =
 680            (window ?? Window.Current, key, isPressed, isRepeat);
 681
 682        internal KeyboardEventArgs(SDL_KeyboardEvent e)
 683            : base(e)
 684        {
 685            Window = Window.GetByID(e.windowID);
 686            Key = new KeyboardKey(e);
 687            IsPressed = e.state > 0;
 688            IsRepeat = e.repeat > 0;
 689        }
 690
 691        internal override SDL_Event AsEvent() =>
 692            new SDL_KeyboardEvent()
 693            {
 694                type = (uint)(IsPressed ? SDL_EventType.SDL_KEYDOWN : SDL_EventType.SDL_KEYUP),
 695                timestamp = (uint)Timestamp,
 696                windowID = Window.ID,
 697                state = IsPressed ? (byte)1 : (byte)0,
 698                repeat = IsRepeat ? (byte)1 : (byte)0,
 699                keysym = Key.AsKeysym()
 700            };
 701    }
 702
 703    /// <summary>
 704    /// Represents a text editing event.
 705    /// </summary>
 706    public class TextEditingEventArgs : CommonEventArgs
 707    {
 708        /// <summary>
 709        /// Target window.
 710        /// </summary>
 711        public Window Window { get; private set; }
 712        /// <summary>
 713        /// The editing text.
 714        /// </summary>
 715        public string Text { get; private set; }
 716        /// <summary>
 717        /// The start cursor of the selected editing text.
 718        /// </summary>
 719        public int Start { get; private set; }
 720        /// <summary>
 721        /// The length of the selected editing text.
 722        /// </summary>
 723        public int Length { get; private set; }
 724
 725
 726        /// <summary>
 727        /// Creates a new event args object.
 728        /// </summary>
 729        /// <param name="window">Target window. If null, the currently focused window is used.</param>
 730        public TextEditingEventArgs(string text, int start, int length, Window window = null)
 731            : base() =>
 732            (this.Text, this.Start, this.Length, this.Window) = (text, start, length, Window ?? Window.Current);
 733
 734        internal unsafe TextEditingEventArgs(SDL_TextEditingEvent e) =>
 735            (this.Text, this.Start, this.Length, this.Window) =
 736            (Util.FromNullTerminated(e.text), e.start, e.length, Window.GetByID(e.windowID));
 737
 738        internal unsafe override SDL_Event AsEvent()
 739        {
 740            var bytes = Encoding.UTF8.GetBytes(Text);
 741            var result = new SDL_TextEditingEvent()
 742            {
 743                type = (uint)SDL_EventType.SDL_TEXTEDITING,
 744                timestamp = (uint)Timestamp,
 745                windowID = Window.ID,
 746                start = Start,
 747                length = Length
 748            };
 749            Marshal.Copy(bytes, 0, (IntPtr)result.text, Math.Min(SDL_TEXTINPUTEVENT_TEXT_SIZE, bytes.Length));
 750            return result;
 751        }
 752    }
 753
 754    /// <summary>
 755    /// Represents a text input event.
 756    /// </summary>
 757    public class TextInputEventArgs : CommonEventArgs
 758    {
 759        /// <summary>
 760        /// Target window.
 761        /// </summary>
 762        public Window Window { get; private set; }
 763        /// <summary>
 764        /// Text entered by user.
 765        /// </summary>
 766        public string Text { get; private set; }
 767
 768        /// <summary>
 769        /// Creates a new event args object.
 770        /// </summary>
 771        /// <param name="text">Text entered by user.</param>
 772        /// <param name="window">Target window. If null, the currently focused window is used.</param>
 773        public TextInputEventArgs(string text, Window window = null) : base() =>
 774            (this.Window, this.Text) = (window ?? Window.Current, text);
 775
 776        internal unsafe TextInputEventArgs(SDL_TextInputEvent e) : base(e) =>
 777            (this.Window, this.Text) =
 778            (Window.GetByID(e.windowID), Util.FromNullTerminated(e.text));
 779
 780        internal unsafe override SDL_Event AsEvent()
 781        {
 782            var bytes = Encoding.UTF8.GetBytes(Text);
 783            var result = new SDL_TextInputEvent()
 784            {
 785                type = (uint)SDL_EventType.SDL_TEXTINPUT,
 786                timestamp = (uint)Timestamp,
 787                windowID = Window.ID,
 788            };
 789            Marshal.Copy(bytes, 0, (IntPtr)result.text, Math.Min(SDL_TEXTINPUTEVENT_TEXT_SIZE, bytes.Length));
 790            return result;
 791        }
 792    }
 793
 794    /* Mouse events */
 795    /// <summary>
 796    /// Represents a pressed or released mouse button.
 797    /// </summary>
 798    public enum MouseButton : byte
 799    {
 800        Left = 1,
 801        Middle,
 802        Right,
 803        X1,
 804        X2
 805    }
 806
 807    [Flags]
 808    /// <summary>
 809    /// Represents all pressed and released mouse buttons.
 810    /// </summary>
 811    public enum MouseButtons : uint
 812    {
 813        Left = 0x1,
 814        Middle = 0x2,
 815        Right = 0x4,
 816        X1 = 0x8,
 817        X2 = 0xF
 818    }
 819
 820    /// <summary>
 821    /// Describes mouse move event data.
 822    /// </summary>
 823    public class MouseMoveEventArgs : CommonEventArgs
 824    {
 825        /// <summary>
 826        /// Target window.
 827        /// </summary>
 828        public Window Window { get; private set; }
 829        /// <summary>
 830        /// Mouse button state.
 831        /// </summary>
 832        public MouseButtons Buttons { get; private set; }
 833        /// <summary>
 834        /// X coordinate, relative to window.
 835        /// </summary>
 836        public int X { get; private set; }
 837        /// <summary>
 838        /// Y coordinate, relative to window.
 839        /// </summary>
 840        public int Y { get; private set; }
 841        /// <summary>
 842        /// Relative motion in X direction.
 843        /// </summary>
 844        public int RelativeX { get; private set; }
 845        /// <summary>
 846        /// Relative motion in Y direction.
 847        /// </summary>
 848        public int RelativeY { get; private set; }
 849
 850        /// <summary>
 851        /// Creates new event args object.
 852        /// </summary>
 853        /// <param name="x">X coordinate relative to window.</param>
 854        /// <param name="y">Y coordinate relative to window.</param>
 855        /// <param name="relX">Relative motion in X direction.</param>
 856        /// <param name="relY">Relative motion in Y direction.</param>
 857        /// <param name="buttons">Mouse button state.</param>
 858        /// <param name="window">Target window. If null, the currently focused one is used.</param>
 859        public MouseMoveEventArgs(int x, int y, int relX, int relY,
 860            MouseButtons buttons, Window window = null) : base()
 861            =>
 862            (this.X, this.Y, this.RelativeX, this.RelativeY, this.Buttons, this.Window) =
 863            (x, y, relX, relY, buttons, window ?? Window.Current);
 864
 865        internal MouseMoveEventArgs(SDL_MouseMotionEvent e)
 866            : base(e)
 867        {
 868            Window = Window.GetByID(e.windowID);
 869            X = e.x; Y = e.y; RelativeX = e.xrel; RelativeY = e.yrel;
 870            Buttons = (MouseButtons)e.state;
 871        }
 872
 873        /// <summary>
 874        /// Returns true if the specified button is pressed.
 875        /// </summary>
 876        public bool IsPressed(MouseButtons button) => Buttons.HasFlag(button);
 877
 878        internal override SDL_Event AsEvent() =>
 879            new SDL_MouseMotionEvent()
 880            {
 881                type = (uint)SDL_EventType.SDL_MOUSEMOTION,
 882                timestamp = (uint)Timestamp,
 883                windowID = Window.ID,
 884                which = 0,
 885                state = (uint)Buttons,
 886                x = X,
 887                y = Y,
 888                xrel = RelativeX,
 889                yrel = RelativeY
 890            };
 891    }
 892
 893    /// <summary>
 894    /// Describes mouse button state change event data.
 895    /// </summary>
 896    public class MouseButtonEventArgs : CommonEventArgs
 897    {
 898        /// <summary>
 899        /// Target window.
 900        /// </summary>
 901        public Window Window { get; private set; }
 902        /// <summary>
 903        /// The button that changed.
 904        /// </summary>
 905        public MouseButton Button { get; private set; }
 906        /// <summary>
 907        /// Indicates if the button was pressed or released.
 908        /// </summary>
 909        /// <returns></returns>
 910        public bool IsPressed { get; private set; }
 911        /// <summary>
 912        /// Number of clicks.
 913        /// </summary>
 914        public byte Clicks { get; private set; }
 915        /// <summary>
 916        /// X coordinate, relative to window.
 917        /// </summary>
 918        public int X { get; private set; }
 919        /// <summary>
 920        /// Y coordinate, relative to window.
 921        /// </summary>
 922        public int Y { get; private set; }
 923
 924        /// <summary>
 925        /// Creates a new event args object.
 926        /// </summary>
 927        /// <param name="button">The button that changed.</param>
 928        /// <param name="x">X coordinate, relative to window.</param>
 929        /// <param name="y">Y coordinate, relative to window.</param>
 930        /// <param name="isPressed">Indicates if the button was pressed or released.</param>
 931        /// <param name="window">Target window. If null, the currently focused one is used.</param>
 932        /// <param name="clicks">Number of clicks.</param>
 933        public MouseButtonEventArgs(MouseButton button, int x, int y, bool isPressed,
 934            Window window = null, byte clicks = 1) : base()
 935            =>
 936            (this.Button, this.Window, this.X, this.Y, this.IsPressed, this.Clicks) =
 937            (button, window ?? Window.Current, x, y, isPressed, Math.Max((byte)1, clicks));
 938
 939        internal MouseButtonEventArgs(SDL_MouseButtonEvent e)
 940            : base(e)
 941        {
 942            Button = (MouseButton)e.button;
 943            Window = Window.GetByID(e.windowID);
 944            X = e.x; Y = e.y; Clicks = Math.Max((byte)1, e.clicks);
 945            IsPressed = e.state > 0;
 946        }
 947
 948        internal override SDL_Event AsEvent() =>
 949            new SDL_MouseButtonEvent()
 950            {
 951                type = (uint)(IsPressed ? SDL_EventType.SDL_MOUSEBUTTONDOWN :
 952                    SDL_EventType.SDL_MOUSEBUTTONUP),
 953                timestamp = (uint)Timestamp,
 954                windowID = Window.ID,
 955                which = 0,
 956                button = (byte)Button,
 957                state = IsPressed ? (byte)1 : (byte)0,
 958                clicks = (byte)Clicks,
 959                x = X,
 960                y = Y,
 961            };
 962    }
 963
 964    /// <summary>
 965    /// Describes mouse wheel scroll event data.
 966    /// </summary>
 967    public class MouseWheelEventArgs : CommonEventArgs
 968    {
 969        /// <summary>
 970        /// Target window.
 971        /// </summary>
 972        public Window Window { get; private set; }
 973        /// <summary>
 974        /// The amount scrolled horizontally, positive to the right and negative to the left.
 975        /// </summary>
 976        public int X { get; private set; }
 977        /// <summary>
 978        /// The amount scrolled vertically, positive away from the user and negative toward the user.
 979        /// </summary>
 980        public int Y { get; private set; }
 981
 982        /// <summary>
 983        /// Creates a new event args object.
 984        /// </summary>
 985        /// <param name="x">The amount scrolled horizontally, positive to the right and negative to the left.</param>
 986        /// <param name="y">The amount scrolled vertically, positive away from the user and negative toward the user.</p
 987        /// <param name="window">Target window. If null, the currently focused one is used.</param>
 988        public MouseWheelEventArgs(int x, int y, Window window = null) : base() =>
 989            (this.X, this.Y, this.Window) = (x, y, window ?? Window.Current);
 990
 991        internal MouseWheelEventArgs(SDL_MouseWheelEvent e) : base(e)
 992            => (this.X, this.Y, this.Window) = (e.x, e.y, Window.GetByID(e.windowID));
 993
 994        internal override SDL_Event AsEvent() =>
 995            new SDL_MouseWheelEvent()
 996            {
 997                type = (uint)SDL_EventType.SDL_MOUSEWHEEL,
 998                timestamp = (uint)Timestamp,
 999                windowID = Window.ID,
 1000                which = 0,
 1001                x = X,
 1002                y = Y
 1003            };
 1004    }
 1005
 1006    /// <summary>
 1007    /// Describes joystick axis motion event data.
 1008    /// </summary>
 1009    public class JoyAxisMotionEventArgs : CommonEventArgs
 1010    {
 1011        /// <summary>
 1012        /// The joystick instance ID.
 1013        /// </summary>
 1014        public int JoystickID { get; private set; }
 1015        /// <summary>
 1016        /// Joystick axis index.
 1017        /// </summary>
 1018        public byte Axis { get; private set; }
 1019        /// <summary>
 1020        /// The axis value (range: -32768 to 32767)
 1021        /// </summary>
 1022        public short Value { get; private set; }
 1023
 1024        /// <summary>
 1025        /// Creates a new event args object.
 1026        /// </summary>
 1027        public JoyAxisMotionEventArgs(int joystickId, byte axis, short value) : base() =>
 1028            (this.JoystickID, this.Axis, this.Value) = (joystickId, axis, value);
 1029
 1030        internal JoyAxisMotionEventArgs(SDL_JoyAxisEvent e) : base(e) =>
 1031            (this.JoystickID, this.Axis, this.Value) = (e.which, e.axis, e.value);
 1032
 1033        internal override SDL_Event AsEvent() =>
 1034            new SDL_JoyAxisEvent()
 1035            {
 1036                type = (uint)SDL_EventType.SDL_JOYAXISMOTION,
 1037                timestamp = (uint)Timestamp,
 1038                which = JoystickID,
 1039                axis = Axis,
 1040                value = Value
 1041            };
 1042    }
 1043
 1044    /// <summary>
 1045    /// Describes joystick trackball motion event data.
 1046    /// </summary>
 1047    public class JoyBallMotionEventArgs : CommonEventArgs
 1048    {
 1049        /// <summary>
 1050        /// The joystick instance ID.
 1051        /// </summary>
 1052        public int JoystickID { get; private set; }
 1053        /// <summary>
 1054        /// Joystick trackball index.
 1055        /// </summary>
 1056        public byte Ball { get; private set; }
 1057        /// <summary>
 1058        /// Relative motion in X direction.
 1059        /// </summary>
 1060        public short RelativeX { get; private set; }
 1061        /// <summary>
 1062        /// Relative motion in Y direction.
 1063        /// </summary>
 1064        public short RelativeY { get; private set; }
 1065
 1066        /// <summary>
 1067        /// Creates new event args object.
 1068        /// </summary>
 1069        public JoyBallMotionEventArgs(int joystickId, byte ball, short relX, short relY)
 1070            : base() =>
 1071            (this.JoystickID, this.Ball, this.RelativeX, this.RelativeY) =
 1072            (joystickId, ball, relX, relY);
 1073
 1074        internal JoyBallMotionEventArgs(SDL_JoyBallEvent e) : base(e) =>
 1075            (this.JoystickID, this.Ball, this.RelativeX, this.RelativeY) =
 1076            (e.which, e.ball, e.xrel, e.yrel);
 1077
 1078        internal override SDL_Event AsEvent() =>
 1079            new SDL_JoyBallEvent()
 1080            {
 1081                type = (uint)SDL_EventType.SDL_JOYBALLMOTION,
 1082                timestamp = (uint)Timestamp,
 1083                which = JoystickID,
 1084                xrel = RelativeX,
 1085                yrel = RelativeY
 1086            };
 1087    }
 1088
 1089    [Flags]
 1090    /// <summary>
 1091    /// Describes joystick hat position.
 1092    /// </summary>
 1093    public enum HatPosition : byte
 1094    {
 1095        Centered = SDL_HAT_CENTERED,
 1096        Up = SDL_HAT_UP,
 1097        Right = SDL_HAT_RIGHT,
 1098        Down = SDL_HAT_DOWN,
 1099        Left = SDL_HAT_LEFT,
 1100        RightUp = Right | Up,
 1101        RightDown = Right | Down,
 1102        LeftUp = Left | Up,
 1103        LeftDown = Left | Down
 1104    }
 1105
 1106    /// <summary>
 1107    /// Describes joystick POV hat motion event data.
 1108    /// </summary>
 1109    public class JoyHatMotionEventArgs : CommonEventArgs
 1110    {
 1111        /// <summary>
 1112        /// The joystick instance ID.
 1113        /// </summary>
 1114        public int JoystickID { get; private set; }
 1115        /// <summary>
 1116        /// Joystick hat index.
 1117        /// </summary>
 1118        public byte Hat { get; private set; }
 1119        /// <summary>
 1120        /// Joystick hat position.
 1121        /// </summary>
 1122        public HatPosition Position { get; private set; }
 1123
 1124        /// <summary>
 1125        /// Creates new event args object.
 1126        /// </summary>
 1127        public JoyHatMotionEventArgs(int joystickId, byte hat, HatPosition pos)
 1128            : base() =>
 1129            (this.JoystickID, this.Hat, this.Position) = (joystickId, hat, pos);
 1130
 1131        internal JoyHatMotionEventArgs(SDL_JoyHatEvent e) : base(e) =>
 1132            (this.JoystickID, this.Hat, this.Position) = (e.which, e.hat, (HatPosition)e.value);
 1133
 1134        internal override SDL_Event AsEvent() =>
 1135            new SDL_JoyHatEvent()
 1136            {
 1137                type = (uint)SDL_EventType.SDL_JOYHATMOTION,
 1138                timestamp = (uint)Timestamp,
 1139                which = JoystickID,
 1140                hat = Hat,
 1141                value = (byte)Position
 1142            };
 1143    }
 1144
 1145    /// <summary>
 1146    /// Describes joystick button press/release event data.
 1147    /// </summary>
 1148    public class JoyButtonEventArgs : CommonEventArgs
 1149    {
 1150        /// <summary>
 1151        /// The joystick instance id.
 1152        /// </summary>
 1153        public int JoystickID { get; private set; }
 1154        /// <summary>
 1155        /// Joystick button index.
 1156        /// </summary>
 1157        public byte Button { get; private set; }
 1158        /// <summary>
 1159        /// Indicates if the button was pressed or released.
 1160        /// </summary>
 1161        public bool IsPressed { get; private set; }
 1162
 1163        /// <summary>
 1164        /// Creates new event args object.
 1165        /// </summary>
 1166        public JoyButtonEventArgs(int joystickId, byte button, bool isPressed)
 1167            : base() =>
 1168            (this.JoystickID, this.Button, this.IsPressed) = (joystickId, button, isPressed);
 1169
 1170        internal JoyButtonEventArgs(SDL_JoyButtonEvent e) : base(e) =>
 1171            (this.JoystickID, this.Button, this.IsPressed) =
 1172            (e.which, e.button, e.state > 0);
 1173
 1174        internal override SDL_Event AsEvent() =>
 1175            new SDL_JoyButtonEvent()
 1176            {
 1177                type = (uint)(IsPressed ? SDL_EventType.SDL_JOYBUTTONDOWN : SDL_EventType.SDL_JOYBUTTONUP),
 1178                timestamp = (uint)Timestamp,
 1179                which = JoystickID,
 1180                button = Button,
 1181                state = (byte)(IsPressed ? 1 : 0)
 1182            };
 1183    }
 1184
 1185    /// <summary>
 1186    /// Describes joystick state change event data.
 1187    /// </summary>
 1188    public class JoyDeviceStateEventArgs : CommonEventArgs
 1189    {
 1190        /// <summary>
 1191        /// The joystick instance id.
 1192        /// </summary>
 1193        public int JoystickID { get; private set; }
 1194        /// <summary>
 1195        /// Indicates if the joystick is connected or disconnected.
 1196        /// </summary>
 1197        /// <returns></returns>
 1198        public bool Connected { get; private set; }
 1199
 1200        /// <summary>
 1201        /// Creates new event args object.
 1202        /// </summary>
 1203        public JoyDeviceStateEventArgs(int joystickId, bool connected) : base() =>
 1204            (this.JoystickID, this.Connected) = (joystickId, connected);
 1205
 1206        internal JoyDeviceStateEventArgs(SDL_JoyDeviceEvent e) : base(e) =>
 1207            (this.JoystickID, this.Connected) = (e.which, e.type == (uint)SDL_EventType.SDL_JOYDEVICEADDED);
 1208
 1209        internal override SDL_Event AsEvent() =>
 1210            new SDL_JoyDeviceEvent()
 1211            {
 1212                type = (uint)(Connected ? SDL_EventType.SDL_JOYDEVICEADDED : SDL_EventType.SDL_JOYDEVICEREMOVED),
 1213                timestamp = (uint)Timestamp,
 1214                which = JoystickID,
 1215            };
 1216    }
 1217
 1218    /// <summary>
 1219    /// Defines controller axes.
 1220    /// </summary>
 1221    public enum ControllerAxis : byte
 1222    {
 1223        LeftX,
 1224        LeftY,
 1225        RightX,
 1226        RightY,
 1227        LeftTrigger,
 1228        RightTrigger
 1229    }
 1230
 1231    /// <summary>
 1232    /// Describes controller buttons.
 1233    /// </summary>
 1234    public enum ControllerButton : byte
 1235    {
 1236        A,
 1237        B,
 1238        X,
 1239        Y,
 1240        Back,
 1241        Guide,
 1242        Start,
 1243        LeftStick,
 1244        RightStick,
 1245        LeftShoulder,
 1246        RightShoulder,
 1247        DPadUp,
 1248        DPadDown,
 1249        DPadLeft,
 1250        DPadRight
 1251    }
 1252
 1253    /// <summary>
 1254    /// Describes controller axis motion event data.
 1255    /// </summary>
 1256    public class ControllerAxisEventArgs : CommonEventArgs
 1257    {
 1258        /// <summary>
 1259        /// The controller instance ID.
 1260        /// </summary>
 1261        public int ControllerID { get; private set; }
 1262        /// <summary>
 1263        /// The axis which was moved.
 1264        /// </summary>
 1265        public ControllerAxis Axis { get; private set; }
 1266        /// <summary>
 1267        /// The axis value (range: -32768 to 32767)
 1268        /// </summary>
 1269        public short Value { get; private set; }
 1270
 1271        /// <summary>
 1272        /// Creates a new event args object.
 1273        /// </summary>
 1274        public ControllerAxisEventArgs(int id, ControllerAxis axis, short value)
 1275            : base() =>
 1276            (this.ControllerID, this.Axis, this.Value) = (id, axis, value);
 1277
 1278        internal ControllerAxisEventArgs(SDL_ControllerAxisEvent e) : base(e) =>
 1279            (this.ControllerID, this.Axis, this.Value) = (e.which, (ControllerAxis)e.axis, e.value);
 1280
 1281        internal override SDL_Event AsEvent() =>
 1282            new SDL_ControllerAxisEvent()
 1283            {
 1284                type = (uint)SDL_EventType.SDL_CONTROLLERAXISMOTION,
 1285                timestamp = (uint)Timestamp,
 1286                which = ControllerID,
 1287                axis = (byte)Axis,
 1288                value = Value
 1289            };
 1290    }
 1291
 1292    /// <summary>
 1293    /// Describes controller button press/release event data.
 1294    /// </summary>
 1295    public class ControllerButtonEventArgs : CommonEventArgs
 1296    {
 1297        /// <summary>
 1298        /// The controller instance ID.
 1299        /// </summary>
 1300        public int ControllerID { get; private set; }
 1301        /// <summary>
 1302        /// The button which changed state.
 1303        /// </summary>
 1304        public ControllerButton Button { get; private set; }
 1305        /// <summary>
 1306        /// Indicates if the button was pressed or released.
 1307        /// </summary>
 1308        public bool IsPressed { get; private set; }
 1309
 1310        /// <summary>
 1311        /// Creates a new event args object.
 1312        /// </summary>
 1313        public ControllerButtonEventArgs(int id, ControllerButton button, bool pressed)
 1314            : base() =>
 1315            (this.ControllerID, this.Button, this.IsPressed) = (id, button, pressed);
 1316
 1317        internal ControllerButtonEventArgs(SDL_ControllerButtonEvent e)
 1318            : base(e) =>
 1319            (this.ControllerID, this.Button, this.IsPressed) =
 1320            (e.which, (ControllerButton)e.button, e.state > 0);
 1321
 1322        internal override SDL_Event AsEvent() =>
 1323            new SDL_ControllerButtonEvent()
 1324            {
 1325                type = (uint)(IsPressed ? SDL_EventType.SDL_CONTROLLERBUTTONDOWN : SDL_EventType.SDL_CONTROLLERBUTTONUP)
 1326                timestamp = (uint)Timestamp,
 1327                which = ControllerID,
 1328                button = (byte)Button,
 1329                state = (byte)(IsPressed ? 1 : 0)
 1330            };
 1331    }
 1332
 1333    /// <summary>
 1334    /// Describes controller state change event data.
 1335    /// </summary>
 1336    public class ControllerDeviceStateEventArgs : CommonEventArgs
 1337    {
 1338        /// <summary>
 1339        /// The controller instance id.
 1340        /// </summary>
 1341        public int ControllerID { get; private set; }
 1342        /// <summary>
 1343        /// Indicates if the controller is connected or disconnected.
 1344        /// </summary>
 1345        public bool Connected { get; private set; }
 1346
 1347        /// <summary>
 1348        /// Creates new event args object.
 1349        /// </summary>
 1350        public ControllerDeviceStateEventArgs(int controllerId, bool connected) : base() =>
 1351            (this.ControllerID, this.Connected) = (controllerId, connected);
 1352
 1353        internal ControllerDeviceStateEventArgs(SDL_ControllerDeviceEvent e) : base(e) =>
 1354            (this.ControllerID, this.Connected) = (e.which, e.type == (uint)SDL_EventType.SDL_CONTROLLERDEVICEADDED);
 1355
 1356        internal override SDL_Event AsEvent() =>
 1357            new SDL_ControllerDeviceEvent()
 1358            {
 1359                type = (uint)(Connected ? SDL_EventType.SDL_CONTROLLERDEVICEADDED : SDL_EventType.SDL_CONTROLLERDEVICERE
 1360                timestamp = (uint)Timestamp,
 1361                which = ControllerID,
 1362            };
 1363    }
 1364
 1365    /// <summary>
 1366    /// Describes types of touch events.
 1367    /// </summary>
 1368    public enum TouchEventType
 1369    {
 1370        Motion,
 1371        FingerDown,
 1372        FingerUp
 1373    }
 1374
 1375    /// <summary>
 1376    /// Describes touch event data.
 1377    /// </summary>
 1378    public class TouchFingerEventArgs : CommonEventArgs
 1379    {
 1380        /// <summary>
 1381        /// The event type.
 1382        /// </summary>
 1383        public TouchEventType Type { get; private set; }
 1384        /// <summary>
 1385        /// The touch device ID.
 1386        /// </summary>
 1387        public long DeviceID { get; private set; }
 1388        /// <summary>
 1389        /// The finger ID.
 1390        /// </summary>
 1391        public long FingerID { get; private set; }
 1392        /// <summary>
 1393        /// Normalized in the range 0...1.
 1394        /// </summary>
 1395        public float X { get; private set; }
 1396        /// <summary>
 1397        /// Normalized in the range 0...1.
 1398        /// </summary>
 1399        public float Y { get; private set; }
 1400        /// <summary>
 1401        /// Normalized in the range 0...1.
 1402        /// </summary>
 1403        public float DX { get; private set; }
 1404        /// <summary>
 1405        /// Normalized in the range 0...1.
 1406        /// </summary>
 1407        public float DY { get; private set; }
 1408        /// <summary>
 1409        /// Normalized in the range 0...1.
 1410        /// </summary>
 1411        public float Pressure { get; private set; }
 1412
 1413        private static readonly Dictionary<uint, TouchEventType> s_types =
 1414            new Dictionary<uint, TouchEventType>()
 1415            {
 1416                { (uint)SDL_EventType.SDL_FINGERMOTION, TouchEventType.Motion },
 1417                { (uint)SDL_EventType.SDL_FINGERDOWN, TouchEventType.FingerDown },
 1418                { (uint)SDL_EventType.SDL_FINGERUP, TouchEventType.FingerUp }
 1419            };
 1420
 1421        private static readonly Dictionary<TouchEventType, uint> s_reverseTypes =
 1422            s_types.ToDictionary(x => x.Value, x => x.Key);
 1423
 1424        /// <summary>
 1425        /// Creates a new event args object.
 1426        /// </summary>
 1427        public TouchFingerEventArgs(TouchEventType type, long deviceId, long fingerId,
 1428            float x, float y, float dx, float dy, float pressure) : base() =>
 1429            (Type, DeviceID, FingerID, X, Y, DX, DY, Pressure) =
 1430            (type, deviceId, fingerId, x, y, dx, dy, pressure);
 1431
 1432        internal TouchFingerEventArgs(SDL_TouchFingerEvent e) : base(e)
 1433        {
 1434            (DeviceID, FingerID, X, Y, DX, DY, Pressure) =
 1435            (e.touchId, e.fingerId, e.x, e.y, e.dx, e.dy, e.pressure);
 1436            Type = s_types[e.type];
 1437        }
 1438
 1439        internal override SDL_Event AsEvent() =>
 1440            new SDL_TouchFingerEvent()
 1441            {
 1442                type = s_reverseTypes[Type],
 1443                timestamp = (uint)Timestamp,
 1444                touchId = DeviceID,
 1445                fingerId = FingerID,
 1446                x = X,
 1447                y = Y,
 1448                dx = DX,
 1449                dy = DY,
 1450                pressure = Pressure
 1451            };
 1452    }
 1453}