blob: 14cae4d8c16c0f2c39701bb791cd6712814a1b22 [file] [log] [blame] [raw]
#include <v8.h>
#include <node.h>
#include <node_buffer.h>
#include "SDL.h"
#include "SDL_ttf.h"
#include "helpers.h"
#include "struct_wrappers.h"
using namespace v8;
using namespace node;
namespace sdl {
// Helper for formatting error exceptions
Handle<Value> ThrowSDLException(const char* name) {
return ThrowException(MakeSDLException(name));
}
Local<Value> MakeSDLException(const char* name) {
return Exception::Error(String::Concat(
String::Concat(String::New(name), String::New(": ")),
String::New(SDL_GetError())
));
}
char* BufferData(Buffer *b) {
return Buffer::Data(b->handle_);
}
size_t BufferLength(Buffer *b) {
return Buffer::Length(b->handle_);
}
char* BufferData(Local<Object> buf_obj) {
return Buffer::Data(buf_obj);
}
size_t BufferLength(Local<Object> buf_obj) {
return Buffer::Length(buf_obj);
}
Local<Object> SDLEventToJavascriptObject(const SDL_Event& event) {
Local<Object> evt = Object::New();
switch (event.type) {
case SDL_KEYDOWN:
case SDL_KEYUP:
evt->Set(String::New("type"), String::New(event.type == SDL_KEYDOWN ? "KEYDOWN" : "KEYUP"));
evt->Set(String::New("scancode"), Number::New(event.key.keysym.scancode));
evt->Set(String::New("sym"), Number::New(event.key.keysym.sym));
evt->Set(String::New("mod"), Number::New(event.key.keysym.mod));
evt->Set(String::New("repeat"), Boolean::New(event.key.repeat > 0 ? true : false));
break;
case SDL_MOUSEMOTION:
evt->Set(String::New("type"), String::New("MOUSEMOTION"));
evt->Set(String::New("state"), Number::New(event.motion.state));
evt->Set(String::New("which"), Number::New(event.motion.which));
evt->Set(String::New("x"), Number::New(event.motion.x));
evt->Set(String::New("y"), Number::New(event.motion.y));
evt->Set(String::New("xrel"), Number::New(event.motion.xrel));
evt->Set(String::New("yrel"), Number::New(event.motion.yrel));
break;
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
evt->Set(String::New("type"), String::New(event.type == SDL_MOUSEBUTTONDOWN ? "MOUSEBUTTONDOWN" : "MOUSEBUTTONUP"));
evt->Set(String::New("button"), Number::New(event.button.button));
evt->Set(String::New("which"), Number::New(event.button.which));
evt->Set(String::New("x"), Number::New(event.button.x));
evt->Set(String::New("y"), Number::New(event.button.y));
break;
case SDL_JOYAXISMOTION:
evt->Set(String::New("type"), String::New("JOYAXISMOTION"));
evt->Set(String::New("which"), Number::New(event.jaxis.which));
evt->Set(String::New("axis"), Number::New(event.jaxis.axis));
evt->Set(String::New("value"), Number::New(event.jaxis.value));
break;
case SDL_JOYBALLMOTION:
evt->Set(String::New("type"), String::New("JOYBALLMOTION"));
evt->Set(String::New("which"), Number::New(event.jball.which));
evt->Set(String::New("ball"), Number::New(event.jball.ball));
evt->Set(String::New("xrel"), Number::New(event.jball.xrel));
evt->Set(String::New("yrel"), Number::New(event.jball.yrel));
break;
case SDL_JOYHATMOTION:
evt->Set(String::New("type"), String::New("JOYHATMOTION"));
evt->Set(String::New("which"), Number::New(event.jhat.which));
evt->Set(String::New("hat"), Number::New(event.jhat.hat));
evt->Set(String::New("value"), Number::New(event.jhat.value));
break;
case SDL_JOYBUTTONDOWN:
case SDL_JOYBUTTONUP:
evt->Set(String::New("type"), String::New(event.type == SDL_JOYBUTTONDOWN ? "JOYBUTTONDOWN" : "JOYBUTTONUP"));
evt->Set(String::New("which"), Number::New(event.jbutton.which));
evt->Set(String::New("button"), Number::New(event.jbutton.button));
break;
case SDL_QUIT:
evt->Set(String::New("type"), String::New("QUIT"));
break;
default:
evt->Set(String::New("type"), String::New("UNKNOWN"));
evt->Set(String::New("typeCode"), Number::New(event.type));
break;
}
return evt;
}
Local<Object> SDLDisplayModeToJavascriptObject(const SDL_DisplayMode& mode) {
Local<Object> jsMode = Object::New();
jsMode->Set(String::New("format"), Number::New(mode.format));
jsMode->Set(String::New("w"), Number::New(mode.w));
jsMode->Set(String::New("h"), Number::New(mode.h));
jsMode->Set(String::New("refreshRate"), Number::New(mode.refresh_rate));
return jsMode;
}
} // node_sdl