示例#1
0
 /// <summary>
 /// Default constructor
 /// </summary>
 public UserEventArgs()
 {
     Sdl.SDL_Event evt = new Sdl.SDL_Event();
     evt.type = (byte)EventTypes.UserEvent;
     evt.user.type = (byte)EventTypes.UserEvent;
     this.EventStruct = evt;
 }
示例#2
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="width">The new window width</param>
 /// <param name="height">The new window height</param>
 public VideoResizeEventArgs(int width, int height)
 {
     Sdl.SDL_Event evt = new Sdl.SDL_Event();
     evt.resize.w = width;
     evt.resize.h = height;
     evt.type = (byte)EventTypes.VideoResize;
     this.EventStruct = evt;
 }
示例#3
0
 /// <summary>
 /// Joystick Hat event args
 /// </summary>
 /// <param name="device">The joystick index</param>
 /// <param name="hatIndex">The hat index</param>
 /// <param name="hatValue">The new hat position</param>
 public JoystickHatEventArgs(byte device, byte hatIndex, byte hatValue)
 {
     Sdl.SDL_Event evt = new Sdl.SDL_Event();
     evt.jhat.which = device;
     evt.jhat.hat = hatIndex;
     evt.jhat.val = hatValue;
     evt.type = (byte)EventTypes.JoystickHatMotion;
     this.EventStruct = evt;
 }
示例#4
0
 /// <summary>
 /// 
 /// </summary>
 ///<param name="device">The joystick index</param>
 /// <param name="ball">The trackball index</param>
 /// <param name="relativeX">The relative X position</param>
 /// <param name="relativeY">The relative Y position</param>
 public JoystickBallEventArgs(byte device, byte ball, short relativeX, short relativeY)
 {
     Sdl.SDL_Event evt = new Sdl.SDL_Event();
     evt.jball.which = device;
     evt.jball.ball = ball;
     evt.jball.xrel = relativeX;
     evt.jball.yrel = relativeY;
     evt.type = (byte)EventTypes.JoystickBallMotion;
     this.EventStruct = evt;
 }
示例#5
0
 /// <summary>
 /// Create Event args
 /// </summary>
 /// <param name="device">The joystick index</param>
 /// <param name="axisIndex">The axis index</param>
 /// <param name="axisValue">The new axis value</param>
 public JoystickAxisEventArgs(byte device, byte axisIndex, float axisValue)
 {
     Sdl.SDL_Event evt = new Sdl.SDL_Event();
     evt.jaxis.which = device;
     evt.jaxis.axis = axisIndex;
     evt.jaxis.val =
         (short)((axisValue * JOYSTICK_SCALE) - JOYSTICK_ADJUSTMENT);
     evt.type = (byte)EventTypes.JoystickAxisMotion;
     this.EventStruct = evt;
 }
示例#6
0
        /// <summary>
        /// Constructor for ActiveEventArgs
        /// </summary>
        /// <remarks>
        /// Creates EventArgs that can be passed to the event queue
        /// </remarks>
        /// <param name="gainedFocus">
        /// True if the focus was gained, False if it was lost
        /// </param>
        /// <param name="state">
        /// Set to type of input that gave the app focus
        /// </param>
        public ActiveEventArgs(bool gainedFocus, Focus state)
        {
            Sdl.SDL_Event evt = new Sdl.SDL_Event();

            if (gainedFocus)
            {
                evt.active.gain = 1;
            }
            else
            {
                evt.active.gain = 0;
            }
            evt.type = (byte)EventTypes.ActiveEvent;
            evt.active.state = (byte)state;
            this.EventStruct = evt;
        }
示例#7
0
 /// <summary>
 /// joystick button args
 /// </summary>
 /// <param name="device">The joystick index</param>
 /// <param name="button">The button index</param>
 /// <param name="buttonPressed">
 /// True if the button was pressed, 
 /// False if it was released
 /// </param>
 public JoystickButtonEventArgs(byte device, byte button, bool buttonPressed)
 {
     Sdl.SDL_Event evt = new Sdl.SDL_Event();
     evt.jbutton.which = device;
     evt.jbutton.button = button;
     if (buttonPressed)
     {
         evt.jbutton.state = (byte)ButtonKeyState.Pressed;
         evt.type = (byte)EventTypes.JoystickButtonDown;
     }
     else
     {
         evt.jbutton.state = (byte)ButtonKeyState.NotPressed;
         evt.type = (byte)EventTypes.JoystickButtonUp;
     }
     this.EventStruct = evt;
 }
示例#8
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="button">The mouse button</param>
 /// <param name="buttonPressed">True if the button is pressed, 
 /// False if it is released</param>
 /// <param name="positionX">The current X coordinate</param>
 /// <param name="positionY">The current Y coordinate</param>
 public MouseButtonEventArgs(MouseButton button, bool buttonPressed, short positionX, short positionY)
 {
     Sdl.SDL_Event evt = new Sdl.SDL_Event();
     evt.button.button = (byte)button;
     evt.button.which = 0;
     evt.button.x = positionX;
     evt.button.y = positionY;
     if (buttonPressed)
     {
         evt.button.state = (byte)ButtonKeyState.Pressed;
         evt.type = (byte)EventTypes.MouseButtonDown;
     }
     else
     {
         evt.button.state = (byte)ButtonKeyState.NotPressed;
         evt.type = (byte)EventTypes.MouseButtonUp;
     }
     this.EventStruct = evt;
 }
示例#9
0
 /// <summary>
 /// MouseMotion
 /// </summary>
 /// <param name="buttonPressed">The current mouse button state</param>
 /// <param name="button">Button pressed</param>
 /// <param name="positionX">The current X coordinate</param>
 /// <param name="positionY">The current Y coordinate</param>
 /// <param name="relativeX">
 /// The difference between the last X coordinate and current</param>
 /// <param name="relativeY">
 /// The difference between the last Y coordinate and current</param>
 public MouseMotionEventArgs(bool buttonPressed, MouseButton button, short positionX, short positionY,
     short relativeX, short relativeY)
 {
     Sdl.SDL_Event evt = new Sdl.SDL_Event();
     evt.motion.xrel = relativeX;
     evt.motion.yrel = relativeY;
     evt.motion.which = (byte)button;
     evt.motion.x = positionX;
     evt.motion.y = positionY;
     evt.type = (byte)EventTypes.MouseMotion;
     if (buttonPressed)
     {
         evt.motion.state = (byte)ButtonKeyState.Pressed;
     }
     else
     {
         evt.motion.state = (byte)ButtonKeyState.NotPressed;
     }
     this.EventStruct = evt;
 }
示例#10
0
 /// <summary>
 /// Keyboard event args
 /// </summary>
 /// <param name="down">
 /// True if the key is pressed, False if it was released
 /// </param>
 /// <param name="key">The Sdl virtual keycode</param>
 /// <param name="modifierKeys">Current modifier flags</param>
 public KeyboardEventArgs(
     Key key,
     ModifierKeys modifierKeys,
     bool down)
 {
     Sdl.SDL_Event evt = new Sdl.SDL_Event();
     evt.key.which = 0;
     evt.key.keysym.scancode = 0;
     evt.key.keysym.sym = (int)key;
     evt.key.keysym.mod = (int)modifierKeys;
     if (down)
     {
         evt.key.state = (byte)ButtonKeyState.Pressed;
         evt.type = (byte)EventTypes.KeyDown;
     }
     else
     {
         evt.key.state = (byte)ButtonKeyState.NotPressed;
         evt.type = (byte)EventTypes.KeyUp;
     }
     this.EventStruct = evt;
 }
示例#11
0
 /// <summary>
 /// Returns an array of events in the event queue.
 /// </summary>
 /// <param name="eventMask">Mask for event that will be removed from queue</param>
 /// <param name="numberOfEvents">Number of events to remove</param>
 public static void Remove(EventMask eventMask, int numberOfEvents)
 {
     Sdl.SDL_Event[] events = new Sdl.SDL_Event[numberOfEvents];
     Sdl.SDL_PumpEvents();
     int result =
         Sdl.SDL_PeepEvents(
         events,
         events.Length,
         Sdl.SDL_GETEVENT,
         (int)eventMask);
     if (result == (int)SdlFlag.Error)
     {
         throw SdlException.Generate();
     }
 }
示例#12
0
        /// <summary>
        /// Retrieve events of a certain type
        /// </summary>
        /// <param name="eventMask">Event to retrieve</param>
        /// <param name="numberOfEvents">Number of events to retrieve</param>
        /// <returns>Array containing events</returns>
        public static SdlEventArgs[] Retrieve(EventMask eventMask, int numberOfEvents)
        {
            Sdl.SDL_PumpEvents();

            Sdl.SDL_Event[] events = new Sdl.SDL_Event[numberOfEvents];

            int result = Sdl.SDL_PeepEvents(
                events,
                events.Length,
                Sdl.SDL_GETEVENT,
                (int)eventMask
                );

            if (result == (int)SdlFlag.Error)
            {
                throw SdlException.Generate();
            }

            SdlEventArgs[] eventsArray = new SdlEventArgs[result];
            for (int i = 0; i < eventsArray.Length; i++)
            {
                if (events[i].type == (byte)EventTypes.UserEvent)
                {
                    eventsArray[i] = (UserEventArgs)userEvents[events[i].user.code];
                    userEvents.Remove(events[i].user.code);
                }
                else
                {
                    eventsArray[i] = SdlEventArgs.CreateEventArgs(events[i]);
                }
            }

            return eventsArray;
        }
示例#13
0
        public void initSDL()
        {
            int VideoFlags;
            IntPtr ptrVideoInfo = IntPtr.Zero;
            Sdl.SDL_VideoInfo SDLVideoInfo;
            Sdl.SDL_Event SDLEvent = new Sdl.SDL_Event();
            bool isActive = true;

            // SDL Code von http://www.gamedev.de/index.php?name=News&sid=117&file=article&pageid=2
            // SDL initialisieren
            if(Sdl.SDL_Init(Sdl.SDL_INIT_VIDEO) < 0)
            {
                Console.WriteLine("SDL initialization failed:\n" + Sdl.SDL_GetError());
                Sdl.SDL_Quit();
                return;
            }

            // Video Info einlesen
            ptrVideoInfo = Sdl.SDL_GetVideoInfo();

            if(ptrVideoInfo == IntPtr.Zero)
            {
                Console.WriteLine("Video Query failed:\n" + Sdl.SDL_GetError());
                Sdl.SDL_Quit();
                return;
            }
            else
            {
                SDLVideoInfo = (Sdl.SDL_VideoInfo)Marshal.PtrToStructure(ptrVideoInfo, typeof(Sdl.SDL_VideoInfo));
            }

            // Video Flags festlegen
            //VideoFlags  = Sdl.SDL_OPENGL;
            VideoFlags = Sdl.SDL_GL_DOUBLEBUFFER;
            VideoFlags |= Sdl.SDL_HWPALETTE;
            //VideoFlags |= Sdl.SDL_RESIZABLE;

            // überprüfen ob wir Hardware Surfaces haben
            if(SDLVideoInfo.hw_available == 1)
                VideoFlags |= Sdl.SDL_HWSURFACE;
            else
                VideoFlags |= Sdl.SDL_SWSURFACE;

            // Überprüfen ob wir Hardwareunterstützung für bliting haben
            if(SDLVideoInfo.blit_hw == 1)
                VideoFlags |= Sdl.SDL_HWACCEL;

            // OpenGL Double Buffering einschalten
            Sdl.SDL_GL_SetAttribute(Sdl.SDL_GL_DOUBLEBUFFER, 1);

            // Surface Pointer holen
            ptrSurface = Sdl.SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, COLOR_DEPTH, VideoFlags);
            Sdl.SDL_WM_SetCaption("Arena of Glory", "");

            // Surface pointer überprüfen
            if(ptrSurface == IntPtr.Zero)
            {
                Console.WriteLine("Video Mode set failed:\n" + Sdl.SDL_GetError());
                Sdl.SDL_Quit();
                return;
            }
            else
            {
                SDLSurface = (Sdl.SDL_Surface)Marshal.PtrToStructure(ptrSurface, typeof(Sdl.SDL_Surface));
            }

            Console.WriteLine("Video Driver: " + Sdl.SDL_VideoDriverName("", 128));

            while(!done)
            {
                // Events aus dem Eventqueue auselesen
                while(Sdl.SDL_PollEvent(out SDLEvent) == 1)
                {
                    switch(SDLEvent.type)
                    {
                        case Sdl.SDL_ACTIVEEVENT:
                            // Überprüfen ob wir den Focus verloren haben
                            if(SDLEvent.active.gain == 0)
                                isActive = false;
                            else
                                isActive = true;
                            break;
                        case Sdl.SDL_KEYDOWN:
                             // Tastatureingaben behandeln
                            if(this.KeyDown != null)
                                this.KeyDown(SDLEvent.key.keysym);
                            break;
                        case Sdl.SDL_KEYUP:
                            if(this.KeyUp != null)
                                this.KeyUp(SDLEvent.key.keysym);
                            break;
                        case Sdl.SDL_QUIT:
                             // Wenn das SDL Fenster geschlossen wird.
                            done = true;
                            break;
                    }
                }
                // Scene Zeichnen wenn wir den Fokus haben
                //if(isActive)
                //{
                DrawGlScene();
                Sdl.SDL_GL_SwapBuffers();  // Buffer flip
                //}
                Sdl.SDL_Delay(25);
            }

            Sdl.SDL_Quit ();
        }
示例#14
0
 private static int TimerCallback(int intervalMs)
 {
     Sdl.SDL_Event evt = new Sdl.SDL_Event();
       evt.type = Sdl.SDL_USEREVENT;
       evt.user.code = TIMER_EVENT_CODE;
       evt.user.data1 = IntPtr.Zero;
       evt.user.data2 = IntPtr.Zero;
       Sdl.SDL_PushEvent(out evt);
       return intervalMs;
 }
示例#15
0
 /// <summary>
 /// Holds SDL_Event
 /// </summary>
 /// <param name="eventStruct">Event Struct</param>
 protected SdlEventArgs(Sdl.SDL_Event eventStruct)
 {
     this.eventStruct = eventStruct;
 }
示例#16
0
 /// <summary>
 /// Quit Event
 /// </summary>
 public QuitEventArgs()
 {
     Sdl.SDL_Event evt = new Sdl.SDL_Event();
     evt.type = (byte)EventTypes.Quit;
     this.EventStruct = evt;
 }
示例#17
0
        static Vector2 Update_GetPosition()
        {
            gameState = GameState.WaitForPosition;
            cursorPos = currentLevel.creatures[0].pos; //Start at player's position
            Vector2 currentPos = currentLevel.creatures[0].pos; //The position the cursor is on
            bool done = false; //Variable for loop break

            Sdl.SDL_Event keyEvent, oldKeyEvent;
            Sdl.SDL_PollEvent(out keyEvent);

            while (!done)
            {
                oldKeyEvent = keyEvent;
                Sdl.SDL_PollEvent(out keyEvent);
                Draw(); //Update screen

                switch (keyEvent.type) //Test keyEvent
                {
                    case Sdl.SDL_KEYDOWN: //If a key is down
                        if (oldKeyEvent.type != Sdl.SDL_KEYDOWN ||
                            oldKeyEvent.key.keysym.sym == Sdl.SDLK_RSHIFT ||
                            oldKeyEvent.key.keysym.sym == Sdl.SDLK_LSHIFT)
                        {
                            switch (keyEvent.key.keysym.sym)
                            {
                                case Sdl.SDLK_ESCAPE:
                                    gameState = GameState.MainGame;
                                    done = true;
                                    break;

                                case 271: //If enter aka "271" or "13" was pressed
                                case 13:
                                    gameState = GameState.MainGame;
                                    return cursorPos;

                                case Sdl.SDLK_KP1:
                                case Sdl.SDLK_DELETE:
                                    cursorPos.X--;
                                    cursorPos.Y++;
                                    break;

                                case Sdl.SDLK_KP2:
                                case Sdl.SDLK_DOWN:
                                    cursorPos.Y++;
                                    break;

                                case Sdl.SDLK_KP3:
                                case Sdl.SDLK_PAGEDOWN:
                                    cursorPos.X++;
                                    cursorPos.Y++;
                                    break;

                                case Sdl.SDLK_KP4:
                                case Sdl.SDLK_LEFT:
                                    cursorPos.X--;
                                    break;

                                case Sdl.SDLK_KP6:
                                case Sdl.SDLK_RIGHT:
                                    cursorPos.X++;
                                    break;

                                case Sdl.SDLK_KP7:
                                case Sdl.SDLK_INSERT:
                                    cursorPos.X--;
                                    cursorPos.Y--;
                                    break;

                                case Sdl.SDLK_KP8:
                                case Sdl.SDLK_UP:
                                    cursorPos.Y--;
                                    break;

                                case Sdl.SDLK_KP9:
                                case Sdl.SDLK_PAGEUP:
                                    cursorPos.X++;
                                    cursorPos.Y--;
                                    break;

                                default:
                                    done = false;
                                    break;
                            }
                        }
                        break;
                    default:
                        break;
                }
            }

            return currentPos;
        }
示例#18
0
 /// <summary>
 /// Constructor
 /// </summary>
 public VideoExposeEventArgs()
 {
     Sdl.SDL_Event evt = new Sdl.SDL_Event();
     evt.type = (byte)EventTypes.VideoExpose;
     this.EventStruct = evt;
 }
示例#19
0
文件: Rectangles.cs 项目: vhotur/tao
        public static void Run()
        {
            int flags = (Sdl.SDL_HWSURFACE|Sdl.SDL_DOUBLEBUF|Sdl.SDL_ANYFORMAT);
            int bpp = 16;
            int width = 640;
            int height = 480;
            bool quitFlag = false;

            Random rand = new Random();

            string filePath = Path.Combine("..", "..");
            string fileDirectory = "Data";
            string fileName = "SdlExamples.Rectangles.sound.ogg";
            if (File.Exists(fileName))
            {
                filePath = "";
                fileDirectory = "";
            }
            else if (File.Exists(Path.Combine(fileDirectory, fileName)))
            {
                filePath = "";
            }

            string file = Path.Combine(Path.Combine(filePath, fileDirectory), fileName);

            Sdl.SDL_Event evt;

            try
            {
                Sdl.SDL_Init(Sdl.SDL_INIT_EVERYTHING);
                Sdl.SDL_WM_SetCaption("Tao.Sdl Example - Rectangles", "");
                IntPtr surfacePtr = Sdl.SDL_SetVideoMode(
                    width,
                    height,
                    bpp,
                    flags);

                int result = SdlMixer.Mix_OpenAudio(
                    SdlMixer.MIX_DEFAULT_FREQUENCY,
                    (short)SdlMixer.MIX_DEFAULT_FORMAT,
                    2,
                    1024);
                IntPtr chunkPtr = SdlMixer.Mix_LoadMUS(file);

                SdlMixer.MusicFinishedDelegate musicStopped =
                    new SdlMixer.MusicFinishedDelegate(musicHasStopped);
                SdlMixer.Mix_HookMusicFinished(musicStopped);

                result = SdlMixer.Mix_PlayMusic(chunkPtr, 1);
                if (result == -1)
                {
                    Console.WriteLine("Music Error: " + Sdl.SDL_GetError());
                }

                int rmask = 0x00000000;
                int gmask = 0x00ff0000;
                int bmask = 0x0000ff00;
                int amask = 0x000000ff;

                IntPtr rgbSurfacePtr = Sdl.SDL_CreateRGBSurface(
                    flags,
                    width,
                    height,
                    bpp,
                    rmask,
                    gmask,
                    bmask,
                    amask);

                Sdl.SDL_Rect rect = new Sdl.SDL_Rect(
                    0,
                    0,
                    (short)width,
                    (short)height);
                result = Sdl.SDL_FillRect(rgbSurfacePtr, ref rect, 0);

                Sdl.SDL_Rect rect2;

                IntPtr videoInfoPointer = Sdl.SDL_GetVideoInfo();
                if (videoInfoPointer == IntPtr.Zero)
                {
                    throw new ApplicationException(string.Format("Video query failed: {0}", Sdl.SDL_GetError()));
                }

                Sdl.SDL_VideoInfo videoInfo = (Sdl.SDL_VideoInfo)
                    Marshal.PtrToStructure(videoInfoPointer,
                    typeof(Sdl.SDL_VideoInfo));
                Console.WriteLine("Hi There");

                Sdl.SDL_PixelFormat pixelFormat = (Sdl.SDL_PixelFormat)
                    Marshal.PtrToStructure(videoInfo.vfmt,
                    typeof(Sdl.SDL_PixelFormat));

                Console.WriteLine(videoInfo.hw_available);
                Console.WriteLine(videoInfo.wm_available);
                Console.WriteLine(videoInfo.blit_hw);
                Console.WriteLine(videoInfo.blit_hw_CC);
                Console.WriteLine(videoInfo.blit_hw_A);
                Console.WriteLine(videoInfo.blit_sw);
                Console.WriteLine(videoInfo.blit_hw_CC);
                Console.WriteLine(videoInfo.blit_hw_A);
                Console.WriteLine(videoInfo.blit_fill);
                Console.WriteLine(videoInfo.video_mem);
                Console.WriteLine(pixelFormat.BitsPerPixel);
                Console.WriteLine(pixelFormat.BytesPerPixel);
                Console.WriteLine(pixelFormat.Rmask);
                Console.WriteLine(pixelFormat.Gmask);
                Console.WriteLine(pixelFormat.Bmask);
                Console.WriteLine(pixelFormat.Amask);

                int numevents = 10;
                Sdl.SDL_Event[] events = new Sdl.SDL_Event[numevents];
                events[0].type = Sdl.SDL_KEYDOWN;
                events[0].key.keysym.sym = (int)Sdl.SDLK_p;
                events[1].type = Sdl.SDL_KEYDOWN;
                events[1].key.keysym.sym = (int)Sdl.SDLK_z;
                int result2 = Sdl.SDL_PeepEvents(events, numevents, Sdl.SDL_ADDEVENT, Sdl.SDL_KEYDOWNMASK);
                Console.WriteLine("Addevent result: " + result2);

                while (quitFlag == false)
                {
                    result = Sdl.SDL_PollEvent(out evt);

                    if (evt.type == Sdl.SDL_QUIT)
                    {
                        quitFlag = true;
                    }
                    else if (evt.type == Sdl.SDL_KEYDOWN)
                    {
                        if ((evt.key.keysym.sym == (int)Sdl.SDLK_ESCAPE) ||
                            (evt.key.keysym.sym == (int)Sdl.SDLK_q))
                        {
                            quitFlag = true;
                        }
                        if (evt.key.keysym.sym == (int)Sdl.SDLK_p)
                        {
                            Console.WriteLine("Key p event was added");
                        }
                        if (evt.key.keysym.sym == (int)Sdl.SDLK_z)
                        {
                            Console.WriteLine("Key z event was added");
                        }
                    }

                    rect2 = new Sdl.SDL_Rect(
                        (short)rand.Next(-300, width),
                        (short)rand.Next(-300, height),
                        (short)rand.Next(20, 300),
                        (short)rand.Next(20, 300));

                    try
                    {
                        result = Sdl.SDL_FillRect(
                            surfacePtr,
                            ref rect2,
                            rand.Next(100000));
                        result = Sdl.SDL_BlitSurface(
                            rgbSurfacePtr,
                            ref rect2,
                            surfacePtr,
                            ref rect);
                        result = Sdl.SDL_Flip(surfacePtr);
                    }
                    catch (Exception) { }
                }
            }
            catch
            {
                Sdl.SDL_Quit();
                throw;
            }
            finally
            {
                Sdl.SDL_Quit();
            }
        }
示例#20
0
    private void HandleKeys()
    {
        Sdl.SDL_Event thisevent = new Sdl.SDL_Event();
        while (Sdl.SDL_PollEvent(out thisevent) > 0)
        {
            switch (thisevent.type)
            {
                case Sdl.SDL_KEYDOWN:
                    m_keyHandler.KeyDown(ConvertKeystroke(thisevent.key.keysym.sym));
                    break;

                case Sdl.SDL_KEYUP:
                    m_keyHandler.KeyUp(ConvertKeystroke(thisevent.key.keysym.sym));
                    break;

                case Sdl.SDL_QUIT:
                    this.Quit();
                    break;
            }
        }
    }
示例#21
0
        static string Update_GetKey()
        {
            Sdl.SDL_Event keyEvent, oldKeyEvent;
            Sdl.SDL_PollEvent(out keyEvent);

            while (keyEvent.type == Sdl.SDL_KEYDOWN)
            {
                Sdl.SDL_PollEvent(out keyEvent);
            }
            oldKeyEvent = keyEvent;
            //Draw();

            while (true)
            {
                Sdl.SDL_PollEvent(out keyEvent);
                Thread.Sleep(1);

                switch (keyEvent.type) //Test keyEvent
                {
                    //case 17: //Unknown, happens during keyboard freeze
                    case Sdl.SDL_KEYDOWN: //If a key is down
                        switch (keyEvent.key.keysym.sym)
                        {
                            #region Special
                            case Sdl.SDLK_ESCAPE:
                                return "Escape";

                            case Sdl.SDLK_PERIOD:
                                if (shift)
                                    return ">";
                                return ".";

                            case Sdl.SDLK_COMMA:
                                if (shift)
                                    return "<";
                                return ",";

                            case Sdl.SDLK_SPACE:
                                return "Space";

                            case Sdl.SDLK_BACKSPACE:
                                return "Backspace";

                            case Sdl.SDLK_RSHIFT:
                            case Sdl.SDLK_LSHIFT:
                                {
                                    shift = true; //Shift is down
                                    break;
                                }

                            case 271: //If enter aka "271" or "13" was pressed
                            case 13:
                                return "Enter";
                            #endregion

                            #region Numbers
                            case Sdl.SDLK_KP1:
                            case Sdl.SDLK_DELETE:
                                return "1";

                            case Sdl.SDLK_KP2:
                            case Sdl.SDLK_DOWN:
                                return "2";

                            case Sdl.SDLK_KP3:
                            case Sdl.SDLK_PAGEDOWN:
                                return "3";

                            case Sdl.SDLK_KP4:
                            case Sdl.SDLK_LEFT:
                                return "4";

                            case Sdl.SDLK_KP5:
                                return "5";

                            case Sdl.SDLK_KP6:
                            case Sdl.SDLK_RIGHT:
                                return "6";

                            case Sdl.SDLK_KP7:
                            case Sdl.SDLK_INSERT:
                                return "7";

                            case Sdl.SDLK_KP8:
                            case Sdl.SDLK_UP:
                                return "8";

                            case Sdl.SDLK_KP9:
                            case Sdl.SDLK_PAGEUP:
                                return "9";
                            #endregion

                            #region Letters
                            case Sdl.SDLK_a:
                                if (shift)
                                    return "A";
                                return "a";

                            case Sdl.SDLK_b:
                                if (shift)
                                    return "B";
                                return "b";

                            case Sdl.SDLK_c:
                                if (shift)
                                    return "C";
                                return "c";

                            case Sdl.SDLK_d:
                                if (shift)
                                    return "D";
                                return "d";

                            case Sdl.SDLK_e:
                                if (shift)
                                    return "E";
                                return "e";

                            case Sdl.SDLK_f:
                                if (shift)
                                    return "F";
                                return "f";

                            case Sdl.SDLK_g:
                                if (shift)
                                    return "G";
                                return "g";

                            case Sdl.SDLK_h:
                                if (shift)
                                    return "H";
                                return "h";

                            case Sdl.SDLK_i:
                                if (shift)
                                    return "I";
                                return "i";

                            case Sdl.SDLK_j:
                                if (shift)
                                    return "J";
                                return "j";

                            case Sdl.SDLK_k:
                                if (shift)
                                    return "K";
                                return "k";

                            case Sdl.SDLK_l:
                                if (shift)
                                    return "L";
                                return "l";

                            case Sdl.SDLK_m:
                                if (shift)
                                    return "M";
                                return "m";

                            case Sdl.SDLK_n:
                                if (shift)
                                    return "N";
                                return "n";

                            case Sdl.SDLK_o:
                                if (shift)
                                    return "O";
                                return "o";

                            case Sdl.SDLK_p:
                                if (shift)
                                    return "P";
                                return "p";

                            case Sdl.SDLK_q:
                                if (shift)
                                    return "Q";
                                return "q";

                            case Sdl.SDLK_r:
                                if (shift)
                                    return "R";
                                return "r";

                            case Sdl.SDLK_s:
                                if (shift)
                                    return "S";
                                return "s";

                            case Sdl.SDLK_t:
                                if (shift)
                                    return "T";
                                return "t";

                            case Sdl.SDLK_u:
                                if (shift)
                                    return "U";
                                return "u";

                            case Sdl.SDLK_v:
                                if (shift)
                                    return "V";
                                return "v";

                            case Sdl.SDLK_w:
                                if (shift)
                                    return "W";
                                return "w";

                            case Sdl.SDLK_x:
                                if (shift)
                                    return "X";
                                return "x";

                            case Sdl.SDLK_y:
                                if (shift)
                                    return "Y";
                                return "y";

                            case Sdl.SDLK_z:
                                if (shift)
                                    return "Z";
                                return "z";
                            #endregion

                            default:
                                break;
                        }

                        break;

                    case Sdl.SDL_KEYUP:
                        switch (keyEvent.key.keysym.sym)
                        {
                            case Sdl.SDLK_LSHIFT:
                            case Sdl.SDLK_RSHIFT:
                                shift = false;
                                break;
                        }
                        break;

                    default:
                        break;
                }

                oldKeyEvent.type = keyEvent.type; //Update this
            }
        }