|
|
@@ -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); |
|
|
|
} |