Index: trunk/src/io_event.cc
===================================================================
--- trunk/src/io_event.cc	(revision 67)
+++ trunk/src/io_event.cc	(revision 67)
@@ -0,0 +1,102 @@
+// Copyright (C) 2012-2013 ChaosForge / Kornel Kisielewicz
+// http://chaosforge.org/
+//
+// This file is part of NV Libraries.
+// For conditions of distribution and use, see copyright notice in nv.hh
+
+#include "nv/io_event.hh"
+
+using namespace nv;
+
+const char* get_key_name( key_code key )
+{
+	switch ( key )
+	{
+#	define NV_KEY( id, val ) case id : return #id;
+#		include <nv/detail/key_list.inc>
+#	undef NV_KEY
+default: return "KEY_UNKNOWN";
+	};
+}
+
+const char* get_mouse_name( mouse_code button )
+{
+	switch ( button )
+	{
+#	define NV_MOUSE( id, val ) case id : return #id;
+#		include <nv/detail/mouse_list.inc>
+#	undef NV_MOUSE
+default: return "MOUSE_UNKNOWN";
+	};
+}
+
+const char* get_io_event_name( io_event_code event )
+{
+	switch ( event )
+	{
+#	define NV_IO_EVENT( id ) case id : return #id;
+#		include <nv/detail/io_event_list.inc>
+#	undef NV_IO_EVENT
+default: return "EV_UNKNOWN";
+	};
+}
+
+void register_io_types( type_database* db )
+{
+	type_enum key_enums[] = {
+#	define NV_KEY( id, val ) type_enum( #id, id ),
+#		include <nv/detail/key_list.inc>
+#	undef NV_KEY
+	};
+	db->create_type<key_code>().enums( key_enums );
+
+	type_enum mouse_enums[] = {
+#	define NV_MOUSE( id, val ) type_enum( #id, id ),
+#		include <nv/detail/mouse_list.inc>
+#	undef NV_MOUSE
+	};
+	db->create_type<mouse_code>().enums( mouse_enums );
+
+	type_enum io_event_enums[] = {
+#	define NV_IO_EVENT( id ) type_enum( #id, id ),
+#		include <nv/detail/io_event_list.inc>
+#	undef NV_IO_EVENT
+	};
+	db->create_type<io_event_code>().enums( io_event_enums );
+
+	type_field key_fields[] = {
+		type_field( "ascii",   &key_event::ascii ),
+		type_field( "code",    &key_event::code ),
+		type_field( "shift",   &key_event::shift ),
+		type_field( "control", &key_event::control ),
+		type_field( "alt",     &key_event::alt ),
+		type_field( "pressed", &key_event::pressed ),
+	};
+	db->create_type<key_event>().fields( key_fields );
+
+	type_field mouse_button_fields[] = {
+		type_field( "x",       &mouse_button_event::x ),
+		type_field( "y",       &mouse_button_event::y ),
+		type_field( "button",  &mouse_button_event::button ),
+		type_field( "pressed", &mouse_button_event::pressed ),
+		type_field( "code",    &mouse_button_event::code ),
+	};
+	db->create_type<mouse_button_event>().fields( mouse_button_fields );
+
+	type_field mouse_move_fields[] = {
+		type_field( "x",       &mouse_move_event::x ),
+		type_field( "y",       &mouse_move_event::y ),
+		type_field( "rx",      &mouse_move_event::rx ),
+		type_field( "ry",      &mouse_move_event::ry ),
+		type_field( "pressed", &mouse_move_event::pressed ),
+		type_field( "code",    &mouse_move_event::code ),
+	};
+	db->create_type<mouse_move_event>().fields( mouse_move_fields );
+
+	type_field system_fields[] = {
+		type_field( "sys_type", &system_event::sys_type ),
+		type_field( "param1",   &system_event::param1 ),
+		type_field( "param2",   &system_event::param2 ),
+	};
+	db->create_type<system_event>().fields( system_fields );
+}
