소스 검색

Add driver/set_driver/driver=/driver_list methods to Caca::Display, and driver arg to Caca::Display.new

tags/v0.99.beta14
Pascal Terjan pterjan 16 년 전
부모
커밋
f805afaa81
1개의 변경된 파일81개의 추가작업 그리고 11개의 파일을 삭제
  1. +81
    -11
      ruby/caca-display.c

+ 81
- 11
ruby/caca-display.c 파일 보기

@@ -33,25 +33,53 @@ static VALUE display_alloc(VALUE klass)
static VALUE display_initialize(int argc, VALUE* argv, VALUE self)
{
caca_display_t *display;
cucul_canvas_t *canvas;
VALUE cv;
cucul_canvas_t *canvas = NULL;
const char *driver = NULL;
VALUE cv = Qnil;
VALUE arg1, arg2;

rb_scan_args(argc, argv, "01", &cv);
rb_scan_args(argc, argv, "02", &arg1, &arg2);

if(NIL_P(cv))
if(CLASS_OF(arg1) == cCanvas)
{
display = caca_create_display(NULL);
canvas = caca_get_canvas(display);
cv = canvas_create(canvas);
cv = arg1;
if(CLASS_OF(arg2) == cCanvas)
{
rb_raise(rb_eArgError, "Only one argument can be a Cucul::Canvas");
}
}
else
else if(CLASS_OF(arg2) == cCanvas)
{
if(CLASS_OF(cv) != cCanvas)
cv = arg2;
}

if(CLASS_OF(arg1) == T_STRING)
{
driver = StringValuePtr(arg1);
if(CLASS_OF(arg2) == T_STRING)
{
rb_raise(rb_eArgError, "Argument is not a Cucul::Canvas");
rb_raise(rb_eArgError, "Only one argument can be a string");
}
}
else if(CLASS_OF(arg2) == T_STRING)
{
driver = StringValuePtr(arg2);
}

display = caca_create_display(DATA_PTR(cv));
if(cv != Qnil)
canvas = DATA_PTR(cv);

if(driver == NULL)
{
display = caca_create_display(canvas);
if(display && NIL_P(cv))
{
cv = canvas_create(caca_get_canvas(display));
}
}
else
{
display = caca_create_display_with_driver(canvas, driver);
}

if(display == NULL)
@@ -198,11 +226,50 @@ static VALUE get_event(VALUE self, VALUE event_mask, VALUE timeout)
return e;
}

static VALUE driver_list(void)
{
VALUE ary;
char const* const* list;
list = caca_get_display_driver_list();
ary = rb_ary_new();
while (*list != NULL)
{
rb_ary_push(ary, rb_str_new2(*list));
list++;
}

return ary;
}

static VALUE get_driver(VALUE self)
{
return rb_str_new2(caca_get_display_driver(_SELF));
}

static VALUE set_driver(VALUE self, VALUE driver)
{
if(caca_set_display_driver(_SELF, StringValuePtr(driver))<0)
{
rb_raise(rb_eRuntimeError, strerror(errno));
}
return driver;
}

static VALUE set_driver2(VALUE self, VALUE driver)
{
set_driver(self, driver);
return self;
}

void Init_caca_display(VALUE mCaca)
{
cDisplay = rb_define_class_under(mCaca, "Display", rb_cObject);
rb_define_alloc_func(cDisplay, display_alloc);

rb_define_singleton_method(cDisplay, "driver_list", driver_list, 0);

rb_define_method(cDisplay, "initialize", display_initialize, -1);
rb_define_method(cDisplay, "refresh", display_refresh, 0);
rb_define_method(cDisplay, "time=", set_time, 1);
@@ -215,6 +282,9 @@ void Init_caca_display(VALUE mCaca)
rb_define_method(cDisplay, "mouse_x", get_mouse_x, 0);
rb_define_method(cDisplay, "mouse_y", get_mouse_y, 0);
rb_define_method(cDisplay, "mouse=", set_mouse, 1);
rb_define_method(cDisplay, "driver", get_driver, 0);
rb_define_method(cDisplay, "set_driver", set_driver2, 1);
rb_define_method(cDisplay, "driver=", set_driver, 1);
rb_define_method(cDisplay, "set_mouse", set_mouse2, 1);
rb_define_method(cDisplay, "get_event", get_event, 2);
}

불러오는 중...
취소
저장