/*
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"
static VALUE sdl_getJoyPolling(VALUE class)
{
return BOOL(SDL_JoystickEventState(SDL_QUERY)==SDL_ENABLE);
}
static VALUE sdl_setJoyPolling(VALUE class,VALUE poll)
{
if(poll)
SDL_JoystickEventState(SDL_ENABLE);
else
SDL_JoystickEventState(SDL_IGNORE);
return poll;
}
static VALUE sdl_joystick_num(VALUE class)
{
return INT2FIX(SDL_NumJoysticks());
}
static VALUE sdl_joystick_name(VALUE class,VALUE index)
{
return rb_str_new2( SDL_JoystickName(NUM2INT(index)) );
}
static VALUE sdl_joystick_open(VALUE class,VALUE index)
{
SDL_Joystick *joystick;
joystick=SDL_JoystickOpen(NUM2INT(index));
if(joystick==NULL)
rb_raise(eSDLError,"Couldn't open joystick No.%d :%s",NUM2INT(index),
SDL_GetError());
return Data_Wrap_Struct(class,0,0,joystick);
}
static VALUE sdl_joystick_opened(VALUE class,VALUE index)
{
return (SDL_JoystickOpened(NUM2INT(index)))?Qtrue:Qfalse;
}
static VALUE sdl_joystick_update(VALUE class)
{
SDL_JoystickUpdate();
return Qnil;
}
static VALUE sdl_joystick_index(VALUE obj)
{
SDL_Joystick *joystick;
Data_Get_Struct(obj,SDL_Joystick,joystick);
return INT2FIX(SDL_JoystickIndex(joystick));
}
static VALUE sdl_joystick_numAxes(VALUE obj)
{
SDL_Joystick *joystick;
Data_Get_Struct(obj,SDL_Joystick,joystick);
return INT2FIX(SDL_JoystickNumAxes(joystick));
}
static VALUE sdl_joystick_numBalls(VALUE obj)
{
SDL_Joystick *joystick;
Data_Get_Struct(obj,SDL_Joystick,joystick);
return INT2FIX(SDL_JoystickNumBalls(joystick));
}
static VALUE sdl_joystick_numHats(VALUE obj)
{
SDL_Joystick *joystick;
Data_Get_Struct(obj,SDL_Joystick,joystick);
return INT2FIX(SDL_JoystickNumHats(joystick));
}
static VALUE sdl_joystick_numButtons(VALUE obj)
{
SDL_Joystick *joystick;
Data_Get_Struct(obj,SDL_Joystick,joystick);
return INT2FIX(SDL_JoystickNumButtons(joystick));
}
static VALUE sdl_joystick_getAxis(VALUE obj,VALUE axis)
{
SDL_Joystick *joystick;
Data_Get_Struct(obj,SDL_Joystick,joystick);
return INT2NUM(SDL_JoystickGetAxis(joystick,NUM2INT(axis)));
}
static VALUE sdl_joystick_getHat(VALUE obj,VALUE hat)
{
SDL_Joystick *joystick;
Data_Get_Struct(obj,SDL_Joystick,joystick);
return UINT2NUM(SDL_JoystickGetHat(joystick,NUM2INT(hat)));
}
static VALUE sdl_joystick_getButton(VALUE obj,VALUE button)
{
SDL_Joystick *joystick;
Data_Get_Struct(obj,SDL_Joystick,joystick);
return (SDL_JoystickGetButton(joystick,NUM2INT(button)))?Qtrue:Qfalse;
}
static VALUE sdl_joystick_getBall(VALUE obj,VALUE ball)
{
SDL_Joystick *joystick;
int dx,dy;
Data_Get_Struct(obj,SDL_Joystick,joystick);
if( SDL_JoystickGetBall(joystick,NUM2INT(ball),&dx,&dy)== -1 )
rb_raise(eSDLError,"SDL_JoystickGetBall failed :%s",SDL_GetError());
return rb_ary_new3(2,INT2FIX(dx),INT2FIX(dy));
}
static void defineConstForJoystick()
{
rb_define_const(cJoystick,"HAT_CENTERED",UINT2NUM(SDL_HAT_CENTERED));
rb_define_const(cJoystick,"HAT_UP",UINT2NUM(SDL_HAT_UP));
rb_define_const(cJoystick,"HAT_RIGHT",UINT2NUM(SDL_HAT_RIGHT));
rb_define_const(cJoystick,"HAT_DOWN",UINT2NUM(SDL_HAT_DOWN));
rb_define_const(cJoystick,"HAT_LEFT",UINT2NUM(SDL_HAT_LEFT));
rb_define_const(cJoystick,"HAT_RIGHTUP",UINT2NUM(SDL_HAT_RIGHTUP));
rb_define_const(cJoystick,"HAT_RIGHTDOWN",UINT2NUM(SDL_HAT_RIGHTDOWN));
rb_define_const(cJoystick,"HAT_LEFTUP",UINT2NUM(SDL_HAT_LEFTUP));
rb_define_const(cJoystick,"HAT_LEFTDOWN",UINT2NUM(SDL_HAT_LEFTDOWN));
}
void init_joystick()
{
cJoystick = rb_define_class_under(mSDL,"Joystick",rb_cObject);
rb_define_singleton_method(cJoystick,"poll",sdl_getJoyPolling,0);
rb_define_singleton_method(cJoystick,"poll=",sdl_setJoyPolling,1);
rb_define_singleton_method(cJoystick,"num",sdl_joystick_num,0);
rb_define_singleton_method(cJoystick,"indexName",sdl_joystick_name,1);
rb_define_singleton_method(cJoystick,"open",sdl_joystick_open,1);
rb_define_singleton_method(cJoystick,"open?",sdl_joystick_opened,1);
rb_define_singleton_method(cJoystick,"updateAll",sdl_joystick_update,0);
rb_define_method(cJoystick,"index",sdl_joystick_index,0);
rb_define_method(cJoystick,"numAxes",sdl_joystick_numAxes,0);
rb_define_method(cJoystick,"numBalls",sdl_joystick_numBalls,0);
rb_define_method(cJoystick,"numHats",sdl_joystick_numHats,0);
rb_define_method(cJoystick,"numButtons",sdl_joystick_numButtons,0);
rb_define_method(cJoystick,"axis",sdl_joystick_getAxis,1);
rb_define_method(cJoystick,"hat",sdl_joystick_getHat,1);
rb_define_method(cJoystick,"button",sdl_joystick_getButton,1);
rb_define_method(cJoystick,"ball",sdl_joystick_getBall,1);
defineConstForJoystick();
}
syntax highlighted by Code2HTML, v. 0.9.1