X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=src%2Fecore%2Frb_animator.c;h=9a3ce2778bb7a5fd2d6718448616c11c37633aa1;hb=fa957a85d2bac8f3ec0845737540254f25d6685c;hp=6544baa9968e396c9c1f7ea59dedcf0e1e505097;hpb=d11d27f56a611be4523b0caed6da93a4cc5269f6;p=ruby-ecore.git diff --git a/src/ecore/rb_animator.c b/src/ecore/rb_animator.c index 6544baa..9a3ce27 100644 --- a/src/ecore/rb_animator.c +++ b/src/ecore/rb_animator.c @@ -1,5 +1,5 @@ /* - * $Id: rb_animator.c 146 2004-11-27 15:38:52Z tilman $ + * $Id: rb_animator.c 351 2006-02-10 15:25:40Z tilman $ * * Copyright (C) 2004 ruby-ecore team (see AUTHORS) * @@ -25,6 +25,8 @@ #include "rb_ecore.h" +void Init_stack (VALUE *addr); + typedef struct { Ecore_Animator *real; VALUE callback; @@ -35,6 +37,15 @@ static int on_animator (void *data) { VALUE r; RbAnimator *animator = data; + static bool initted; + + /* this fixes a weird segfault that occured when the animator's + * callback was called from a Ecore::Timer callback. + */ + if (!initted) { + Init_stack (0); + initted = true; + } r = rb_funcall (animator->callback, rb_intern ("call"), 0); @@ -62,24 +73,26 @@ static void c_free (RbAnimator *animator) free (animator); } -static VALUE c_new (VALUE klass) +static VALUE c_alloc (VALUE klass) { - VALUE self; RbAnimator *animator = NULL; - if (!rb_block_given_p ()) - return Qnil; + ecore_init (); + + return Data_Make_Struct (klass, RbAnimator, c_mark, c_free, animator); +} - self = Data_Make_Struct (klass, RbAnimator, c_mark, c_free, animator); +static VALUE c_init (VALUE self) +{ + GET_OBJ (self, RbAnimator, animator); - ecore_init (); + if (!rb_block_given_p ()) + rb_raise (rb_eStandardError, "block missing"); animator->callback = rb_block_proc (); animator->deleted = false; animator->real = ecore_animator_add (on_animator, animator); - rb_obj_call_init (self, 0, NULL); - return self; } @@ -101,6 +114,7 @@ void Init_Animator (void) { VALUE c = rb_define_class_under (mEcore, "Animator", rb_cObject); - rb_define_singleton_method (c, "new", c_new, 0); + rb_define_alloc_func (c, c_alloc); + rb_define_method (c, "initialize", c_init, 0); rb_define_method (c, "delete", c_delete, 0); }