Changeset 2296


Ignore:
Timestamp:
04/19/08 13:31:39 (5 years ago)
Author:
pterjan
Message:

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/ruby/caca-display.c

    r2093 r2296  
    3434{ 
    3535    caca_display_t *display; 
    36     cucul_canvas_t *canvas; 
    37     VALUE cv; 
    38  
    39     rb_scan_args(argc, argv, "01", &cv); 
    40  
    41     if(NIL_P(cv)) 
    42     { 
    43         display = caca_create_display(NULL); 
    44         canvas = caca_get_canvas(display); 
    45         cv = canvas_create(canvas); 
     36    cucul_canvas_t *canvas = NULL; 
     37    const char *driver = NULL; 
     38    VALUE cv = Qnil; 
     39    VALUE arg1, arg2; 
     40 
     41    rb_scan_args(argc, argv, "02", &arg1, &arg2); 
     42 
     43    if(CLASS_OF(arg1) == cCanvas) 
     44    { 
     45        cv = arg1; 
     46        if(CLASS_OF(arg2) == cCanvas) 
     47        { 
     48            rb_raise(rb_eArgError, "Only one argument can be a Cucul::Canvas"); 
     49        } 
     50    } 
     51    else if(CLASS_OF(arg2) == cCanvas) 
     52    { 
     53        cv = arg2; 
     54    } 
     55 
     56    if(CLASS_OF(arg1) == T_STRING) 
     57    { 
     58        driver = StringValuePtr(arg1); 
     59        if(CLASS_OF(arg2) == T_STRING) 
     60        { 
     61            rb_raise(rb_eArgError, "Only one argument can be a string"); 
     62        } 
     63    } 
     64    else if(CLASS_OF(arg2) == T_STRING) 
     65    { 
     66        driver = StringValuePtr(arg2); 
     67    } 
     68 
     69    if(cv !=  Qnil) 
     70        canvas = DATA_PTR(cv); 
     71 
     72    if(driver == NULL) 
     73    { 
     74        display = caca_create_display(canvas); 
     75        if(display && NIL_P(cv)) 
     76        { 
     77            cv = canvas_create(caca_get_canvas(display)); 
     78        } 
    4679    } 
    4780    else 
    4881    { 
    49         if(CLASS_OF(cv) != cCanvas) 
    50         { 
    51             rb_raise(rb_eArgError, "Argument is not a Cucul::Canvas"); 
    52         } 
    53  
    54         display = caca_create_display(DATA_PTR(cv)); 
     82        display = caca_create_display_with_driver(canvas, driver); 
    5583    } 
    5684 
     
    199227} 
    200228 
     229static VALUE driver_list(void) 
     230{ 
     231    VALUE ary; 
     232    char const* const* list; 
     233     
     234    list = caca_get_display_driver_list(); 
     235     
     236    ary = rb_ary_new();     
     237    while (*list != NULL) 
     238    { 
     239        rb_ary_push(ary, rb_str_new2(*list)); 
     240        list++; 
     241    } 
     242 
     243    return ary; 
     244} 
     245 
     246static VALUE get_driver(VALUE self) 
     247{ 
     248    return rb_str_new2(caca_get_display_driver(_SELF)); 
     249} 
     250 
     251static VALUE set_driver(VALUE self, VALUE driver) 
     252{ 
     253    if(caca_set_display_driver(_SELF, StringValuePtr(driver))<0) 
     254    { 
     255        rb_raise(rb_eRuntimeError, strerror(errno)); 
     256    } 
     257    return driver; 
     258} 
     259 
     260static VALUE set_driver2(VALUE self, VALUE driver) 
     261{ 
     262    set_driver(self, driver); 
     263    return self; 
     264} 
     265 
    201266void Init_caca_display(VALUE mCaca) 
    202267{ 
    203268    cDisplay = rb_define_class_under(mCaca, "Display", rb_cObject); 
    204269    rb_define_alloc_func(cDisplay, display_alloc); 
     270 
     271    rb_define_singleton_method(cDisplay, "driver_list", driver_list, 0); 
    205272 
    206273    rb_define_method(cDisplay, "initialize", display_initialize, -1); 
     
    216283    rb_define_method(cDisplay, "mouse_y", get_mouse_y, 0); 
    217284    rb_define_method(cDisplay, "mouse=", set_mouse, 1); 
     285    rb_define_method(cDisplay, "driver", get_driver, 0); 
     286    rb_define_method(cDisplay, "set_driver", set_driver2, 1); 
     287    rb_define_method(cDisplay, "driver=", set_driver, 1); 
    218288    rb_define_method(cDisplay, "set_mouse", set_mouse2, 1); 
    219289    rb_define_method(cDisplay, "get_event", get_event, 2); 
Note: See TracChangeset for help on using the changeset viewer.