Figured out how to support multiple viewports

Also fixed zooming, and made all input handling event based