2 * $Id: rb_ecore_evas.c 386 2006-09-06 19:38:45Z 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 RUBY_ECORE_EVAS_KEY "__RB_ECORE_EVAS_KEY"
35 #define CALLBACK_DEFINE_HANDLER(name) \
36 static void on_##name (Ecore_Evas *real) \
40 self = (VALUE) ecore_evas_data_get (real, \
41 RUBY_ECORE_EVAS_KEY); \
42 GET_OBJ (self, RbEcoreEvas, ee); \
44 cb = rb_hash_aref (ee->callbacks, \
45 LONG2NUM ((long) ecore_evas_callback_##name##_set)); \
46 rb_funcall (cb, rb_intern ("call"), 0); \
49 #define CALLBACK_REG_HANDLER(name) \
50 GET_OBJ (self, RbEcoreEvas, ee); \
52 if (!rb_block_given_p ()) \
55 if (NIL_P (ee->callbacks)) \
56 ee->callbacks = rb_hash_new (); \
58 rb_hash_aset (ee->callbacks, \
59 LONG2NUM ((long) ecore_evas_callback_##name##_set), \
62 ecore_evas_callback_##name##_set (ee->real, on_##name); \
68 /* called by the child classes */
69 void c_ecore_evas_mark (RbEcoreEvas *ee)
71 if (!NIL_P (ee->evas))
72 rb_gc_mark (ee->evas);
74 if (!NIL_P (ee->callbacks))
75 rb_gc_mark (ee->callbacks);
78 void c_ecore_evas_free (RbEcoreEvas *ee, bool free_mem)
81 ecore_evas_free (ee->real);
83 ecore_evas_shutdown ();
91 static VALUE c_init (int argc, VALUE *argv, VALUE self)
93 GET_OBJ (self, RbEcoreEvas, ee);
98 ecore_evas_data_set (ee->real, RUBY_ECORE_EVAS_KEY, (void *) self);
104 static VALUE c_inspect (VALUE self)
106 INSPECT (self, RbEcoreEvas);
115 static VALUE c_show (VALUE self)
117 GET_OBJ (self, RbEcoreEvas, ee);
119 ecore_evas_show (ee->real);
130 static VALUE c_hide (VALUE self)
132 GET_OBJ (self, RbEcoreEvas, ee);
134 ecore_evas_hide (ee->real);
141 * ee.visible? => true or false
143 * Returns true if <i>ee</i> is visible, else returns false.
145 static VALUE c_visible_get (VALUE self)
147 GET_OBJ (self, RbEcoreEvas, ee);
149 return ecore_evas_visibility_get (ee->real) ? Qtrue : Qfalse;
158 static VALUE c_raise (VALUE self)
160 GET_OBJ (self, RbEcoreEvas, ee);
162 ecore_evas_raise (ee->real);
173 static VALUE c_lower (VALUE self)
175 GET_OBJ (self, RbEcoreEvas, ee);
177 ecore_evas_lower (ee->real);
186 * Returns the layer of <i>ee</i>.
188 static VALUE c_layer_get (VALUE self)
190 GET_OBJ (self, RbEcoreEvas, ee);
192 return INT2FIX (ecore_evas_layer_get (ee->real));
197 * ee.layer(fixnum) => fixnum
199 * Sets the layer of <i>ee</i>.
201 static VALUE c_layer_set (VALUE self, VALUE val)
203 GET_OBJ (self, RbEcoreEvas, ee);
205 Check_Type (val, T_FIXNUM);
207 ecore_evas_layer_set (ee->real, FIX2INT (val));
216 * Returns the <code>Evas::Evas</code> object for <i>ee</i>.
218 static VALUE c_evas_get (VALUE self)
220 GET_OBJ (self, RbEcoreEvas, ee);
222 if (NIL_P (ee->evas))
223 ee->evas = TO_EVAS (self, ecore_evas_get (ee->real));
230 * ee.geometry => array
232 * Returns an array containing the geometry of <i>ee</i>.
234 * ee.move(150, 300) #=> nil
235 * ee.resize(200, 200) #=> nil
236 * ee.geometry #=> [150, 300, 200, 200]
238 static VALUE c_geometry_get (VALUE self)
240 int x = 0, y = 0, w = 0, h = 0;
242 GET_OBJ (self, RbEcoreEvas, ee);
244 ecore_evas_geometry_get (ee->real, &x, &y, &w, &h);
246 return rb_ary_new3 (4, INT2FIX (x), INT2FIX (y),
247 INT2FIX (w), INT2FIX (h));
252 * ee.get_size_min => array
254 * Returns an array containing the minimum size of <i>ee</i>.
256 * ee.set_size_min(100, 200) #=> nil
257 * ee.get_size_min #=> [100, 200]
259 static VALUE c_get_size_min (VALUE self)
263 GET_OBJ (self, RbEcoreEvas, ee);
265 ecore_evas_size_min_get (ee->real, &w, &h);
267 return rb_ary_new3 (2, INT2FIX (w), INT2FIX (h));
272 * ee.set_size_min(width, height) => nil
274 * Sets the minimum size of <i>ee</i>.
276 * ee.set_size_min(100, 200) #=> nil
278 static VALUE c_set_size_min (VALUE self, VALUE w, VALUE h)
280 GET_OBJ (self, RbEcoreEvas, ee);
282 Check_Type (w, T_FIXNUM);
283 Check_Type (h, T_FIXNUM);
285 ecore_evas_size_min_set (ee->real, FIX2INT (w), FIX2INT (h));
292 * ee.get_size_max => array
294 * Returns an array containing the maximum size of <i>ee</i>.
296 * ee.set_size_max(100, 200) #=> nil
297 * ee.get_size_max #=> [100, 200]
299 static VALUE c_get_size_max (VALUE self)
303 GET_OBJ (self, RbEcoreEvas, ee);
305 ecore_evas_size_max_get (ee->real, &w, &h);
307 return rb_ary_new3 (2, INT2FIX (w), INT2FIX (h));
312 * ee.set_size_max(width, height) => nil
314 * Sets the maximum size of <i>ee</i>.
316 * ee.set_size_max(100, 200) #=> nil
318 static VALUE c_set_size_max (VALUE self, VALUE w, VALUE h)
320 GET_OBJ (self, RbEcoreEvas, ee);
322 Check_Type (w, T_FIXNUM);
323 Check_Type (h, T_FIXNUM);
325 ecore_evas_size_max_set (ee->real, FIX2INT (w), FIX2INT (h));
332 * ee.move(x, y) => nil
334 * Moves <i>ee</i> to the coordinates specified in
335 * <i>x</i> and <i>y</i>.
337 * ee.move(100, 200) #=> nil
339 static VALUE c_move (VALUE self, VALUE x, VALUE y)
341 GET_OBJ (self, RbEcoreEvas, ee);
343 Check_Type (x, T_FIXNUM);
344 Check_Type (y, T_FIXNUM);
346 ecore_evas_move (ee->real, FIX2INT (x), FIX2INT (y));
353 * ee.resize(width, height) => nil
355 * Resizes <i>ee</i> to width x height.
357 * ee.resize(100, 200) #=> nil
359 static VALUE c_resize (VALUE self, VALUE w, VALUE h)
361 GET_OBJ (self, RbEcoreEvas, ee);
363 Check_Type (w, T_FIXNUM);
364 Check_Type (h, T_FIXNUM);
366 ecore_evas_resize (ee->real, FIX2INT (w), FIX2INT (h));
375 * Returns the title of <i>ee</i>.
377 static VALUE c_title_get (VALUE self)
381 GET_OBJ (self, RbEcoreEvas, ee);
383 if (!(tmp = ecore_evas_title_get (ee->real)))
386 return rb_str_new2 (tmp);
393 * Sets the title of <i>ee</i>.
395 static VALUE c_title_set (VALUE self, VALUE val)
397 GET_OBJ (self, RbEcoreEvas, ee);
399 Check_Type (val, T_STRING);
401 ecore_evas_title_set (ee->real, StringValuePtr (val));
408 * ee.borderless? => true or false
410 * Returns true if <i>ee</i> is borderless, else returns false.
412 static VALUE c_borderless_get (VALUE self)
414 GET_OBJ (self, RbEcoreEvas, ee);
416 return ecore_evas_borderless_get (ee->real) ? Qtrue : Qfalse;
421 * ee.borderless(true or false)
423 * Sets whether <i>ee</i> is borderless or not.
425 static VALUE c_borderless_set (VALUE self, VALUE val)
427 GET_OBJ (self, RbEcoreEvas, ee);
431 ecore_evas_borderless_set (ee->real, val == Qtrue);
438 * ee.shaped? => true or false
440 * Returns true if <i>ee</i> is shaped, else returns false.
442 static VALUE c_shaped_get (VALUE self)
444 GET_OBJ (self, RbEcoreEvas, ee);
446 return ecore_evas_shaped_get (ee->real) ? Qtrue : Qfalse;
451 * ee.shaped(true or false)
453 * Sets whether <i>ee</i> is shaped or not.
455 static VALUE c_shaped_set (VALUE self, VALUE val)
457 GET_OBJ (self, RbEcoreEvas, ee);
461 ecore_evas_shaped_set (ee->real, val == Qtrue);
468 * ee.sticky? => true or false
470 * Returns true if <i>ee</i> is sticky, else returns false.
472 static VALUE c_sticky_get (VALUE self)
474 GET_OBJ (self, RbEcoreEvas, ee);
476 return ecore_evas_sticky_get (ee->real) ? Qtrue : Qfalse;
481 * ee.sticky(true or false)
483 * Sets whether <i>ee</i> is sticky or not.
485 static VALUE c_sticky_set (VALUE self, VALUE val)
487 GET_OBJ (self, RbEcoreEvas, ee);
491 ecore_evas_sticky_set (ee->real, val == Qtrue);
498 * ee.rotation => fixnum
500 * Returns the rotation of <i>ee</i>.
502 static VALUE c_rotation_get (VALUE self)
504 GET_OBJ (self, RbEcoreEvas, ee);
506 return INT2FIX (ecore_evas_rotation_get (ee->real));
511 * ee.rotation(fixnum)
513 * Sets the rotation of <i>ee</i>.
515 static VALUE c_rotation_set (VALUE self, VALUE val)
517 GET_OBJ (self, RbEcoreEvas, ee);
519 Check_Type (val, T_FIXNUM);
521 ecore_evas_rotation_set (ee->real, FIX2INT (val));
526 static VALUE c_name_class_get (VALUE self)
528 const char *name = NULL, *klass = NULL;
530 GET_OBJ (self, RbEcoreEvas, ee);
532 ecore_evas_name_class_get (ee->real, &name, &klass);
534 return rb_ary_new3 (2, name ? rb_str_new2 (name) : Qnil,
535 klass ? rb_str_new2 (klass) : Qnil);
538 static VALUE c_name_class_set (VALUE self, VALUE ary)
542 GET_OBJ (self, RbEcoreEvas, ee);
544 Check_Type (ary, T_ARRAY);
546 s1 = rb_ary_shift (ary);
547 s2 = rb_ary_shift (ary);
552 ecore_evas_name_class_set (ee->real, StringValuePtr (s1),
553 StringValuePtr (s2));
560 * ee.iconified? => true or false
562 * Returns true if <i>ee</i> is iconified, else returns false.
564 static VALUE c_iconified_get (VALUE self)
566 GET_OBJ (self, RbEcoreEvas, ee);
568 return ecore_evas_iconified_get (ee->real) ? Qtrue : Qfalse;
573 * ee.iconified(true or false)
575 * Sets whether <i>ee</i> is iconified or not.
577 static VALUE c_iconified_set (VALUE self, VALUE val)
579 GET_OBJ (self, RbEcoreEvas, ee);
583 ecore_evas_iconified_set (ee->real, val == Qtrue);
590 * ee.has_alpha? => true or false
592 * Returns true if <i>ee</i> has an alpha channel, else returns false.
594 static VALUE c_has_alpha_get (VALUE self)
596 GET_OBJ (self, RbEcoreEvas, ee);
598 return ecore_evas_alpha_get (ee->real) ? Qtrue : Qfalse;
603 * ee.has_alpha(true or false)
605 * Sets whether <i>ee</i> has an alpha channel or not.
607 static VALUE c_has_alpha_set (VALUE self, VALUE val)
609 GET_OBJ (self, RbEcoreEvas, ee);
613 ecore_evas_alpha_set (ee->real, val == Qtrue);
618 /* FIXME: this is unsafe!
621 static VALUE c_delete (VALUE self)
623 GET_OBJ (self, RbEcoreEvas, ee);
625 /* reap our children */
628 ecore_evas_free (ee->real);
634 CALLBACK_DEFINE_HANDLER (resize);
635 CALLBACK_DEFINE_HANDLER (move);
636 CALLBACK_DEFINE_HANDLER (show);
637 CALLBACK_DEFINE_HANDLER (hide);
638 CALLBACK_DEFINE_HANDLER (delete_request);
639 CALLBACK_DEFINE_HANDLER (destroy);
640 CALLBACK_DEFINE_HANDLER (focus_in);
641 CALLBACK_DEFINE_HANDLER (focus_out);
642 CALLBACK_DEFINE_HANDLER (mouse_in);
643 CALLBACK_DEFINE_HANDLER (mouse_out);
644 CALLBACK_DEFINE_HANDLER (pre_render);
645 CALLBACK_DEFINE_HANDLER (post_render);
649 * ee.on_resize { block } => nil
651 * Sets the handler for the resize event.
653 static VALUE c_on_resize (VALUE self)
655 CALLBACK_REG_HANDLER (resize);
660 * ee.on_move { block } => nil
662 * Sets the handler for the move event.
664 static VALUE c_on_move (VALUE self)
666 CALLBACK_REG_HANDLER (move);
671 * ee.on_show { block } => nil
673 * Sets the handler for the show event.
675 static VALUE c_on_show (VALUE self)
677 CALLBACK_REG_HANDLER (show);
682 * ee.on_hide { block } => nil
684 * Sets the handler for the hide event.
686 static VALUE c_on_hide (VALUE self)
688 CALLBACK_REG_HANDLER (hide);
693 * ee.on_delete_request { block } => nil
695 * Sets the handler for the delete request event.
697 static VALUE c_on_delete_request (VALUE self)
699 CALLBACK_REG_HANDLER (delete_request);
704 * ee.on_destroy { block } => nil
706 * Sets the handler for the destroy event.
708 static VALUE c_on_destroy (VALUE self)
710 CALLBACK_REG_HANDLER (destroy);
715 * ee.on_focus_in { block } => nil
717 * Sets the handler for the focus in event.
719 static VALUE c_on_focus_in (VALUE self)
721 CALLBACK_REG_HANDLER (focus_in);
726 * ee.on_focus_out { block } => nil
728 * Sets the handler for the focus out event.
730 static VALUE c_on_focus_out (VALUE self)
732 CALLBACK_REG_HANDLER (focus_out);
737 * ee.on_mouse_in { block } => nil
739 * Sets the handler for the mouse in event.
741 static VALUE c_on_mouse_in (VALUE self)
743 CALLBACK_REG_HANDLER (mouse_in);
748 * ee.on_mouse_out { block } => nil
750 * Sets the handler for the mouse out event.
752 static VALUE c_on_mouse_out (VALUE self)
754 CALLBACK_REG_HANDLER (mouse_out);
759 * ee.on_pre_render { block } => nil
761 * Sets the handler for the pre render event.
763 static VALUE c_on_pre_render (VALUE self)
765 CALLBACK_REG_HANDLER (pre_render);
770 * ee.on_post_render { block } => nil
772 * Sets the handler for the post render event.
774 static VALUE c_on_post_render (VALUE self)
776 CALLBACK_REG_HANDLER (post_render);
779 void Init_EcoreEvas (void)
781 cEcoreEvas = rb_define_class_under (mEvas, "EcoreEvas", rb_cObject);
783 rb_define_method (cEcoreEvas, "initialize", c_init, -1);
784 rb_define_method (cEcoreEvas, "inspect", c_inspect, 0);
785 rb_define_method (cEcoreEvas, "delete", c_delete, 0);
786 rb_define_method (cEcoreEvas, "show", c_show, 0);
787 rb_define_method (cEcoreEvas, "hide", c_hide, 0);
788 rb_define_method (cEcoreEvas, "visible?", c_visible_get, 0);
789 rb_define_method (cEcoreEvas, "raise", c_raise, 0);
790 rb_define_method (cEcoreEvas, "lower", c_lower, 0);
791 rb_define_method (cEcoreEvas, "layer", c_layer_get, 0);
792 rb_define_method (cEcoreEvas, "layer=", c_layer_set, 1);
793 rb_define_method (cEcoreEvas, "evas", c_evas_get, 0);
794 rb_define_method (cEcoreEvas, "geometry", c_geometry_get, 0);
795 rb_define_method (cEcoreEvas, "get_size_min", c_get_size_min, 0);
796 rb_define_method (cEcoreEvas, "set_size_min", c_set_size_min, 2);
797 rb_define_method (cEcoreEvas, "get_size_max", c_get_size_max, 0);
798 rb_define_method (cEcoreEvas, "set_size_max", c_set_size_max, 2);
799 rb_define_method (cEcoreEvas, "move", c_move, 2);
800 rb_define_method (cEcoreEvas, "resize", c_resize, 2);
801 rb_define_method (cEcoreEvas, "title", c_title_get, 0);
802 rb_define_method (cEcoreEvas, "title=", c_title_set, 1);
803 rb_define_method (cEcoreEvas, "borderless?", c_borderless_get, 0);
804 rb_define_method (cEcoreEvas, "borderless=", c_borderless_set, 1);
805 rb_define_method (cEcoreEvas, "shaped?", c_shaped_get, 0);
806 rb_define_method (cEcoreEvas, "shaped=", c_shaped_set, 1);
807 rb_define_method (cEcoreEvas, "sticky?", c_sticky_get, 0);
808 rb_define_method (cEcoreEvas, "sticky=", c_sticky_set, 1);
809 rb_define_method (cEcoreEvas, "rotation", c_rotation_get, 0);
810 rb_define_method (cEcoreEvas, "rotation=", c_rotation_set, 1);
811 rb_define_method (cEcoreEvas, "name_class", c_name_class_get, 0);
812 rb_define_method (cEcoreEvas, "name_class=", c_name_class_set, 1);
813 rb_define_method (cEcoreEvas, "iconified?", c_iconified_get, 0);
814 rb_define_method (cEcoreEvas, "iconified=", c_iconified_set, 1);
815 rb_define_method (cEcoreEvas, "has_alpha?", c_has_alpha_get, 0);
816 rb_define_method (cEcoreEvas, "has_alpha=", c_has_alpha_set, 1);
818 rb_define_method (cEcoreEvas, "on_resize", c_on_resize, 0);
819 rb_define_method (cEcoreEvas, "on_move", c_on_move, 0);
820 rb_define_method (cEcoreEvas, "on_show", c_on_show, 0);
821 rb_define_method (cEcoreEvas, "on_hide", c_on_hide, 0);
822 rb_define_method (cEcoreEvas, "on_delete_request", c_on_delete_request, 0);
823 rb_define_method (cEcoreEvas, "on_destroy", c_on_destroy, 0);
824 rb_define_method (cEcoreEvas, "on_focus_in", c_on_focus_in, 0);
825 rb_define_method (cEcoreEvas, "on_focus_out", c_on_focus_out, 0);
826 rb_define_method (cEcoreEvas, "on_mouse_in", c_on_mouse_in, 0);
827 rb_define_method (cEcoreEvas, "on_mouse_out", c_on_mouse_out, 0);
828 rb_define_method (cEcoreEvas, "on_pre_render", c_on_pre_render, 0);
829 rb_define_method (cEcoreEvas, "on_post_render", c_on_post_render, 0);