// delegateWindowEvent handles window events and delegates them to the pacakges // that handle those events. func delegateWindowEvent(event sdl.Event, e *sdl.WindowEvent) { switch e.Type { case sdl.WINDOWEVENT_NONE: return case sdl.WINDOWEVENT_ENTER, sdl.WINDOWEVENT_LEAVE: mouse.Delegate(event) default: switch e.Event { case sdl.WINDOWEVENT_NONE: return case sdl.WINDOWEVENT_ENTER, sdl.WINDOWEVENT_LEAVE: mouse.Delegate(event) case sdl.WINDOWEVENT_SHOWN, sdl.WINDOWEVENT_FOCUS_GAINED: gfx.SetActive(true) case sdl.WINDOWEVENT_HIDDEN, sdl.WINDOWEVENT_FOCUS_LOST: gfx.SetActive(false) case sdl.WINDOWEVENT_RESIZED, sdl.WINDOWEVENT_SIZE_CHANGED: w, h := window.GetDrawableSize() gfx.SetViewportSize(w, h) case sdl.WINDOWEVENT_CLOSE: window.Close(true) } window.Delegate(e) } }
// Poll is used by the game loop to gather events and delegate to each pacakge. // Generally you should not have to use this method however if you are doing your // own game loop this should be called at the end. func Poll() { for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() { switch e := event.(type) { case *sdl.WindowEvent: delegateWindowEvent(event, e) case *sdl.KeyDownEvent, *sdl.KeyUpEvent, *sdl.TextEditingEvent, *sdl.TextInputEvent: keyboard.Delegate(e) case *sdl.MouseMotionEvent, *sdl.MouseButtonEvent, *sdl.MouseWheelEvent: mouse.Delegate(e) case *sdl.JoyAxisEvent, *sdl.JoyBallEvent, *sdl.JoyHatEvent, *sdl.JoyButtonEvent, *sdl.JoyDeviceEvent, *sdl.ControllerAxisEvent, *sdl.ControllerButtonEvent, *sdl.ControllerDeviceEvent: joystick.Delegate(e) case *sdl.TouchFingerEvent: touch.Delegate(e) case *sdl.QuitEvent: window.Close(true) case *sdl.DropEvent, *sdl.RenderEvent, *sdl.UserEvent, *sdl.ClipboardEvent, *sdl.OSEvent, *sdl.CommonEvent: //discard not used in amore yet } } }
// Quit will prepare the window to close at the end of the next game loop. This // will allow a nice clean destruction of all object that are allocated in OpenGL, // SDL, and OpenAl func Quit() { window.Close(true) }