瀏覽代碼

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 17 年之前
父節點
當前提交
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) static VALUE display_initialize(int argc, VALUE* argv, VALUE self)
{ {
caca_display_t *display; caca_display_t *display;
cucul_canvas_t *canvas; cucul_canvas_t *canvas = NULL;
VALUE cv; 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); cv = arg1;
canvas = caca_get_canvas(display); if(CLASS_OF(arg2) == cCanvas)
cv = canvas_create(canvas); {
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) if(display == NULL)
@@ -198,11 +226,50 @@ static VALUE get_event(VALUE self, VALUE event_mask, VALUE timeout)
return e; 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) void Init_caca_display(VALUE mCaca)
{ {
cDisplay = rb_define_class_under(mCaca, "Display", rb_cObject); cDisplay = rb_define_class_under(mCaca, "Display", rb_cObject);
rb_define_alloc_func(cDisplay, display_alloc); 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, "initialize", display_initialize, -1);
rb_define_method(cDisplay, "refresh", display_refresh, 0); rb_define_method(cDisplay, "refresh", display_refresh, 0);
rb_define_method(cDisplay, "time=", set_time, 1); 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_x", get_mouse_x, 0);
rb_define_method(cDisplay, "mouse_y", get_mouse_y, 0); rb_define_method(cDisplay, "mouse_y", get_mouse_y, 0);
rb_define_method(cDisplay, "mouse=", set_mouse, 1); 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, "set_mouse", set_mouse2, 1);
rb_define_method(cDisplay, "get_event", get_event, 2); rb_define_method(cDisplay, "get_event", get_event, 2);
} }

||||||
x
 
000:0
Loading…
取消
儲存