diff --git a/source/simple/interactive/event.cpp b/source/simple/interactive/event.cpp
index 37a7a58533624419af01996aeb3158f0fca02058..16ba38f6e916b66f79709a2ac55726efd70f1f49 100644
--- a/source/simple/interactive/event.cpp
+++ b/source/simple/interactive/event.cpp
@@ -14,8 +14,8 @@ namespace simple::interactive
 				case SDL_KEYDOWN:
 					return key_pressed
 					{
-						event.key.windowID,
 						std::chrono::milliseconds(event.key.timestamp),
+						event.key.windowID,
 						static_cast<keycode>(event.key.keysym.sym),
 						static_cast<scancode>(event.key.keysym.scancode),
 						static_cast<keystate>(event.key.state),
@@ -24,8 +24,8 @@ namespace simple::interactive
 				case SDL_KEYUP:
 					return key_released
 					{
-						event.key.windowID,
 						std::chrono::milliseconds(event.key.timestamp),
+						event.key.windowID,
 						static_cast<keycode>(event.key.keysym.sym),
 						static_cast<scancode>(event.key.keysym.scancode),
 						static_cast<keystate>(event.key.state),
@@ -34,8 +34,8 @@ namespace simple::interactive
 				case SDL_MOUSEBUTTONDOWN:
 					return mouse_down
 					{
-						event.button.windowID,
 						std::chrono::milliseconds(event.button.timestamp),
+						event.button.windowID,
 						event.button.which,
 						{event.button.x, event.button.y},
 						static_cast<mouse_button>(event.button.button),
@@ -45,8 +45,8 @@ namespace simple::interactive
 				case SDL_MOUSEBUTTONUP:
 					return mouse_up
 					{
-						event.button.windowID,
 						std::chrono::milliseconds(event.button.timestamp),
+						event.button.windowID,
 						event.button.which,
 						{event.button.x, event.button.y},
 						static_cast<mouse_button>(event.button.button),
@@ -58,8 +58,8 @@ namespace simple::interactive
 				case SDL_MOUSEMOTION:
 					return mouse_motion
 					{
-						event.motion.windowID,
 						std::chrono::milliseconds(event.motion.timestamp),
+						event.motion.windowID,
 						event.motion.which,
 						{event.motion.x, event.motion.y},
 						{event.motion.xrel, event.motion.yrel},
@@ -68,14 +68,17 @@ namespace simple::interactive
 				case SDL_MOUSEWHEEL:
 					return mouse_wheel
 					{
-						event.wheel.windowID,
 						std::chrono::milliseconds(event.wheel.timestamp),
+						event.wheel.windowID,
 						event.wheel.which,
 						{event.wheel.x, event.wheel.y},
 #if SDL_VERSION_ATLEAST(2,0,4)
 						static_cast<wheel_direction>(event.wheel.direction),
 #endif
 					};
+
+				case SDL_QUIT:
+					return quit_request{};
 			}
 		}
 		return std::nullopt;
@@ -120,7 +123,7 @@ namespace simple::interactive
 		return result;
 	}
 
-	std::optional<float2> window_normalized_position(const common_mouse_data& data) noexcept
+	std::optional<float2> window_normalized_position(const mouse_data& data) noexcept
 	{
 		return window_normalized(data.window_id, data.position);
 	}
@@ -155,7 +158,7 @@ namespace simple::interactive
 		return result;
 	}
 
-	std::optional<float2> screen_normalized_position(const common_mouse_data& data) noexcept
+	std::optional<float2> screen_normalized_position(const mouse_data& data) noexcept
 	{
 		return screen_normalized(data.window_id, data.position);
 	}
diff --git a/source/simple/interactive/event.h b/source/simple/interactive/event.h
index 033388368cc1d586297a4b4606fe3f4a1e17a0cb..977262b160d9114361508ae72f109d51b22bcd7c 100644
--- a/source/simple/interactive/event.h
+++ b/source/simple/interactive/event.h
@@ -48,13 +48,17 @@ namespace simple::interactive
 
 	constexpr uint32_t touch_mouse_id = SDL_TOUCH_MOUSEID;
 
-	struct common_data
+	struct event_data
 	{
-		uint32_t window_id;
 		std::chrono::milliseconds timestamp;
 	};
 
-	struct key_data : public common_data
+	struct window_event_data : public event_data
+	{
+		uint32_t window_id;
+	};
+
+	struct key_data : public window_event_data
 	{
 		enum keycode keycode;
 		enum scancode scancode;
@@ -62,13 +66,13 @@ namespace simple::interactive
 		uint8_t repeat;
 	};
 
-	struct common_mouse_data : public common_data
+	struct mouse_data : public window_event_data
 	{
 		uint32_t mouse_id;
 		int2 position;
 	};
 
-	struct mouse_button_data : public common_mouse_data
+	struct mouse_button_data : public mouse_data
 	{
 		mouse_button button;
 		keystate state;
@@ -77,13 +81,13 @@ namespace simple::interactive
 #endif
 	};
 
-	struct mouse_motion_data : public common_mouse_data
+	struct mouse_motion_data : public mouse_data
 	{
 		int2 motion;
 		mouse_button_mask button_state;
 	};
 
-	struct mouse_wheel_data : public common_mouse_data
+	struct mouse_wheel_data : public mouse_data
 	{
 #if SDL_VERSION_ATLEAST(2,0,4)
 		wheel_direction direction;
@@ -101,15 +105,15 @@ namespace simple::interactive
 	struct key_released : key_event
 	{};
 
-	std::optional<float2> window_normalized_position(const common_mouse_data& data) noexcept;
-	std::optional<float2> screen_normalized_position(const common_mouse_data& data) noexcept;
+	std::optional<float2> window_normalized_position(const mouse_data& data) noexcept;
+	std::optional<float2> screen_normalized_position(const mouse_data& data) noexcept;
 	std::optional<float2> window_normalized_motion(const mouse_motion_data& data) noexcept;
 	std::optional<float2> screen_normalized_motion(const mouse_motion_data& data) noexcept;
 
-	template<typename event_data>
+	template<typename Data>
 	struct mouse_position_event
 	{
-		const event_data data;
+		const Data data;
 		auto window_normalized_position() const noexcept { return interactive::window_normalized_position(data); }
 		auto screen_normalized_position() const noexcept { return interactive::screen_normalized_position(data); }
 	};
@@ -138,6 +142,11 @@ namespace simple::interactive
 	struct mouse_up : public mouse_button_event
 	{};
 
+	struct quit_request
+	{
+		const event_data data;
+	};
+
 	using event = std::variant<
 		key_pressed
 		,key_released
@@ -145,6 +154,7 @@ namespace simple::interactive
 		,mouse_up
 		,mouse_motion
 		,mouse_wheel
+		,quit_request
 	>;
 
 	std::optional<event> next_event() noexcept;