X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=src%2Fecore_evas%2Frb_ecore_evas.c;h=1e08533fca5997fc91968cd94f2bee81a0a4f42f;hb=878d2b91169e80b9d437a04d9a013d00313df261;hp=557ca04b9ff4ed3b05bcf8f758f1fe6ec9b5290d;hpb=041804188a058aa7bbc76c81e4a816255a635f00;p=ruby-ecore.git diff --git a/src/ecore_evas/rb_ecore_evas.c b/src/ecore_evas/rb_ecore_evas.c index 557ca04..1e08533 100644 --- a/src/ecore_evas/rb_ecore_evas.c +++ b/src/ecore_evas/rb_ecore_evas.c @@ -1,7 +1,7 @@ /* - * $Id: rb_ecore_evas.c 60 2004-08-10 14:12:36Z tilman $ + * $Id: rb_ecore_evas.c 353 2006-02-10 17:00:24Z tilman $ * - * Copyright (C) 2004 Tilman Sauerbeck (tilman at code-monkey de) + * Copyright (C) 2004 ruby-ecore team (see AUTHORS) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -30,12 +30,16 @@ #include "rb_ecore_evas_main.h" #include "rb_ecore_evas.h" +#define RUBY_ECORE_EVAS_KEY "__RB_ECORE_EVAS_KEY" + #define CALLBACK_DEFINE_HANDLER(name) \ static void on_##name (Ecore_Evas *real) \ { \ - VALUE self = rb_hash_aref (objects, INT2NUM ((long) real)); \ + VALUE self; \ VALUE cb; \ \ + self = (VALUE) ecore_evas_data_get (real, \ + RUBY_ECORE_EVAS_KEY); \ GET_OBJ (self, RbEcoreEvas, ee); \ \ cb = rb_hash_aref (ee->callbacks, rb_str_new2 (#name)); \ @@ -47,6 +51,9 @@ \ if (!rb_block_given_p ()) \ return Qnil; \ +\ + if (NIL_P (ee->callbacks)) \ + ee->callbacks = rb_hash_new (); \ \ rb_hash_aset (ee->callbacks, rb_str_new2 (#name), \ rb_block_proc ()); \ @@ -56,7 +63,6 @@ return Qnil; VALUE cEcoreEvas; -static VALUE objects; /* called by the child classes */ void c_ecore_evas_mark (RbEcoreEvas *ee) @@ -64,7 +70,8 @@ void c_ecore_evas_mark (RbEcoreEvas *ee) if (!NIL_P (ee->evas)) rb_gc_mark (ee->evas); - rb_gc_mark (ee->callbacks); + if (!NIL_P (ee->callbacks)) + rb_gc_mark (ee->callbacks); } void c_ecore_evas_free (RbEcoreEvas *ee, bool free_mem) @@ -85,9 +92,9 @@ static VALUE c_init (int argc, VALUE *argv, VALUE self) GET_OBJ (self, RbEcoreEvas, ee); ee->evas = Qnil; - ee->callbacks = rb_hash_new (); + ee->callbacks = Qnil; - rb_hash_aset (objects, INT2NUM ((long) ee->real), self); + ecore_evas_data_set (ee->real, RUBY_ECORE_EVAS_KEY, (void *) self); return Qnil; } @@ -132,7 +139,7 @@ static VALUE c_hide (VALUE self) * call-seq: * ee.visible? => true or false * - * Returns true if ee is visible, else false. + * Returns true if ee is visible, else returns false. */ static VALUE c_visible_get (VALUE self) { @@ -399,7 +406,7 @@ static VALUE c_title_set (VALUE self, VALUE val) * call-seq: * ee.borderless? => true or false * - * Returns true if ee is borderless, else false. + * Returns true if ee is borderless, else returns false. */ static VALUE c_borderless_get (VALUE self) { @@ -429,7 +436,7 @@ static VALUE c_borderless_set (VALUE self, VALUE val) * call-seq: * ee.shaped? => true or false * - * Returns true if ee is shaped, else false. + * Returns true if ee is shaped, else returns false. */ static VALUE c_shaped_get (VALUE self) { @@ -459,7 +466,7 @@ static VALUE c_shaped_set (VALUE self, VALUE val) * call-seq: * ee.sticky? => true or false * - * Returns true if ee is sticky, else false. + * Returns true if ee is sticky, else returns false. */ static VALUE c_sticky_get (VALUE self) { @@ -515,6 +522,38 @@ static VALUE c_rotation_set (VALUE self, VALUE val) return Qnil; } +static VALUE c_name_class_get (VALUE self) +{ + const char *name = NULL, *klass = NULL; + + GET_OBJ (self, RbEcoreEvas, ee); + + ecore_evas_name_class_get (ee->real, &name, &klass); + + return rb_ary_new3 (2, name ? rb_str_new2 (name) : Qnil, + klass ? rb_str_new2 (klass) : Qnil); +} + +static VALUE c_name_class_set (VALUE self, VALUE ary) +{ + VALUE s1, s2; + + GET_OBJ (self, RbEcoreEvas, ee); + + Check_Type (ary, T_ARRAY); + + s1 = rb_ary_shift (ary); + s2 = rb_ary_shift (ary); + + StringValue (s1); + StringValue (s2); + + ecore_evas_name_class_set (ee->real, StringValuePtr (s1), + StringValuePtr (s2)); + + return Qnil; +} + /* FIXME: this is unsafe! * :nodoc: */ @@ -526,7 +565,6 @@ static VALUE c_delete (VALUE self) rb_gc_start (); ecore_evas_free (ee->real); - rb_hash_aset (objects, INT2NUM ((long) ee->real), Qnil); ee->real = NULL; return Qnil; @@ -681,8 +719,6 @@ void Init_EcoreEvas (void) { cEcoreEvas = rb_define_class_under (mEvas, "EcoreEvas", rb_cObject); - rb_define_private_method (rb_singleton_class (cEcoreEvas), - "new", NULL, 0); rb_define_method (cEcoreEvas, "initialize", c_init, -1); rb_define_method (cEcoreEvas, "inspect", c_inspect, 0); rb_define_method (cEcoreEvas, "delete", c_delete, 0); @@ -711,6 +747,8 @@ void Init_EcoreEvas (void) rb_define_method (cEcoreEvas, "sticky=", c_sticky_set, 1); rb_define_method (cEcoreEvas, "rotation", c_rotation_get, 0); rb_define_method (cEcoreEvas, "rotation=", c_rotation_set, 1); + rb_define_method (cEcoreEvas, "name_class", c_name_class_get, 0); + rb_define_method (cEcoreEvas, "name_class=", c_name_class_set, 1); rb_define_method (cEcoreEvas, "on_resize", c_on_resize, 0); rb_define_method (cEcoreEvas, "on_move", c_on_move, 0); @@ -724,7 +762,4 @@ void Init_EcoreEvas (void) rb_define_method (cEcoreEvas, "on_mouse_out", c_on_mouse_out, 0); rb_define_method (cEcoreEvas, "on_pre_render", c_on_pre_render, 0); rb_define_method (cEcoreEvas, "on_post_render", c_on_post_render, 0); - - objects = rb_hash_new (); - rb_global_variable (&objects); }