Removed RCS-style IDs.
[ruby-evas.git] / src / rb_smart.c
index b9379e0d90dc95916a736ded4e1b91a1ecd7f97e..4c036afbb25324eb9c22f7c58161106666447f90 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * $Id: rb_smart.c 68 2004-08-16 15:42:19Z tilman $
- *
  * Copyright (C) 2004 Tilman Sauerbeck (tilman at code-monkey de)
  *
  * This library is free software; you can redistribute it and/or
 #include "rb_evas.h"
 #include "rb_evas_object.h"
 
-#define RUBY_EVAS_SMART_OBJECT_KEY "__RB_EVAS_OBJECT_SMART_OBJECT"
-
-#define GET_EVAS_OBJECT(obj, o) \
-       VALUE (obj); \
-\
-       obj = (VALUE) evas_object_data_get (o, \
-                                           RUBY_EVAS_SMART_OBJECT_KEY); \
-       if (!obj) { \
-               rb_raise (rb_eException, \
-                         "EvasObject Ruby object key missing"); \
-               return; \
-       }
-
 #define SMART_CB_BODY(name) \
+       VALUE self = TO_EVAS_OBJECT (o); \
        static ID id; \
-\
-       GET_EVAS_OBJECT (self, o); \
 \
        if (!id) \
-               id = rb_intern ("on_"#name); \
+               id = rb_intern ("smart_"#name); \
 \
        if (!rb_respond_to (self, id)) \
                return;
 
 #define SMART_CB(name) \
-       static void on_##name (Evas_Object *o) \
+       static void smart_##name (Evas_Object *o) \
        { \
                SMART_CB_BODY (name); \
                rb_funcall (self, id, 0); \
        }
 
 #define SMART_CB_OBJ(name) \
-       static void on_##name (Evas_Object *o, Evas_Object *other) \
+       static void smart_##name (Evas_Object *o, Evas_Object *other) \
        { \
                SMART_CB_BODY (name); \
                rb_funcall (self, id, 1, TO_EVAS_OBJECT (other)); \
        }
 
 #define SMART_CB_COORD(name) \
-       static void on_##name (Evas_Object *o, Evas_Coord a, Evas_Coord b) \
+       static void smart_##name (Evas_Object *o, Evas_Coord a, Evas_Coord b) \
        { \
                SMART_CB_BODY (name); \
                rb_funcall (self, id, 2, INT2FIX ((int) a), INT2FIX ((int) b)); \
        }
 
+static ID id_smart_object;
+
 SMART_CB (delete);
-SMART_CB (raise);
-SMART_CB (lower);
 SMART_CB (show);
 SMART_CB (hide);
 SMART_CB (clip_unset);
-SMART_CB_OBJ (stack_above);
-SMART_CB_OBJ (stack_below);
 SMART_CB_OBJ (clip_set);
 SMART_CB_COORD (move);
 SMART_CB_COORD (resize);
 
-static void on_layer_set (Evas_Object *o, int layer)
-{
-       SMART_CB_BODY (layer_set);
-
-       rb_funcall (self, id, 1, FIX2INT (layer));
-}
-
-static void on_color_set (Evas_Object *o, int r, int g, int b, int a)
+static void smart_color_set (Evas_Object *o, int r, int g, int b, int a)
 {
        SMART_CB_BODY (color_set);
 
@@ -98,70 +73,71 @@ static void on_color_set (Evas_Object *o, int r, int g, int b, int a)
                    INT2FIX (a));
 }
 
-/*
- * call-seq:
- *  Evas::Smart.new(name) => smart
- *
- * Creates a Evas::Smart object with the given name.
- */
-static VALUE c_new (VALUE klass, VALUE name)
+static VALUE c_inherited (VALUE klass, VALUE child)
 {
-       VALUE self;
-       Evas_Smart **smart;
-
-       Check_Type (name, T_STRING);
+       rb_const_set (child, id_smart_object, Qnil);
 
-       self = Data_Make_Struct (klass, Evas_Smart *, NULL, free, smart);
-       *smart = evas_smart_new (StringValuePtr (name),
-                                NULL, on_delete, on_layer_set,
-                                on_raise, on_lower, on_stack_above,
-                                on_stack_below, on_move, on_resize,
-                                on_show, on_hide, on_color_set,
-                                on_clip_set, on_clip_unset, NULL);
-
-       rb_obj_call_init (self, 0, NULL);
-
-       return self;
+       return Qnil;
 }
 
-static void c_object_free (RbEvasObject *e)
+static VALUE c_init (VALUE self, VALUE evas)
 {
-       c_evas_object_free (e, true);
-}
-
-/*
- * call-seq:
- *  smart.new_object(class, evas) => smart_obj
- *
- * Creates a Evas::EvasObject from <i>smart</i>.
- */
-static VALUE c_new_object (VALUE self, VALUE klass, VALUE evas)
-{
-       VALUE obj, argv[1];
-       RbEvasObject *smart;
+       VALUE klass, smart, name;
+       Evas_Smart **s = NULL;
 
        CHECK_CLASS (evas, cEvas);
        GET_OBJ (evas, RbEvas, e);
+       GET_OBJ (self, RbEvasObject, s2);
+
+       klass = rb_obj_class (self);
+
+       /* check whether the smart object has been created already */
+       smart = rb_const_get (klass, id_smart_object);
+       if (!NIL_P (smart))
+               Data_Get_Struct (smart, Evas_Smart *, s);
+       else {
+               name = rb_class_path (klass);
+
+               smart = Data_Make_Struct (rb_cObject, Evas_Smart *, NULL, NULL, s);
+
+               *s = evas_smart_new (StringValuePtr (name),
+                                    NULL, smart_delete, NULL,
+                                    NULL, NULL, NULL, NULL,
+                                    smart_move, smart_resize,
+                                    smart_show, smart_hide,
+                                    smart_color_set,
+                                    smart_clip_set, smart_clip_unset,
+                                    NULL);
+
+               rb_mod_remove_const(klass, ID2SYM (id_smart_object));
+               rb_const_set (klass, id_smart_object, smart);
+       }
 
-       GET_OBJ (self, Evas_Smart *, s);
+       s2->real = evas_object_smart_add (e->real, *s);
 
-       obj = Data_Make_Struct (klass, RbEvasObject, c_evas_object_mark,
-                               c_object_free, smart);
-       smart->real = evas_object_smart_add (e->real, *s);
+       rb_call_super (1, &evas);
 
-       evas_object_data_set (smart->real, RUBY_EVAS_SMART_OBJECT_KEY,
-                             (void *) obj);
+       return self;
+}
 
-       argv[0] = evas;
-       rb_obj_call_init (obj, 1, argv);
+static VALUE c_add_member (VALUE self, VALUE member)
+{
+       GET_OBJ (self, RbEvasObject, e);
+       GET_OBJ (member, RbEvasObject, e2);
+
+       /* weird order of arguments */
+       evas_object_smart_member_add (e2->real, e->real);
 
-       return obj;
+       return Qnil;
 }
 
 void Init_Smart (void)
 {
-       VALUE c = rb_define_class_under (mEvas, "Smart", rb_cObject);
+       VALUE c = rb_define_class_under (mEvas, "Smart", cEvasObject);
+
+       rb_define_singleton_method (c, "inherited", c_inherited, 1);
+       rb_define_method (c, "initialize", c_init, 1);
+       rb_define_method (c, "add_member", c_add_member, 1);
 
-       rb_define_singleton_method (c, "new", c_new, 1);
-       rb_define_method (c, "new_object", c_new_object, 2);
+       id_smart_object = rb_intern ("SMART_OBJECT");
 }