diff --git a/Sources/SwiftFrontend/Application.swift b/Sources/SwiftFrontend/Application.swift index f7a24ec..d47be0c 100644 --- a/Sources/SwiftFrontend/Application.swift +++ b/Sources/SwiftFrontend/Application.swift @@ -8,51 +8,84 @@ import Foundation import SDL3 -struct Application { - func run() -> Int32 { +class Application { + private var window: OpaquePointer? = nil + private var renderer: OpaquePointer? = nil + + private func initialize() -> ApplicationExecutionState { guard SDL_Init(SDL_INIT_VIDEO) >= 0 else { - print("SDL init failed.") - return 1 + print("SDL_Init() error: \(String(cString: SDL_GetError()))") + return .exitFailure } - - defer { - SDL_Quit() + + window = SDL_CreateWindow("Hello World", 512, 512, 0) + guard window != nil else { + print("SDL_CreateWindow() error: \(String(cString: SDL_GetError()))") + return .exitFailure } - - guard let window = SDL_CreateWindow("Hello World", 512, 512, 0) else { - return 1 + + renderer = SDL_CreateRenderer(window, nil) + guard renderer != nil else { + print("SDL_CreateRenderer() error: \(String(cString: SDL_GetError()))") + return .exitFailure } - - defer { - SDL_DestroyWindow(window) + + return .running + } + + private func deinitialize() { + SDL_DestroyRenderer(renderer) + SDL_DestroyWindow(window) + SDL_Quit() + } + + private func handleEvent(_ event: SDL_Event) -> ApplicationExecutionState { + switch SDL_EventType(event.type) { + case SDL_EVENT_QUIT: + return .exitSuccess + + case SDL_EVENT_KEY_DOWN: + switch event.key.key { + case SDLK_ESCAPE: + return .exitSuccess + default: + break + } + return .running + + default: + return .running } - - let renderer = SDL_CreateRenderer(window, nil) - - defer { - SDL_DestroyRenderer(renderer) - } - - quit: while true { + } + + private func paint() -> ApplicationExecutionState { + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255) + SDL_RenderClear(renderer) + var rect = SDL_FRect(x: 0, y: 0, w: 100, h: 100) + SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255) + SDL_RenderFillRect(renderer, &rect) + SDL_RenderPresent(renderer) + return .running + } + + func run() -> Int32 { + var res = initialize() + quit: while res == .running { var event = SDL_Event() - while SDL_PollEvent(&event) > 0 { - switch SDL_EventType(event.type) { - case SDL_EVENT_QUIT: + res = handleEvent(event) + if res != .running { break quit - default: - break } } - - SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255) - SDL_RenderClear(renderer) - var rect = SDL_FRect(x: 0, y: 0, w: 100, h: 100) - SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255) - SDL_RenderFillRect(renderer, &rect) - SDL_RenderPresent(renderer) + res = paint() } - - return 0 + return res == .exitSuccess ? 0 : 1 } } + +fileprivate enum ApplicationExecutionState { + case exitFailure + case exitSuccess + case running +}