Index: trunk/nv/detail/io_event_list.inc
===================================================================
--- trunk/nv/detail/io_event_list.inc	(revision 67)
+++ trunk/nv/detail/io_event_list.inc	(revision 67)
@@ -0,0 +1,4 @@
+NV_IO_EVENT( EV_KEY )
+NV_IO_EVENT( EV_MOUSE_BUTTON )
+NV_IO_EVENT( EV_MOUSE_MOVE )
+NV_IO_EVENT( EV_SYSTEM )
Index: trunk/nv/detail/key_list.inc
===================================================================
--- trunk/nv/detail/key_list.inc	(revision 67)
+++ trunk/nv/detail/key_list.inc	(revision 67)
@@ -0,0 +1,56 @@
+NV_KEY( KEY_NONE    , 0 )
+NV_KEY( KEY_BACK    , 8 )
+NV_KEY( KEY_TAB     , 9 )
+
+NV_KEY( KEY_ENTER   , 13 )
+NV_KEY( KEY_PGUP    , 14 )
+NV_KEY( KEY_PGDOWN  , 15 )
+NV_KEY( KEY_END     , 16 )
+NV_KEY( KEY_HOME    , 17 )
+NV_KEY( KEY_LEFT    , 18 )
+NV_KEY( KEY_UP      , 19 )
+NV_KEY( KEY_RIGHT   , 20 )
+NV_KEY( KEY_DOWN    , 21 )
+
+NV_KEY( KEY_ESCAPE  , 27 )
+
+
+NV_KEY( KEY_SPACE   , 32 )
+
+NV_KEY( KEY_0       , 48 )
+NV_KEY( KEY_1       , 49 )
+NV_KEY( KEY_2       , 50 )
+NV_KEY( KEY_3       , 51 )
+NV_KEY( KEY_4       , 52 )
+NV_KEY( KEY_5       , 53 )
+NV_KEY( KEY_6       , 54 )
+NV_KEY( KEY_7       , 55 )
+NV_KEY( KEY_8       , 56 )
+NV_KEY( KEY_9       , 57 )
+
+NV_KEY( KEY_A       , 65 )
+NV_KEY( KEY_B       , 66 )
+NV_KEY( KEY_C       , 67 )
+NV_KEY( KEY_D       , 68 )
+NV_KEY( KEY_E       , 69 )
+NV_KEY( KEY_F       , 70 )
+NV_KEY( KEY_G       , 71 )
+NV_KEY( KEY_H       , 72 )
+NV_KEY( KEY_I       , 73 )
+NV_KEY( KEY_J       , 74 )
+NV_KEY( KEY_K       , 75 )
+NV_KEY( KEY_L       , 76 )
+NV_KEY( KEY_M       , 77 )
+NV_KEY( KEY_N       , 78 )
+NV_KEY( KEY_O       , 79 )
+NV_KEY( KEY_P       , 80 )
+NV_KEY( KEY_Q       , 81 )
+NV_KEY( KEY_R       , 82 )
+NV_KEY( KEY_S       , 83 )
+NV_KEY( KEY_T       , 84 )
+NV_KEY( KEY_U       , 85 )
+NV_KEY( KEY_V       , 86 )
+NV_KEY( KEY_W       , 87 )
+NV_KEY( KEY_X       , 88 )
+NV_KEY( KEY_Y       , 89 )
+NV_KEY( KEY_Z       , 90 )
Index: trunk/nv/detail/mouse_list.inc
===================================================================
--- trunk/nv/detail/mouse_list.inc	(revision 67)
+++ trunk/nv/detail/mouse_list.inc	(revision 67)
@@ -0,0 +1,6 @@
+NV_MOUSE( MOUSE_NONE,       0 )
+NV_MOUSE( MOUSE_LEFT,       1 )
+NV_MOUSE( MOUSE_MIDDLE,     2 )
+NV_MOUSE( MOUSE_RIGHT,      3 )
+NV_MOUSE( MOUSE_WHEEL_UP,   4 )
+NV_MOUSE( MOUSE_WHEEL_DOWN, 5 )
Index: trunk/nv/io_event.hh
===================================================================
--- trunk/nv/io_event.hh	(revision 67)
+++ trunk/nv/io_event.hh	(revision 67)
@@ -0,0 +1,124 @@
+// 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
+
+/**
+ * @file io_event.hh
+ * @author Kornel Kisielewicz
+ * @brief 
+ */
+
+#ifndef NV_IO_EVENT_HH
+#define NV_IO_EVENT_HH
+
+#include <nv/common.hh>
+#include <nv/types.hh>
+
+namespace nv
+{
+
+	// Generate the key_code enum
+	enum key_code
+	{
+#	define NV_KEY( id, val ) id = val,
+#		include <nv/detail/key_list.inc>
+#	undef NV_KEY
+	};
+	NV_REGISTER_NAME( key_code );
+
+	// Generate the mouse_code enum
+	enum mouse_code
+	{
+#	define NV_MOUSE( id, val ) id = val,
+#		include <nv/detail/mouse_list.inc>
+#	undef NV_MOUSE
+	};
+	NV_REGISTER_NAME( mouse_code );
+
+	// Generate the io_event_code enum
+	enum io_event_code
+	{
+#	define NV_IO_EVENT( id ) id,
+#		include <nv/detail/io_event_list.inc>
+#	undef NV_IO_EVENT
+	};
+	NV_REGISTER_NAME( io_event_code );
+
+	struct key_event
+	{
+		/// Input event ASCII code
+		char8 ascii;
+
+		/// Input event local code
+		key_code code;
+
+		/// True if shift key is present
+		bool shift;
+
+		/// True if control key is present
+		bool control;
+
+		/// True if alt key is present
+		bool alt;
+
+		/// True if pressed
+		bool pressed;
+	};
+	NV_REGISTER_NAME( key_event );
+
+	struct mouse_button_event
+	{
+		uint16 x;
+		uint16 y;
+		///
+		uint32 button;
+		/// True if pressed
+		bool pressed;
+		/// Mouse button code
+		mouse_code code;
+	};
+	NV_REGISTER_NAME( mouse_button_event );
+
+	struct mouse_move_event
+	{
+		uint16 x;
+		uint16 y;
+		sint16 rx;
+		sint16 ry;
+		/// True if pressed
+		bool pressed;
+		/// Mouse button code
+		mouse_code code;
+	};
+	NV_REGISTER_NAME( mouse_move_event );
+
+	struct system_event
+	{
+		uint8  sys_type;
+		uint32 param1;
+		uint32 param2;
+	};
+	NV_REGISTER_NAME( system_event );
+
+	struct input_event
+	{
+		io_event_code type;
+		union
+		{
+			key_event          key;
+			mouse_button_event mbutton;
+			mouse_move_event   mmove;
+			system_event       system;
+		};
+	};
+	NV_REGISTER_NAME( input_event );
+
+	const char* get_key_name( key_code key );
+	const char* get_mouse_name( mouse_code button );
+	const char* get_io_event_name( io_event_code event );
+	void register_io_types( type_database* db );
+}
+
+#endif // NV_IO_EVENT_HH
Index: trunk/nv/types.hh
===================================================================
--- trunk/nv/types.hh	(revision 66)
+++ trunk/nv/types.hh	(revision 67)
@@ -304,5 +304,5 @@
 			for (int i = 0; i < SIZE; i++)
 			{
-				enum_list.push_back( init_enums[i] )
+				enum_list.push_back( init_enums[i] );
 			}
 			return *this;
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 );
+}
