/*
Ruby/SDL Ruby extension library for SDL
Copyright (C) 2001-2007 Ohbayashi Ippei
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "rubysdl.h"
void eventCheck(int pred,char *msg)
{
if(!pred)
rb_raise(eSDLError,"this event is not %s event",msg) ;
}
static VALUE createEventObject(VALUE class)
{
SDL_Event *event;
return Data_Make_Struct(class,SDL_Event,0,free,event);
}
static VALUE sdl_pollEvent(VALUE obj)
{
SDL_Event *event;
Data_Get_Struct(obj,SDL_Event,event);
return INT2NUM(SDL_PollEvent(event));
}
static VALUE sdl_waitEvent(VALUE obj)
{
SDL_Event *event;
Data_Get_Struct(obj,SDL_Event,event);
if( SDL_WaitEvent(event)==0 )
rb_raise(eSDLError,"SDL_WaitEvent Failed :%s",SDL_GetError());
return Qnil;
}
static VALUE sdl_eventType(VALUE obj)
{
SDL_Event *event;
Data_Get_Struct(obj,SDL_Event,event);
return INT2FIX(event->type);
}
/* --KeyboardEvent-- */
static VALUE sdl_eventKeyPressed(VALUE obj)
{
SDL_Event *event;
Data_Get_Struct(obj,SDL_Event,event);
eventCheck((event->type == SDL_KEYDOWN)||(event->type == SDL_KEYUP),"key");
if( event->key.state==SDL_PRESSED )
return Qtrue;
else
return Qfalse;
}
static VALUE sdl_eventKeyMod(VALUE obj)
{
SDL_Event *event;
Data_Get_Struct(obj,SDL_Event,event);
eventCheck((event->type == SDL_KEYDOWN)||(event->type == SDL_KEYUP),"key");
return INT2NUM(event->key.keysym.mod);
}
static VALUE sdl_eventKeySym(VALUE obj)
{
SDL_Event *event;
Data_Get_Struct(obj,SDL_Event,event);
eventCheck((event->type == SDL_KEYDOWN)||(event->type == SDL_KEYUP),"key");
return INT2FIX(event->key.keysym.sym);
}
/* --ActiveEvent-- */
static VALUE sdl_eventActiveGained(VALUE obj)
{
SDL_Event *event;
Data_Get_Struct(obj,SDL_Event,event);
eventCheck( event->type == SDL_ACTIVEEVENT , "active" );
return (event->active.gain)?Qtrue:Qfalse;
}
static VALUE sdl_eventActiveState(VALUE obj)
{
SDL_Event *event;
Data_Get_Struct(obj,SDL_Event,event);
eventCheck( event->type == SDL_ACTIVEEVENT , "active" );
return INT2NUM(event->active.state);
}
/* --MouseMotionEvent-- */
static VALUE sdl_eventMouseX(VALUE obj)
{
SDL_Event *event;
Data_Get_Struct(obj,SDL_Event,event);
switch (event->type){
case SDL_MOUSEMOTION:
return INT2NUM(event->motion.x);
case SDL_MOUSEBUTTONUP:
case SDL_MOUSEBUTTONDOWN:
return INT2NUM(event->button.x);
default:
eventCheck(0,"mouse"); /* raise exception */
}
return Qnil; /* never reach */
}
static VALUE sdl_eventMouseY(VALUE obj)
{
SDL_Event *event;
Data_Get_Struct(obj,SDL_Event,event);
switch (event->type){
case SDL_MOUSEMOTION:
return INT2NUM(event->motion.y);
case SDL_MOUSEBUTTONUP:
case SDL_MOUSEBUTTONDOWN:
return INT2NUM(event->button.y);
default:
eventCheck(0,"mouse"); /* raise exception */
}
return Qnil; /* never reach */
}
static VALUE sdl_eventMouseXrel(VALUE obj)
{
SDL_Event *event;
Data_Get_Struct(obj,SDL_Event,event);
eventCheck(event->type==SDL_MOUSEMOTION,"mouse motion");
return INT2NUM(event->motion.xrel);
}
static VALUE sdl_eventMouseYrel(VALUE obj)
{
SDL_Event *event;
Data_Get_Struct(obj,SDL_Event,event);
eventCheck(event->type==SDL_MOUSEMOTION,"mouse motion");
return INT2NUM(event->motion.yrel);
}
/* --SDL_MouseButtonEvent-- */
static VALUE sdl_eventMouseButton(VALUE obj)
{
SDL_Event *event;
Data_Get_Struct(obj,SDL_Event,event);
eventCheck( (event->type==SDL_MOUSEBUTTONUP)||
(event->type==SDL_MOUSEBUTTONDOWN) , "mouse button" );
return INT2NUM( event->button.button );
}
static VALUE sdl_eventMousePressed(VALUE obj)
{
SDL_Event *event;
Data_Get_Struct(obj,SDL_Event,event);
eventCheck( (event->type==SDL_MOUSEBUTTONUP)||
( event->type==SDL_MOUSEBUTTONDOWN) , "mouse button" );
return (event->button.state==SDL_PRESSED)?Qtrue:Qfalse;
}
static VALUE sdl_eventInfo(VALUE obj)
{
SDL_Event *event;
Data_Get_Struct(obj,SDL_Event,event);
switch(event->type){
case SDL_ACTIVEEVENT:
return rb_ary_new3(3,INT2FIX(SDL_ACTIVEEVENT),BOOL(event->active.gain),
INT2FIX(event->active.state));
case SDL_KEYDOWN:
case SDL_KEYUP:
return rb_ary_new3( 4, INT2FIX(event->type),
BOOL(event->key.state==SDL_PRESSED),
INT2FIX(event->key.keysym.sym),
UINT2NUM(event->key.keysym.mod)
);
case SDL_MOUSEMOTION:
return rb_ary_new3( 6, INT2FIX(SDL_MOUSEMOTION),
INT2FIX(event->motion.state),
INT2FIX(event->motion.x),
INT2FIX(event->motion.y),
INT2FIX(event->motion.xrel),
INT2FIX(event->motion.yrel)
);
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
return rb_ary_new3( 5, INT2FIX(event->type),
INT2FIX(event->button.button),
BOOL(event->button.state==SDL_PRESSED),
INT2FIX(event->button.x),
INT2FIX(event->button.y)
);
case SDL_JOYAXISMOTION:
return rb_ary_new3( 4, INT2FIX(SDL_JOYAXISMOTION),
INT2FIX(event->jaxis.which),
INT2FIX(event->jaxis.axis),
INT2FIX(event->jaxis.value)
);
case SDL_JOYBALLMOTION:
return rb_ary_new3( 5, INT2FIX(SDL_JOYBALLMOTION),
INT2FIX(event->jball.which),
INT2FIX(event->jball.ball),
INT2FIX(event->jball.xrel),
INT2FIX(event->jball.yrel)
);
case SDL_JOYHATMOTION:
return rb_ary_new3( 4, INT2FIX(SDL_JOYHATMOTION),
INT2FIX(event->jhat.which),
INT2FIX(event->jhat.hat),
INT2FIX(event->jhat.value)
);
case SDL_JOYBUTTONDOWN:
case SDL_JOYBUTTONUP:
return rb_ary_new3( 4, INT2FIX(event->type),
INT2FIX(event->jbutton.which),
INT2FIX(event->jbutton.button),
BOOL(event->jbutton.state==SDL_PRESSED)
);
case SDL_QUIT:
return rb_ary_new3( 1, INT2FIX(SDL_QUIT));
case SDL_SYSWMEVENT:
return rb_ary_new3( 1, INT2FIX(SDL_SYSWMEVENT));
case SDL_VIDEORESIZE:
return rb_ary_new3( 3, INT2FIX(SDL_VIDEORESIZE),
INT2FIX(event->resize.w),
INT2FIX(event->resize.h)
);
}
return Qnil;
}
static VALUE sdl_getAppState(VALUE class)
{
return INT2FIX(SDL_GetAppState());
}
static VALUE sdl_enableUNICODE(VALUE class)
{
SDL_EnableUNICODE(1);
return Qnil;
}
static VALUE sdl_disableUNICODE(VALUE class)
{
SDL_EnableUNICODE(0);
return Qnil;
}
static VALUE sdl_is_enableUNICODE(VALUE class)
{
return BOOL(SDL_EnableUNICODE(-1));
}
static void defineConstForEvent()
{
rb_define_const(cEvent,"NOEVENT",INT2NUM(SDL_NOEVENT));
rb_define_const(cEvent,"ACTIVEEVENT",INT2NUM(SDL_ACTIVEEVENT));
rb_define_const(cEvent,"KEYDOWN",INT2NUM(SDL_KEYDOWN));
rb_define_const(cEvent,"KEYUP",INT2NUM(SDL_KEYUP));
rb_define_const(cEvent,"MOUSEMOTION",INT2NUM(SDL_MOUSEMOTION));
rb_define_const(cEvent,"MOUSEBUTTONDOWN",INT2NUM(SDL_MOUSEBUTTONDOWN));
rb_define_const(cEvent,"MOUSEBUTTONUP",INT2NUM(SDL_MOUSEBUTTONUP));
rb_define_const(cEvent,"JOYAXISMOTION",INT2NUM(SDL_JOYAXISMOTION));
rb_define_const(cEvent,"JOYBALLMOTION",INT2NUM(SDL_JOYBALLMOTION));
rb_define_const(cEvent,"JOYHATMOTION",INT2NUM(SDL_JOYHATMOTION));
rb_define_const(cEvent,"JOYBUTTONDOWN",INT2NUM(SDL_JOYBUTTONDOWN));
rb_define_const(cEvent,"JOYBUTTONUP",INT2NUM(SDL_JOYBUTTONUP));
rb_define_const(cEvent,"QUIT",INT2NUM(SDL_QUIT));
rb_define_const(cEvent,"SYSWMEVENT",INT2NUM(SDL_SYSWMEVENT));
rb_define_const(cEvent,"EVENT_RESERVEDA",INT2NUM(SDL_EVENT_RESERVEDA));
rb_define_const(cEvent,"EVENT_RESERVEDB",INT2NUM(SDL_EVENT_RESERVEDB));
rb_define_const(cEvent,"VIDEORESIZE",INT2NUM(SDL_VIDEORESIZE));
#if SDL_VERSION_ATLEAST(1,2,0)
rb_define_const(cEvent,"VIDEOEXPOSE",INT2NUM(SDL_VIDEOEXPOSE));
#else
rb_define_const(cEvent,"EVENT_RESERVED1",INT2NUM(SDL_EVENT_RESERVED1));
#endif
rb_define_const(cEvent,"EVENT_RESERVED2",INT2NUM(SDL_EVENT_RESERVED2));
rb_define_const(cEvent,"EVENT_RESERVED3",INT2NUM(SDL_EVENT_RESERVED3));
rb_define_const(cEvent,"EVENT_RESERVED4",INT2NUM(SDL_EVENT_RESERVED4));
rb_define_const(cEvent,"EVENT_RESERVED5",INT2NUM(SDL_EVENT_RESERVED5));
rb_define_const(cEvent,"EVENT_RESERVED6",INT2NUM(SDL_EVENT_RESERVED6));
rb_define_const(cEvent,"EVENT_RESERVED7",INT2NUM(SDL_EVENT_RESERVED7));
/* Events SDL_USEREVENT through SDL_MAXEVENTS-1 are for your use */
rb_define_const(cEvent,"USEREVENT",INT2NUM(SDL_USEREVENT));
/* This last event is only for bounding internal arrays
It is the number of bits in the event mask datatype -- Uint32
*/
rb_define_const(cEvent,"NUMEVENTS",INT2NUM(SDL_NUMEVENTS));
/* The available application states */
rb_define_const(cEvent,"APPMOUSEFOCUS",UINT2NUM(SDL_APPMOUSEFOCUS));
rb_define_const(cEvent,"APPINPUTFOCUS",UINT2NUM(SDL_APPINPUTFOCUS));
rb_define_const(cEvent,"APPACTIVE",UINT2NUM(SDL_APPACTIVE));
}
void init_event()
{
cEvent = rb_define_class_under(mSDL,"Event",rb_cObject);
rb_define_singleton_method(cEvent,"new",createEventObject,0);
rb_define_singleton_method(cEvent,"appState",sdl_getAppState,0);
rb_define_singleton_method(cEvent,"enableUNICODE",sdl_enableUNICODE,0);
rb_define_singleton_method(cEvent,"disableUNICODE",sdl_disableUNICODE,0);
rb_define_singleton_method(cEvent,"enableUNICODE?",sdl_is_enableUNICODE,0);
rb_define_method(cEvent,"poll",sdl_pollEvent,0);
rb_define_method(cEvent,"wait",sdl_waitEvent,0);
rb_define_method(cEvent,"type",sdl_eventType,0);
rb_define_method(cEvent,"keyPress?",sdl_eventKeyPressed,0);
rb_define_method(cEvent,"keySym",sdl_eventKeySym,0);
rb_define_method(cEvent,"keyMod",sdl_eventKeyMod,0);
rb_define_method(cEvent,"gain?",sdl_eventActiveGained,0);
rb_define_method(cEvent,"appState",sdl_eventActiveState,0);
rb_define_method(cEvent,"mouseX",sdl_eventMouseX,0);
rb_define_method(cEvent,"mouseY",sdl_eventMouseY,0);
rb_define_method(cEvent,"mouseXrel",sdl_eventMouseXrel,0);
rb_define_method(cEvent,"mouseYrel",sdl_eventMouseYrel,0);
rb_define_method(cEvent,"mouseButton",sdl_eventMouseButton,0);
rb_define_method(cEvent,"mousePress?",sdl_eventMousePressed,0);
rb_define_method(cEvent,"info",sdl_eventInfo,0);
defineConstForEvent();
}
syntax highlighted by Code2HTML, v. 0.9.1