2 * $Id: rb_ecore_evas.c 77 2004-08-19 17:39:29Z tilman $
4 * Copyright (C) 2004 ruby-ecore team (see AUTHORS)
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 #include <Ecore_Evas.h>
26 #include <evas/rb_evas.h>
28 #define __RB_ECORE_EVAS_C
29 #include "../ecore/rb_ecore.h"
30 #include "rb_ecore_evas_main.h"
31 #include "rb_ecore_evas.h"
33 #define CALLBACK_DEFINE_HANDLER(name) \
34 static void on_##name (Ecore_Evas *real) \
36 VALUE self = rb_hash_aref (objects, INT2NUM ((long) real)); \
39 GET_OBJ (self, RbEcoreEvas, ee); \
41 cb = rb_hash_aref (ee->callbacks, rb_str_new2 (#name)); \
42 rb_funcall (cb, rb_intern ("call"), 0); \
45 #define CALLBACK_REG_HANDLER(name) \
46 GET_OBJ (self, RbEcoreEvas, ee); \
48 if (!rb_block_given_p ()) \
51 rb_hash_aset (ee->callbacks, rb_str_new2 (#name), \
54 ecore_evas_callback_##name##_set (ee->real, on_##name); \
61 /* called by the child classes */
62 void c_ecore_evas_mark (RbEcoreEvas *ee)
64 if (!NIL_P (ee->evas))
65 rb_gc_mark (ee->evas);
67 rb_gc_mark (ee->callbacks);
70 void c_ecore_evas_free (RbEcoreEvas *ee, bool free_mem)
73 ecore_evas_free (ee->real);
75 ecore_evas_shutdown ();
83 static VALUE c_init (int argc, VALUE *argv, VALUE self)
85 GET_OBJ (self, RbEcoreEvas, ee);
88 ee->callbacks = rb_hash_new ();
90 rb_hash_aset (objects, INT2NUM ((long) ee->real), self);
96 static VALUE c_inspect (VALUE self)
98 INSPECT (self, RbEcoreEvas);
107 static VALUE c_show (VALUE self)
109 GET_OBJ (self, RbEcoreEvas, ee);
111 ecore_evas_show (ee->real);
122 static VALUE c_hide (VALUE self)
124 GET_OBJ (self, RbEcoreEvas, ee);
126 ecore_evas_hide (ee->real);
133 * ee.visible? => true or false
135 * Returns true if <i>ee</i> is visible, else returns false.
137 static VALUE c_visible_get (VALUE self)
139 GET_OBJ (self, RbEcoreEvas, ee);
141 return ecore_evas_visibility_get (ee->real) ? Qtrue : Qfalse;
150 static VALUE c_raise (VALUE self)
152 GET_OBJ (self, RbEcoreEvas, ee);
154 ecore_evas_raise (ee->real);
165 static VALUE c_lower (VALUE self)
167 GET_OBJ (self, RbEcoreEvas, ee);
169 ecore_evas_lower (ee->real);
178 * Returns the layer of <i>ee</i>.
180 static VALUE c_layer_get (VALUE self)
182 GET_OBJ (self, RbEcoreEvas, ee);
184 return INT2FIX (ecore_evas_layer_get (ee->real));
189 * ee.layer(fixnum) => fixnum
191 * Sets the layer of <i>ee</i>.
193 static VALUE c_layer_set (VALUE self, VALUE val)
195 GET_OBJ (self, RbEcoreEvas, ee);
197 Check_Type (val, T_FIXNUM);
199 ecore_evas_layer_set (ee->real, FIX2INT (val));
208 * Returns the <code>Evas::Evas</code> object for <i>ee</i>.
210 static VALUE c_evas_get (VALUE self)
212 GET_OBJ (self, RbEcoreEvas, ee);
214 if (NIL_P (ee->evas))
215 ee->evas = TO_EVAS (self, ecore_evas_get (ee->real));
222 * ee.geometry => array
224 * Returns an array containing the geometry of <i>ee</i>.
226 * ee.move(150, 300) #=> nil
227 * ee.resize(200, 200) #=> nil
228 * ee.geometry #=> [150, 300, 200, 200]
230 static VALUE c_geometry_get (VALUE self)
232 int x = 0, y = 0, w = 0, h = 0;
234 GET_OBJ (self, RbEcoreEvas, ee);
236 ecore_evas_geometry_get (ee->real, &x, &y, &w, &h);
238 return rb_ary_new3 (4, INT2FIX (x), INT2FIX (y),
239 INT2FIX (w), INT2FIX (h));
244 * ee.get_size_min => array
246 * Returns an array containing the minimum size of <i>ee</i>.
248 * ee.set_size_min(100, 200) #=> nil
249 * ee.get_size_min #=> [100, 200]
251 static VALUE c_get_size_min (VALUE self)
255 GET_OBJ (self, RbEcoreEvas, ee);
257 ecore_evas_size_min_get (ee->real, &w, &h);
259 return rb_ary_new3 (2, INT2FIX (w), INT2FIX (h));
264 * ee.set_size_min(width, height) => nil
266 * Sets the minimum size of <i>ee</i>.
268 * ee.set_size_min(100, 200) #=> nil
270 static VALUE c_set_size_min (VALUE self, VALUE w, VALUE h)
272 GET_OBJ (self, RbEcoreEvas, ee);
274 Check_Type (w, T_FIXNUM);
275 Check_Type (h, T_FIXNUM);
277 ecore_evas_size_min_set (ee->real, FIX2INT (w), FIX2INT (h));
284 * ee.get_size_max => array
286 * Returns an array containing the maximum size of <i>ee</i>.
288 * ee.set_size_max(100, 200) #=> nil
289 * ee.get_size_max #=> [100, 200]
291 static VALUE c_get_size_max (VALUE self)
295 GET_OBJ (self, RbEcoreEvas, ee);
297 ecore_evas_size_max_get (ee->real, &w, &h);
299 return rb_ary_new3 (2, INT2FIX (w), INT2FIX (h));
304 * ee.set_size_max(width, height) => nil
306 * Sets the maximum size of <i>ee</i>.
308 * ee.set_size_max(100, 200) #=> nil
310 static VALUE c_set_size_max (VALUE self, VALUE w, VALUE h)
312 GET_OBJ (self, RbEcoreEvas, ee);
314 Check_Type (w, T_FIXNUM);
315 Check_Type (h, T_FIXNUM);
317 ecore_evas_size_max_set (ee->real, FIX2INT (w), FIX2INT (h));
324 * ee.move(x, y) => nil
326 * Moves <i>ee</i> to the coordinates specified in
327 * <i>x</i> and <i>y</i>.
329 * ee.move(100, 200) #=> nil
331 static VALUE c_move (VALUE self, VALUE x, VALUE y)
333 GET_OBJ (self, RbEcoreEvas, ee);
335 Check_Type (x, T_FIXNUM);
336 Check_Type (y, T_FIXNUM);
338 ecore_evas_move (ee->real, FIX2INT (x), FIX2INT (y));
345 * ee.resize(width, height) => nil
347 * Resizes <i>ee</i> to width x height.
349 * ee.resize(100, 200) #=> nil
351 static VALUE c_resize (VALUE self, VALUE w, VALUE h)
353 GET_OBJ (self, RbEcoreEvas, ee);
355 Check_Type (w, T_FIXNUM);
356 Check_Type (h, T_FIXNUM);
358 ecore_evas_resize (ee->real, FIX2INT (w), FIX2INT (h));
367 * Returns the title of <i>ee</i>.
369 static VALUE c_title_get (VALUE self)
373 GET_OBJ (self, RbEcoreEvas, ee);
375 if (!(tmp = ecore_evas_title_get (ee->real)))
378 return rb_str_new2 (tmp);
385 * Sets the title of <i>ee</i>.
387 static VALUE c_title_set (VALUE self, VALUE val)
389 GET_OBJ (self, RbEcoreEvas, ee);
391 Check_Type (val, T_STRING);
393 ecore_evas_title_set (ee->real, StringValuePtr (val));
400 * ee.borderless? => true or false
402 * Returns true if <i>ee</i> is borderless, else returns false.
404 static VALUE c_borderless_get (VALUE self)
406 GET_OBJ (self, RbEcoreEvas, ee);
408 return ecore_evas_borderless_get (ee->real) ? Qtrue : Qfalse;
413 * ee.borderless(true or false)
415 * Sets whether <i>ee</i> is borderless or not.
417 static VALUE c_borderless_set (VALUE self, VALUE val)
419 GET_OBJ (self, RbEcoreEvas, ee);
423 ecore_evas_borderless_set (ee->real, val == Qtrue);
430 * ee.shaped? => true or false
432 * Returns true if <i>ee</i> is shaped, else returns false.
434 static VALUE c_shaped_get (VALUE self)
436 GET_OBJ (self, RbEcoreEvas, ee);
438 return ecore_evas_shaped_get (ee->real) ? Qtrue : Qfalse;
443 * ee.shaped(true or false)
445 * Sets whether <i>ee</i> is shaped or not.
447 static VALUE c_shaped_set (VALUE self, VALUE val)
449 GET_OBJ (self, RbEcoreEvas, ee);
453 ecore_evas_shaped_set (ee->real, val == Qtrue);
460 * ee.sticky? => true or false
462 * Returns true if <i>ee</i> is sticky, else returns false.
464 static VALUE c_sticky_get (VALUE self)
466 GET_OBJ (self, RbEcoreEvas, ee);
468 return ecore_evas_sticky_get (ee->real) ? Qtrue : Qfalse;
473 * ee.sticky(true or false)
475 * Sets whether <i>ee</i> is sticky or not.
477 static VALUE c_sticky_set (VALUE self, VALUE val)
479 GET_OBJ (self, RbEcoreEvas, ee);
483 ecore_evas_sticky_set (ee->real, val == Qtrue);
490 * ee.rotation => fixnum
492 * Returns the rotation of <i>ee</i>.
494 static VALUE c_rotation_get (VALUE self)
496 GET_OBJ (self, RbEcoreEvas, ee);
498 return INT2FIX (ecore_evas_rotation_get (ee->real));
503 * ee.rotation(fixnum)
505 * Sets the rotation of <i>ee</i>.
507 static VALUE c_rotation_set (VALUE self, VALUE val)
509 GET_OBJ (self, RbEcoreEvas, ee);
511 Check_Type (val, T_FIXNUM);
513 ecore_evas_rotation_set (ee->real, FIX2INT (val));
518 /* FIXME: this is unsafe!
521 static VALUE c_delete (VALUE self)
523 GET_OBJ (self, RbEcoreEvas, ee);
525 /* reap our children */
528 ecore_evas_free (ee->real);
529 rb_hash_aset (objects, INT2NUM ((long) ee->real), Qnil);
535 CALLBACK_DEFINE_HANDLER (resize);
536 CALLBACK_DEFINE_HANDLER (move);
537 CALLBACK_DEFINE_HANDLER (show);
538 CALLBACK_DEFINE_HANDLER (hide);
539 CALLBACK_DEFINE_HANDLER (delete_request);
540 CALLBACK_DEFINE_HANDLER (destroy);
541 CALLBACK_DEFINE_HANDLER (focus_in);
542 CALLBACK_DEFINE_HANDLER (focus_out);
543 CALLBACK_DEFINE_HANDLER (mouse_in);
544 CALLBACK_DEFINE_HANDLER (mouse_out);
545 CALLBACK_DEFINE_HANDLER (pre_render);
546 CALLBACK_DEFINE_HANDLER (post_render);
550 * ee.on_resize { block } => nil
552 * Sets the handler for the resize event.
554 static VALUE c_on_resize (VALUE self)
556 CALLBACK_REG_HANDLER (resize);
561 * ee.on_move { block } => nil
563 * Sets the handler for the move event.
565 static VALUE c_on_move (VALUE self)
567 CALLBACK_REG_HANDLER (move);
572 * ee.on_show { block } => nil
574 * Sets the handler for the show event.
576 static VALUE c_on_show (VALUE self)
578 CALLBACK_REG_HANDLER (show);
583 * ee.on_hide { block } => nil
585 * Sets the handler for the hide event.
587 static VALUE c_on_hide (VALUE self)
589 CALLBACK_REG_HANDLER (hide);
594 * ee.on_delete_request { block } => nil
596 * Sets the handler for the delete request event.
598 static VALUE c_on_delete_request (VALUE self)
600 CALLBACK_REG_HANDLER (delete_request);
605 * ee.on_destroy { block } => nil
607 * Sets the handler for the destroy event.
609 static VALUE c_on_destroy (VALUE self)
611 CALLBACK_REG_HANDLER (destroy);
616 * ee.on_focus_in { block } => nil
618 * Sets the handler for the focus in event.
620 static VALUE c_on_focus_in (VALUE self)
622 CALLBACK_REG_HANDLER (focus_in);
627 * ee.on_focus_out { block } => nil
629 * Sets the handler for the focus out event.
631 static VALUE c_on_focus_out (VALUE self)
633 CALLBACK_REG_HANDLER (focus_out);
638 * ee.on_mouse_in { block } => nil
640 * Sets the handler for the mouse in event.
642 static VALUE c_on_mouse_in (VALUE self)
644 CALLBACK_REG_HANDLER (mouse_in);
649 * ee.on_mouse_out { block } => nil
651 * Sets the handler for the mouse out event.
653 static VALUE c_on_mouse_out (VALUE self)
655 CALLBACK_REG_HANDLER (mouse_out);
660 * ee.on_pre_render { block } => nil
662 * Sets the handler for the pre render event.
664 static VALUE c_on_pre_render (VALUE self)
666 CALLBACK_REG_HANDLER (pre_render);
671 * ee.on_post_render { block } => nil
673 * Sets the handler for the post render event.
675 static VALUE c_on_post_render (VALUE self)
677 CALLBACK_REG_HANDLER (post_render);
680 void Init_EcoreEvas (void)
682 cEcoreEvas = rb_define_class_under (mEvas, "EcoreEvas", rb_cObject);
684 rb_define_private_method (rb_singleton_class (cEcoreEvas),
686 rb_define_method (cEcoreEvas, "initialize", c_init, -1);
687 rb_define_method (cEcoreEvas, "inspect", c_inspect, 0);
688 rb_define_method (cEcoreEvas, "delete", c_delete, 0);
689 rb_define_method (cEcoreEvas, "show", c_show, 0);
690 rb_define_method (cEcoreEvas, "hide", c_hide, 0);
691 rb_define_method (cEcoreEvas, "visible?", c_visible_get, 0);
692 rb_define_method (cEcoreEvas, "raise", c_raise, 0);
693 rb_define_method (cEcoreEvas, "lower", c_lower, 0);
694 rb_define_method (cEcoreEvas, "layer", c_layer_get, 0);
695 rb_define_method (cEcoreEvas, "layer=", c_layer_set, 1);
696 rb_define_method (cEcoreEvas, "evas", c_evas_get, 0);
697 rb_define_method (cEcoreEvas, "geometry", c_geometry_get, 0);
698 rb_define_method (cEcoreEvas, "get_size_min", c_get_size_min, 0);
699 rb_define_method (cEcoreEvas, "set_size_min", c_set_size_min, 2);
700 rb_define_method (cEcoreEvas, "get_size_max", c_get_size_max, 0);
701 rb_define_method (cEcoreEvas, "set_size_max", c_set_size_max, 2);
702 rb_define_method (cEcoreEvas, "move", c_move, 2);
703 rb_define_method (cEcoreEvas, "resize", c_resize, 2);
704 rb_define_method (cEcoreEvas, "title", c_title_get, 0);
705 rb_define_method (cEcoreEvas, "title=", c_title_set, 1);
706 rb_define_method (cEcoreEvas, "borderless?", c_borderless_get, 0);
707 rb_define_method (cEcoreEvas, "borderless=", c_borderless_set, 1);
708 rb_define_method (cEcoreEvas, "shaped?", c_shaped_get, 0);
709 rb_define_method (cEcoreEvas, "shaped=", c_shaped_set, 1);
710 rb_define_method (cEcoreEvas, "sticky?", c_sticky_get, 0);
711 rb_define_method (cEcoreEvas, "sticky=", c_sticky_set, 1);
712 rb_define_method (cEcoreEvas, "rotation", c_rotation_get, 0);
713 rb_define_method (cEcoreEvas, "rotation=", c_rotation_set, 1);
715 rb_define_method (cEcoreEvas, "on_resize", c_on_resize, 0);
716 rb_define_method (cEcoreEvas, "on_move", c_on_move, 0);
717 rb_define_method (cEcoreEvas, "on_show", c_on_show, 0);
718 rb_define_method (cEcoreEvas, "on_hide", c_on_hide, 0);
719 rb_define_method (cEcoreEvas, "on_delete_request", c_on_delete_request, 0);
720 rb_define_method (cEcoreEvas, "on_destroy", c_on_destroy, 0);
721 rb_define_method (cEcoreEvas, "on_focus_in", c_on_focus_in, 0);
722 rb_define_method (cEcoreEvas, "on_focus_out", c_on_focus_out, 0);
723 rb_define_method (cEcoreEvas, "on_mouse_in", c_on_mouse_in, 0);
724 rb_define_method (cEcoreEvas, "on_mouse_out", c_on_mouse_out, 0);
725 rb_define_method (cEcoreEvas, "on_pre_render", c_on_pre_render, 0);
726 rb_define_method (cEcoreEvas, "on_post_render", c_on_post_render, 0);
728 objects = rb_hash_new ();
729 rb_global_variable (&objects);