Here is our window class we'll be using as a wrapper for the SDL_Window. It has a constructor, a initializer that creates the window, a function to create renderer from the window,
an event handler, a deallocator, and some accessor functions to get various attributes from the window.

In terms of data members, we have the window we're wrapping, the dimensions of the window, and flags for the types of focus the windows has. We'll go into more detail further in the
program.

Our initialization function creates the window with the SDL_WINDOW_RESIZABLE flag which allows for our window
to be resizable. If the function succeeds we set the corresponding flags and dimensions. Then we return whether the window is null or not.

In our window's event handler we'll be looking for events of type SDL_WINDOWEVENT. SDL_WindowEvents are actually
a family of events. Depending on the event we may have to update the caption of the window, so we have a flag that keeps track of that.

When we have a window event we then want to check the SDL_WindowEventID to see what type of event it is.
An SDL_WINDOWEVENT_SIZE_CHANGED is a resize event, so we get the new dimensions and refresh the image on the screen.

An SDL_WINDOWEVENT_EXPOSED just means that window was obscured in some way and now is not obscured so we want to repaint the window.

SDL_WINDOWEVENT_ENTER/SDL_WINDOWEVENT_LEAVE handles when the mouse moves into and out of the window. SDL_WINDOWEVENT_FOCUS_GAINED/SDL_WINDOWEVENT_FOCUS_LOST have to do when the
window is getting input from the keyboard. Since our caption keeps track of mouse/keyboard focus, we set the update caption flag when any of these events happen.

In the main loop we make sure to pass events to the window wrapper to handle resize events and in the rendering part of our code we make sure to only render when the window is not
minimized because this can cause some bugs when we try to render to a minimized window.