#include "enums.h"
#include <SDL.h>

Napi::Value
enums::get(const Napi::CallbackInfo &info)
{
	Napi::Env env = info.Env();

	Napi::Object pixel_formats = Napi::Object::New(env);
	pixel_formats.Set("rgb332", (int) SDL_PIXELFORMAT_RGB332);
	pixel_formats.Set("rgb444", (int) SDL_PIXELFORMAT_RGB444);
	pixel_formats.Set("rgb555", (int) SDL_PIXELFORMAT_RGB555);
	pixel_formats.Set("bgr555", (int) SDL_PIXELFORMAT_BGR555);
	pixel_formats.Set("argb4444", (int) SDL_PIXELFORMAT_ARGB4444);
	pixel_formats.Set("rgba4444", (int) SDL_PIXELFORMAT_RGBA4444);
	pixel_formats.Set("abgr4444", (int) SDL_PIXELFORMAT_ABGR4444);
	pixel_formats.Set("bgra4444", (int) SDL_PIXELFORMAT_BGRA4444);
	pixel_formats.Set("argb1555", (int) SDL_PIXELFORMAT_ARGB1555);
	pixel_formats.Set("rgba5551", (int) SDL_PIXELFORMAT_RGBA5551);
	pixel_formats.Set("abgr1555", (int) SDL_PIXELFORMAT_ABGR1555);
	pixel_formats.Set("bgra5551", (int) SDL_PIXELFORMAT_BGRA5551);
	pixel_formats.Set("rgb565", (int) SDL_PIXELFORMAT_RGB565);
	pixel_formats.Set("bgr565", (int) SDL_PIXELFORMAT_BGR565);
	pixel_formats.Set("rgb24", (int) SDL_PIXELFORMAT_RGB24);
	pixel_formats.Set("bgr24", (int) SDL_PIXELFORMAT_BGR24);
	pixel_formats.Set("rgb888", (int) SDL_PIXELFORMAT_RGB888);
	pixel_formats.Set("rgbx8888", (int) SDL_PIXELFORMAT_RGBX8888);
	pixel_formats.Set("bgr888", (int) SDL_PIXELFORMAT_BGR888);
	pixel_formats.Set("bgrx8888", (int) SDL_PIXELFORMAT_BGRX8888);
	pixel_formats.Set("argb8888", (int) SDL_PIXELFORMAT_ARGB8888);
	pixel_formats.Set("rgba8888", (int) SDL_PIXELFORMAT_RGBA8888);
	pixel_formats.Set("abgr8888", (int) SDL_PIXELFORMAT_ABGR8888);
	pixel_formats.Set("bgra8888", (int) SDL_PIXELFORMAT_BGRA8888);
	pixel_formats.Set("argb2101010", (int) SDL_PIXELFORMAT_ARGB2101010);
	pixel_formats.Set("rgba32", (int) SDL_PIXELFORMAT_RGBA32);
	pixel_formats.Set("argb32", (int) SDL_PIXELFORMAT_ARGB32);
	pixel_formats.Set("bgra32", (int) SDL_PIXELFORMAT_BGRA32);
	pixel_formats.Set("abgr32", (int) SDL_PIXELFORMAT_ABGR32);
	pixel_formats.Set("yv12", (int) SDL_PIXELFORMAT_YV12);
	pixel_formats.Set("iyuv", (int) SDL_PIXELFORMAT_IYUV);
	pixel_formats.Set("yuy2", (int) SDL_PIXELFORMAT_YUY2);
	pixel_formats.Set("uyvy", (int) SDL_PIXELFORMAT_UYVY);
	pixel_formats.Set("yvyu", (int) SDL_PIXELFORMAT_YVYU);
	pixel_formats.Set("nv12", (int) SDL_PIXELFORMAT_NV12);
	pixel_formats.Set("nv21", (int) SDL_PIXELFORMAT_NV21);

	Napi::Object scale_mode = Napi::Object::New(env);
	scale_mode.Set("nearest", (int) SDL_ScaleModeNearest);
	scale_mode.Set("linear", (int) SDL_ScaleModeLinear);
	scale_mode.Set("best", (int) SDL_ScaleModeBest);

	Napi::Object audio_formats = Napi::Object::New(env);
	audio_formats.Set("s8", (int) AUDIO_S8);
	audio_formats.Set("u8", (int) AUDIO_U8);
	audio_formats.Set("s16lsb", (int) AUDIO_S16LSB);
	audio_formats.Set("s16msb", (int) AUDIO_S16MSB);
	audio_formats.Set("s16sys", (int) AUDIO_S16SYS);
	audio_formats.Set("s16", (int) AUDIO_S16);
	audio_formats.Set("u16lsb", (int) AUDIO_U16LSB);
	audio_formats.Set("u16msb", (int) AUDIO_U16MSB);
	audio_formats.Set("u16sys", (int) AUDIO_U16SYS);
	audio_formats.Set("u16", (int) AUDIO_U16);
	audio_formats.Set("s32lsb", (int) AUDIO_S32LSB);
	audio_formats.Set("s32msb", (int) AUDIO_S32MSB);
	audio_formats.Set("s32sys", (int) AUDIO_S32SYS);
	audio_formats.Set("s32", (int) AUDIO_S32);
	audio_formats.Set("f32lsb", (int) AUDIO_F32LSB);
	audio_formats.Set("f32msb", (int) AUDIO_F32MSB);
	audio_formats.Set("f32sys", (int) AUDIO_F32SYS);
	audio_formats.Set("f32", (int) AUDIO_F32);

	Napi::Object scancodes = Napi::Object::New(env);
	// scancodes.Set("UNKNOWN", (int) SDL_SCANCODE_UNKNOWN)); // js will use null here
	scancodes.Set("A", (int) SDL_SCANCODE_A);
	scancodes.Set("B", (int) SDL_SCANCODE_B);
	scancodes.Set("C", (int) SDL_SCANCODE_C);
	scancodes.Set("D", (int) SDL_SCANCODE_D);
	scancodes.Set("E", (int) SDL_SCANCODE_E);
	scancodes.Set("F", (int) SDL_SCANCODE_F);
	scancodes.Set("G", (int) SDL_SCANCODE_G);
	scancodes.Set("H", (int) SDL_SCANCODE_H);
	scancodes.Set("I", (int) SDL_SCANCODE_I);
	scancodes.Set("J", (int) SDL_SCANCODE_J);
	scancodes.Set("K", (int) SDL_SCANCODE_K);
	scancodes.Set("L", (int) SDL_SCANCODE_L);
	scancodes.Set("M", (int) SDL_SCANCODE_M);
	scancodes.Set("N", (int) SDL_SCANCODE_N);
	scancodes.Set("O", (int) SDL_SCANCODE_O);
	scancodes.Set("P", (int) SDL_SCANCODE_P);
	scancodes.Set("Q", (int) SDL_SCANCODE_Q);
	scancodes.Set("R", (int) SDL_SCANCODE_R);
	scancodes.Set("S", (int) SDL_SCANCODE_S);
	scancodes.Set("T", (int) SDL_SCANCODE_T);
	scancodes.Set("U", (int) SDL_SCANCODE_U);
	scancodes.Set("V", (int) SDL_SCANCODE_V);
	scancodes.Set("W", (int) SDL_SCANCODE_W);
	scancodes.Set("X", (int) SDL_SCANCODE_X);
	scancodes.Set("Y", (int) SDL_SCANCODE_Y);
	scancodes.Set("Z", (int) SDL_SCANCODE_Z);
	scancodes.Set("1", (int) SDL_SCANCODE_1);
	scancodes.Set("2", (int) SDL_SCANCODE_2);
	scancodes.Set("3", (int) SDL_SCANCODE_3);
	scancodes.Set("4", (int) SDL_SCANCODE_4);
	scancodes.Set("5", (int) SDL_SCANCODE_5);
	scancodes.Set("6", (int) SDL_SCANCODE_6);
	scancodes.Set("7", (int) SDL_SCANCODE_7);
	scancodes.Set("8", (int) SDL_SCANCODE_8);
	scancodes.Set("9", (int) SDL_SCANCODE_9);
	scancodes.Set("0", (int) SDL_SCANCODE_0);
	scancodes.Set("RETURN", (int) SDL_SCANCODE_RETURN);
	scancodes.Set("ESCAPE", (int) SDL_SCANCODE_ESCAPE);
	scancodes.Set("BACKSPACE", (int) SDL_SCANCODE_BACKSPACE);
	scancodes.Set("TAB", (int) SDL_SCANCODE_TAB);
	scancodes.Set("SPACE", (int) SDL_SCANCODE_SPACE);
	scancodes.Set("MINUS", (int) SDL_SCANCODE_MINUS);
	scancodes.Set("EQUALS", (int) SDL_SCANCODE_EQUALS);
	scancodes.Set("LEFTBRACKET", (int) SDL_SCANCODE_LEFTBRACKET);
	scancodes.Set("RIGHTBRACKET", (int) SDL_SCANCODE_RIGHTBRACKET);
	scancodes.Set("BACKSLASH", (int) SDL_SCANCODE_BACKSLASH);
	scancodes.Set("NONUSHASH", (int) SDL_SCANCODE_NONUSHASH);
	scancodes.Set("SEMICOLON", (int) SDL_SCANCODE_SEMICOLON);
	scancodes.Set("APOSTROPHE", (int) SDL_SCANCODE_APOSTROPHE);
	scancodes.Set("GRAVE", (int) SDL_SCANCODE_GRAVE);
	scancodes.Set("COMMA", (int) SDL_SCANCODE_COMMA);
	scancodes.Set("PERIOD", (int) SDL_SCANCODE_PERIOD);
	scancodes.Set("SLASH", (int) SDL_SCANCODE_SLASH);
	scancodes.Set("CAPSLOCK", (int) SDL_SCANCODE_CAPSLOCK);
	scancodes.Set("F1", (int) SDL_SCANCODE_F1);
	scancodes.Set("F2", (int) SDL_SCANCODE_F2);
	scancodes.Set("F3", (int) SDL_SCANCODE_F3);
	scancodes.Set("F4", (int) SDL_SCANCODE_F4);
	scancodes.Set("F5", (int) SDL_SCANCODE_F5);
	scancodes.Set("F6", (int) SDL_SCANCODE_F6);
	scancodes.Set("F7", (int) SDL_SCANCODE_F7);
	scancodes.Set("F8", (int) SDL_SCANCODE_F8);
	scancodes.Set("F9", (int) SDL_SCANCODE_F9);
	scancodes.Set("F10", (int) SDL_SCANCODE_F10);
	scancodes.Set("F11", (int) SDL_SCANCODE_F11);
	scancodes.Set("F12", (int) SDL_SCANCODE_F12);
	scancodes.Set("PRINTSCREEN", (int) SDL_SCANCODE_PRINTSCREEN);
	scancodes.Set("SCROLLLOCK", (int) SDL_SCANCODE_SCROLLLOCK);
	scancodes.Set("PAUSE", (int) SDL_SCANCODE_PAUSE);
	scancodes.Set("INSERT", (int) SDL_SCANCODE_INSERT);
	scancodes.Set("HOME", (int) SDL_SCANCODE_HOME);
	scancodes.Set("PAGEUP", (int) SDL_SCANCODE_PAGEUP);
	scancodes.Set("DELETE", (int) SDL_SCANCODE_DELETE);
	scancodes.Set("END", (int) SDL_SCANCODE_END);
	scancodes.Set("PAGEDOWN", (int) SDL_SCANCODE_PAGEDOWN);
	scancodes.Set("RIGHT", (int) SDL_SCANCODE_RIGHT);
	scancodes.Set("LEFT", (int) SDL_SCANCODE_LEFT);
	scancodes.Set("DOWN", (int) SDL_SCANCODE_DOWN);
	scancodes.Set("UP", (int) SDL_SCANCODE_UP);
	scancodes.Set("NUMLOCKCLEAR", (int) SDL_SCANCODE_NUMLOCKCLEAR);
	scancodes.Set("KP_DIVIDE", (int) SDL_SCANCODE_KP_DIVIDE);
	scancodes.Set("KP_MULTIPLY", (int) SDL_SCANCODE_KP_MULTIPLY);
	scancodes.Set("KP_MINUS", (int) SDL_SCANCODE_KP_MINUS);
	scancodes.Set("KP_PLUS", (int) SDL_SCANCODE_KP_PLUS);
	scancodes.Set("KP_ENTER", (int) SDL_SCANCODE_KP_ENTER);
	scancodes.Set("KP_1", (int) SDL_SCANCODE_KP_1);
	scancodes.Set("KP_2", (int) SDL_SCANCODE_KP_2);
	scancodes.Set("KP_3", (int) SDL_SCANCODE_KP_3);
	scancodes.Set("KP_4", (int) SDL_SCANCODE_KP_4);
	scancodes.Set("KP_5", (int) SDL_SCANCODE_KP_5);
	scancodes.Set("KP_6", (int) SDL_SCANCODE_KP_6);
	scancodes.Set("KP_7", (int) SDL_SCANCODE_KP_7);
	scancodes.Set("KP_8", (int) SDL_SCANCODE_KP_8);
	scancodes.Set("KP_9", (int) SDL_SCANCODE_KP_9);
	scancodes.Set("KP_0", (int) SDL_SCANCODE_KP_0);
	scancodes.Set("KP_PERIOD", (int) SDL_SCANCODE_KP_PERIOD);
	scancodes.Set("NONUSBACKSLASH", (int) SDL_SCANCODE_NONUSBACKSLASH);
	scancodes.Set("APPLICATION", (int) SDL_SCANCODE_APPLICATION);
	scancodes.Set("POWER", (int) SDL_SCANCODE_POWER);
	scancodes.Set("KP_EQUALS", (int) SDL_SCANCODE_KP_EQUALS);
	scancodes.Set("F13", (int) SDL_SCANCODE_F13);
	scancodes.Set("F14", (int) SDL_SCANCODE_F14);
	scancodes.Set("F15", (int) SDL_SCANCODE_F15);
	scancodes.Set("F16", (int) SDL_SCANCODE_F16);
	scancodes.Set("F17", (int) SDL_SCANCODE_F17);
	scancodes.Set("F18", (int) SDL_SCANCODE_F18);
	scancodes.Set("F19", (int) SDL_SCANCODE_F19);
	scancodes.Set("F20", (int) SDL_SCANCODE_F20);
	scancodes.Set("F21", (int) SDL_SCANCODE_F21);
	scancodes.Set("F22", (int) SDL_SCANCODE_F22);
	scancodes.Set("F23", (int) SDL_SCANCODE_F23);
	scancodes.Set("F24", (int) SDL_SCANCODE_F24);
	scancodes.Set("EXECUTE", (int) SDL_SCANCODE_EXECUTE);
	scancodes.Set("HELP", (int) SDL_SCANCODE_HELP);
	scancodes.Set("MENU", (int) SDL_SCANCODE_MENU);
	scancodes.Set("SELECT", (int) SDL_SCANCODE_SELECT);
	scancodes.Set("STOP", (int) SDL_SCANCODE_STOP);
	scancodes.Set("AGAIN", (int) SDL_SCANCODE_AGAIN);
	scancodes.Set("UNDO", (int) SDL_SCANCODE_UNDO);
	scancodes.Set("CUT", (int) SDL_SCANCODE_CUT);
	scancodes.Set("COPY", (int) SDL_SCANCODE_COPY);
	scancodes.Set("PASTE", (int) SDL_SCANCODE_PASTE);
	scancodes.Set("FIND", (int) SDL_SCANCODE_FIND);
	scancodes.Set("MUTE", (int) SDL_SCANCODE_MUTE);
	scancodes.Set("VOLUMEUP", (int) SDL_SCANCODE_VOLUMEUP);
	scancodes.Set("VOLUMEDOWN", (int) SDL_SCANCODE_VOLUMEDOWN);
	scancodes.Set("KP_COMMA", (int) SDL_SCANCODE_KP_COMMA);
	scancodes.Set("KP_EQUALSAS400", (int) SDL_SCANCODE_KP_EQUALSAS400);
	scancodes.Set("INTERNATIONAL1", (int) SDL_SCANCODE_INTERNATIONAL1);
	scancodes.Set("INTERNATIONAL2", (int) SDL_SCANCODE_INTERNATIONAL2);
	scancodes.Set("INTERNATIONAL3", (int) SDL_SCANCODE_INTERNATIONAL3);
	scancodes.Set("INTERNATIONAL4", (int) SDL_SCANCODE_INTERNATIONAL4);
	scancodes.Set("INTERNATIONAL5", (int) SDL_SCANCODE_INTERNATIONAL5);
	scancodes.Set("INTERNATIONAL6", (int) SDL_SCANCODE_INTERNATIONAL6);
	scancodes.Set("INTERNATIONAL7", (int) SDL_SCANCODE_INTERNATIONAL7);
	scancodes.Set("INTERNATIONAL8", (int) SDL_SCANCODE_INTERNATIONAL8);
	scancodes.Set("INTERNATIONAL9", (int) SDL_SCANCODE_INTERNATIONAL9);
	scancodes.Set("LANG1", (int) SDL_SCANCODE_LANG1);
	scancodes.Set("LANG2", (int) SDL_SCANCODE_LANG2);
	scancodes.Set("LANG3", (int) SDL_SCANCODE_LANG3);
	scancodes.Set("LANG4", (int) SDL_SCANCODE_LANG4);
	scancodes.Set("LANG5", (int) SDL_SCANCODE_LANG5);
	scancodes.Set("LANG6", (int) SDL_SCANCODE_LANG6);
	scancodes.Set("LANG7", (int) SDL_SCANCODE_LANG7);
	scancodes.Set("LANG8", (int) SDL_SCANCODE_LANG8);
	scancodes.Set("LANG9", (int) SDL_SCANCODE_LANG9);
	scancodes.Set("ALTERASE", (int) SDL_SCANCODE_ALTERASE);
	scancodes.Set("SYSREQ", (int) SDL_SCANCODE_SYSREQ);
	scancodes.Set("CANCEL", (int) SDL_SCANCODE_CANCEL);
	scancodes.Set("CLEAR", (int) SDL_SCANCODE_CLEAR);
	scancodes.Set("PRIOR", (int) SDL_SCANCODE_PRIOR);
	scancodes.Set("RETURN2", (int) SDL_SCANCODE_RETURN2);
	scancodes.Set("SEPARATOR", (int) SDL_SCANCODE_SEPARATOR);
	scancodes.Set("OUT", (int) SDL_SCANCODE_OUT);
	scancodes.Set("OPER", (int) SDL_SCANCODE_OPER);
	scancodes.Set("CLEARAGAIN", (int) SDL_SCANCODE_CLEARAGAIN);
	scancodes.Set("CRSEL", (int) SDL_SCANCODE_CRSEL);
	scancodes.Set("EXSEL", (int) SDL_SCANCODE_EXSEL);
	scancodes.Set("KP_00", (int) SDL_SCANCODE_KP_00);
	scancodes.Set("KP_000", (int) SDL_SCANCODE_KP_000);
	scancodes.Set("THOUSANDSSEPARATOR", (int) SDL_SCANCODE_THOUSANDSSEPARATOR);
	scancodes.Set("DECIMALSEPARATOR", (int) SDL_SCANCODE_DECIMALSEPARATOR);
	scancodes.Set("CURRENCYUNIT", (int) SDL_SCANCODE_CURRENCYUNIT);
	scancodes.Set("CURRENCYSUBUNIT", (int) SDL_SCANCODE_CURRENCYSUBUNIT);
	scancodes.Set("KP_LEFTPAREN", (int) SDL_SCANCODE_KP_LEFTPAREN);
	scancodes.Set("KP_RIGHTPAREN", (int) SDL_SCANCODE_KP_RIGHTPAREN);
	scancodes.Set("KP_LEFTBRACE", (int) SDL_SCANCODE_KP_LEFTBRACE);
	scancodes.Set("KP_RIGHTBRACE", (int) SDL_SCANCODE_KP_RIGHTBRACE);
	scancodes.Set("KP_TAB", (int) SDL_SCANCODE_KP_TAB);
	scancodes.Set("KP_BACKSPACE", (int) SDL_SCANCODE_KP_BACKSPACE);
	scancodes.Set("KP_A", (int) SDL_SCANCODE_KP_A);
	scancodes.Set("KP_B", (int) SDL_SCANCODE_KP_B);
	scancodes.Set("KP_C", (int) SDL_SCANCODE_KP_C);
	scancodes.Set("KP_D", (int) SDL_SCANCODE_KP_D);
	scancodes.Set("KP_E", (int) SDL_SCANCODE_KP_E);
	scancodes.Set("KP_F", (int) SDL_SCANCODE_KP_F);
	scancodes.Set("KP_XOR", (int) SDL_SCANCODE_KP_XOR);
	scancodes.Set("KP_POWER", (int) SDL_SCANCODE_KP_POWER);
	scancodes.Set("KP_PERCENT", (int) SDL_SCANCODE_KP_PERCENT);
	scancodes.Set("KP_LESS", (int) SDL_SCANCODE_KP_LESS);
	scancodes.Set("KP_GREATER", (int) SDL_SCANCODE_KP_GREATER);
	scancodes.Set("KP_AMPERSAND", (int) SDL_SCANCODE_KP_AMPERSAND);
	scancodes.Set("KP_DBLAMPERSAND", (int) SDL_SCANCODE_KP_DBLAMPERSAND);
	scancodes.Set("KP_VERTICALBAR", (int) SDL_SCANCODE_KP_VERTICALBAR);
	scancodes.Set("KP_DBLVERTICALBAR", (int) SDL_SCANCODE_KP_DBLVERTICALBAR);
	scancodes.Set("KP_COLON", (int) SDL_SCANCODE_KP_COLON);
	scancodes.Set("KP_HASH", (int) SDL_SCANCODE_KP_HASH);
	scancodes.Set("KP_SPACE", (int) SDL_SCANCODE_KP_SPACE);
	scancodes.Set("KP_AT", (int) SDL_SCANCODE_KP_AT);
	scancodes.Set("KP_EXCLAM", (int) SDL_SCANCODE_KP_EXCLAM);
	scancodes.Set("KP_MEMSTORE", (int) SDL_SCANCODE_KP_MEMSTORE);
	scancodes.Set("KP_MEMRECALL", (int) SDL_SCANCODE_KP_MEMRECALL);
	scancodes.Set("KP_MEMCLEAR", (int) SDL_SCANCODE_KP_MEMCLEAR);
	scancodes.Set("KP_MEMADD", (int) SDL_SCANCODE_KP_MEMADD);
	scancodes.Set("KP_MEMSUBTRACT", (int) SDL_SCANCODE_KP_MEMSUBTRACT);
	scancodes.Set("KP_MEMMULTIPLY", (int) SDL_SCANCODE_KP_MEMMULTIPLY);
	scancodes.Set("KP_MEMDIVIDE", (int) SDL_SCANCODE_KP_MEMDIVIDE);
	scancodes.Set("KP_PLUSMINUS", (int) SDL_SCANCODE_KP_PLUSMINUS);
	scancodes.Set("KP_CLEAR", (int) SDL_SCANCODE_KP_CLEAR);
	scancodes.Set("KP_CLEARENTRY", (int) SDL_SCANCODE_KP_CLEARENTRY);
	scancodes.Set("KP_BINARY", (int) SDL_SCANCODE_KP_BINARY);
	scancodes.Set("KP_OCTAL", (int) SDL_SCANCODE_KP_OCTAL);
	scancodes.Set("KP_DECIMAL", (int) SDL_SCANCODE_KP_DECIMAL);
	scancodes.Set("KP_HEXADECIMAL", (int) SDL_SCANCODE_KP_HEXADECIMAL);
	scancodes.Set("LCTRL", (int) SDL_SCANCODE_LCTRL);
	scancodes.Set("LSHIFT", (int) SDL_SCANCODE_LSHIFT);
	scancodes.Set("LALT", (int) SDL_SCANCODE_LALT);
	scancodes.Set("LGUI", (int) SDL_SCANCODE_LGUI);
	scancodes.Set("RCTRL", (int) SDL_SCANCODE_RCTRL);
	scancodes.Set("RSHIFT", (int) SDL_SCANCODE_RSHIFT);
	scancodes.Set("RALT", (int) SDL_SCANCODE_RALT);
	scancodes.Set("RGUI", (int) SDL_SCANCODE_RGUI);
	scancodes.Set("MODE", (int) SDL_SCANCODE_MODE);
	scancodes.Set("AUDIONEXT", (int) SDL_SCANCODE_AUDIONEXT);
	scancodes.Set("AUDIOPREV", (int) SDL_SCANCODE_AUDIOPREV);
	scancodes.Set("AUDIOSTOP", (int) SDL_SCANCODE_AUDIOSTOP);
	scancodes.Set("AUDIOPLAY", (int) SDL_SCANCODE_AUDIOPLAY);
	scancodes.Set("AUDIOMUTE", (int) SDL_SCANCODE_AUDIOMUTE);
	scancodes.Set("MEDIASELECT", (int) SDL_SCANCODE_MEDIASELECT);
	scancodes.Set("WWW", (int) SDL_SCANCODE_WWW);
	scancodes.Set("MAIL", (int) SDL_SCANCODE_MAIL);
	scancodes.Set("CALCULATOR", (int) SDL_SCANCODE_CALCULATOR);
	scancodes.Set("COMPUTER", (int) SDL_SCANCODE_COMPUTER);
	scancodes.Set("AC_SEARCH", (int) SDL_SCANCODE_AC_SEARCH);
	scancodes.Set("AC_HOME", (int) SDL_SCANCODE_AC_HOME);
	scancodes.Set("AC_BACK", (int) SDL_SCANCODE_AC_BACK);
	scancodes.Set("AC_FORWARD", (int) SDL_SCANCODE_AC_FORWARD);
	scancodes.Set("AC_STOP", (int) SDL_SCANCODE_AC_STOP);
	scancodes.Set("AC_REFRESH", (int) SDL_SCANCODE_AC_REFRESH);
	scancodes.Set("AC_BOOKMARKS", (int) SDL_SCANCODE_AC_BOOKMARKS);
	scancodes.Set("BRIGHTNESSDOWN", (int) SDL_SCANCODE_BRIGHTNESSDOWN);
	scancodes.Set("BRIGHTNESSUP", (int) SDL_SCANCODE_BRIGHTNESSUP);
	scancodes.Set("DISPLAYSWITCH", (int) SDL_SCANCODE_DISPLAYSWITCH);
	scancodes.Set("KBDILLUMTOGGLE", (int) SDL_SCANCODE_KBDILLUMTOGGLE);
	scancodes.Set("KBDILLUMDOWN", (int) SDL_SCANCODE_KBDILLUMDOWN);
	scancodes.Set("KBDILLUMUP", (int) SDL_SCANCODE_KBDILLUMUP);
	scancodes.Set("EJECT", (int) SDL_SCANCODE_EJECT);
	scancodes.Set("SLEEP", (int) SDL_SCANCODE_SLEEP);
	scancodes.Set("APP1", (int) SDL_SCANCODE_APP1);
	scancodes.Set("APP2", (int) SDL_SCANCODE_APP2);
	scancodes.Set("AUDIOREWIND", (int) SDL_SCANCODE_AUDIOREWIND);
	scancodes.Set("AUDIOFASTFORWARD", (int) SDL_SCANCODE_AUDIOFASTFORWARD);

	Napi::Object mouse_buttons = Napi::Object::New(env);
	mouse_buttons.Set("LEFT", (int) SDL_BUTTON_LEFT);
	mouse_buttons.Set("MIDDLE", (int) SDL_BUTTON_MIDDLE);
	mouse_buttons.Set("RIGHT", (int) SDL_BUTTON_RIGHT);

	Napi::Object cursors = Napi::Object::New(env);
	cursors.Set("arrow", (int) SDL_SYSTEM_CURSOR_ARROW);
	cursors.Set("ibeam", (int) SDL_SYSTEM_CURSOR_IBEAM);
	cursors.Set("wait", (int) SDL_SYSTEM_CURSOR_WAIT);
	cursors.Set("crosshair", (int) SDL_SYSTEM_CURSOR_CROSSHAIR);
	cursors.Set("waitarrow", (int) SDL_SYSTEM_CURSOR_WAITARROW);
	cursors.Set("sizenwse", (int) SDL_SYSTEM_CURSOR_SIZENWSE);
	cursors.Set("sizenesw", (int) SDL_SYSTEM_CURSOR_SIZENESW);
	cursors.Set("sizewe", (int) SDL_SYSTEM_CURSOR_SIZEWE);
	cursors.Set("sizens", (int) SDL_SYSTEM_CURSOR_SIZENS);
	cursors.Set("sizeall", (int) SDL_SYSTEM_CURSOR_SIZEALL);
	cursors.Set("no", (int) SDL_SYSTEM_CURSOR_NO);
	cursors.Set("hand", (int) SDL_SYSTEM_CURSOR_HAND);

	Napi::Object all = Napi::Object::New(env);
	all.Set("pixelFormat", pixel_formats);
	all.Set("scaleMode", scale_mode);
	all.Set("audioFormat", audio_formats);
	all.Set("scancodes", scancodes);
	all.Set("mouseButtons", mouse_buttons);
	all.Set("cursors", cursors);

	return all;
}
