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