Changeset 2296


Ignore:
Timestamp:
Apr 19, 2008, 1:31:39 PM (13 years ago)
Author:
Pascal Terjan
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.