2 * $Id: rb_ecore_evas.c 50 2004-08-01 10:18:39Z tilman $
4 * Copyright (C) 2004 Tilman Sauerbeck (tilman at code-monkey de)
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_ADD_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 static VALUE c_on_##name (VALUE self) \
47 GET_OBJ (self, RbEcoreEvas, ee); \
49 if (!rb_block_given_p ()) \
52 rb_hash_aset (ee->callbacks, rb_str_new2 (#name), \
55 ecore_evas_callback_##name##_set (ee->real, on_##name); \
60 #define CALLBACK_ADD(mod, name) \
61 rb_define_method ((mod), "on_"#name, c_on_##name, 0);
66 /* called by the child classes */
67 void c_ecore_evas_mark (RbEcoreEvas *ee)
69 if (!NIL_P (ee->evas))
70 rb_gc_mark (ee->evas);
72 rb_gc_mark (ee->callbacks);
75 void c_ecore_evas_free (RbEcoreEvas *ee, bool free_mem)
78 ecore_evas_free (ee->real);
80 ecore_evas_shutdown ();
87 static VALUE c_init (int argc, VALUE *argv, VALUE self)
89 GET_OBJ (self, RbEcoreEvas, ee);
92 ee->callbacks = rb_hash_new ();
94 rb_hash_aset (objects, INT2NUM ((long) ee->real), self);
99 static VALUE c_inspect (VALUE self)
101 INSPECT (self, RbEcoreEvas);
104 static VALUE c_show (VALUE self)
106 GET_OBJ (self, RbEcoreEvas, ee);
108 ecore_evas_show (ee->real);
113 static VALUE c_hide (VALUE self)
115 GET_OBJ (self, RbEcoreEvas, ee);
117 ecore_evas_hide (ee->real);
122 static VALUE c_visible_get (VALUE self)
124 GET_OBJ (self, RbEcoreEvas, ee);
126 return ecore_evas_visibility_get (ee->real) ? Qtrue : Qfalse;
129 static VALUE c_raise (VALUE self)
131 GET_OBJ (self, RbEcoreEvas, ee);
133 ecore_evas_raise (ee->real);
138 static VALUE c_lower (VALUE self)
140 GET_OBJ (self, RbEcoreEvas, ee);
142 ecore_evas_lower (ee->real);
147 static VALUE c_layer_get (VALUE self)
149 GET_OBJ (self, RbEcoreEvas, ee);
151 return INT2FIX (ecore_evas_layer_get (ee->real));
154 static VALUE c_layer_set (VALUE self, VALUE val)
156 GET_OBJ (self, RbEcoreEvas, ee);
158 Check_Type (val, T_FIXNUM);
160 ecore_evas_layer_set (ee->real, FIX2INT (val));
165 static VALUE c_evas_get (VALUE self)
167 GET_OBJ (self, RbEcoreEvas, ee);
169 if (NIL_P (ee->evas))
170 ee->evas = TO_EVAS (self, ecore_evas_get (ee->real));
175 static VALUE c_geometry_get (VALUE self)
177 int x = 0, y = 0, w = 0, h = 0;
179 GET_OBJ (self, RbEcoreEvas, ee);
181 ecore_evas_geometry_get (ee->real, &x, &y, &w, &h);
183 return rb_ary_new3 (4, INT2FIX (x), INT2FIX (y),
184 INT2FIX (w), INT2FIX (h));
187 static VALUE c_get_size_min (VALUE self)
191 GET_OBJ (self, RbEcoreEvas, ee);
193 ecore_evas_size_min_get (ee->real, &w, &h);
195 return rb_ary_new3 (2, INT2FIX (w), INT2FIX (h));
198 static VALUE c_set_size_min (VALUE self, VALUE w, VALUE h)
200 GET_OBJ (self, RbEcoreEvas, ee);
202 Check_Type (w, T_FIXNUM);
203 Check_Type (h, T_FIXNUM);
205 ecore_evas_size_min_set (ee->real, FIX2INT (w), FIX2INT (h));
210 static VALUE c_get_size_max (VALUE self)
214 GET_OBJ (self, RbEcoreEvas, ee);
216 ecore_evas_size_max_get (ee->real, &w, &h);
218 return rb_ary_new3 (2, INT2FIX (w), INT2FIX (h));
221 static VALUE c_set_size_max (VALUE self, VALUE w, VALUE h)
223 GET_OBJ (self, RbEcoreEvas, ee);
225 Check_Type (w, T_FIXNUM);
226 Check_Type (h, T_FIXNUM);
228 ecore_evas_size_max_set (ee->real, FIX2INT (w), FIX2INT (h));
233 static VALUE c_move (VALUE self, VALUE x, VALUE y)
235 GET_OBJ (self, RbEcoreEvas, ee);
237 Check_Type (x, T_FIXNUM);
238 Check_Type (y, T_FIXNUM);
240 ecore_evas_move (ee->real, FIX2INT (x), FIX2INT (y));
245 static VALUE c_resize (VALUE self, VALUE w, VALUE h)
247 GET_OBJ (self, RbEcoreEvas, ee);
249 Check_Type (w, T_FIXNUM);
250 Check_Type (h, T_FIXNUM);
252 ecore_evas_resize (ee->real, FIX2INT (w), FIX2INT (h));
257 static VALUE c_title_get (VALUE self)
261 GET_OBJ (self, RbEcoreEvas, ee);
263 if (!(tmp = ecore_evas_title_get (ee->real)))
266 return rb_str_new2 (tmp);
269 static VALUE c_title_set (VALUE self, VALUE val)
271 GET_OBJ (self, RbEcoreEvas, ee);
273 Check_Type (val, T_STRING);
275 ecore_evas_title_set (ee->real, StringValuePtr (val));
280 static VALUE c_borderless_get (VALUE self)
282 GET_OBJ (self, RbEcoreEvas, ee);
284 return ecore_evas_borderless_get (ee->real) ? Qtrue : Qfalse;
287 static VALUE c_borderless_set (VALUE self, VALUE val)
289 GET_OBJ (self, RbEcoreEvas, ee);
293 ecore_evas_borderless_set (ee->real, val == Qtrue);
298 static VALUE c_shaped_get (VALUE self)
300 GET_OBJ (self, RbEcoreEvas, ee);
302 return ecore_evas_shaped_get (ee->real) ? Qtrue : Qfalse;
305 static VALUE c_shaped_set (VALUE self, VALUE val)
307 GET_OBJ (self, RbEcoreEvas, ee);
311 ecore_evas_shaped_set (ee->real, val == Qtrue);
316 static VALUE c_sticky_get (VALUE self)
318 GET_OBJ (self, RbEcoreEvas, ee);
320 return ecore_evas_sticky_get (ee->real) ? Qtrue : Qfalse;
323 static VALUE c_sticky_set (VALUE self, VALUE val)
325 GET_OBJ (self, RbEcoreEvas, ee);
329 ecore_evas_sticky_set (ee->real, val == Qtrue);
334 static VALUE c_rotation_get (VALUE self)
336 GET_OBJ (self, RbEcoreEvas, ee);
338 return INT2FIX (ecore_evas_rotation_get (ee->real));
341 static VALUE c_rotation_set (VALUE self, VALUE val)
343 GET_OBJ (self, RbEcoreEvas, ee);
345 Check_Type (val, T_FIXNUM);
347 ecore_evas_rotation_set (ee->real, FIX2INT (val));
352 /* FIXME: this is unsafe! */
353 static VALUE c_delete (VALUE self)
355 GET_OBJ (self, RbEcoreEvas, ee);
357 /* reap our children */
360 ecore_evas_free (ee->real);
361 rb_hash_aset (objects, INT2NUM ((long) ee->real), Qnil);
367 CALLBACK_ADD_HANDLER (resize);
368 CALLBACK_ADD_HANDLER (move);
369 CALLBACK_ADD_HANDLER (show);
370 CALLBACK_ADD_HANDLER (hide);
371 CALLBACK_ADD_HANDLER (delete_request);
372 CALLBACK_ADD_HANDLER (destroy);
373 CALLBACK_ADD_HANDLER (focus_in);
374 CALLBACK_ADD_HANDLER (focus_out);
375 CALLBACK_ADD_HANDLER (mouse_in);
376 CALLBACK_ADD_HANDLER (mouse_out);
377 CALLBACK_ADD_HANDLER (pre_render);
378 CALLBACK_ADD_HANDLER (post_render);
380 void Init_EcoreEvas (void)
382 cEcoreEvas = rb_define_class_under (mEvas, "EcoreEvas", rb_cObject);
384 rb_define_private_method (rb_singleton_class (cEcoreEvas),
386 rb_define_method (cEcoreEvas, "initialize", c_init, -1);
387 rb_define_method (cEcoreEvas, "inspect", c_inspect, 0);
388 rb_define_method (cEcoreEvas, "delete", c_delete, 0);
389 rb_define_method (cEcoreEvas, "show", c_show, 0);
390 rb_define_method (cEcoreEvas, "hide", c_hide, 0);
391 rb_define_method (cEcoreEvas, "visible?", c_visible_get, 0);
392 rb_define_method (cEcoreEvas, "raise", c_raise, 0);
393 rb_define_method (cEcoreEvas, "lower", c_lower, 0);
394 rb_define_method (cEcoreEvas, "layer", c_layer_get, 0);
395 rb_define_method (cEcoreEvas, "layer=", c_layer_set, 1);
396 rb_define_method (cEcoreEvas, "evas", c_evas_get, 0);
397 rb_define_method (cEcoreEvas, "geometry", c_geometry_get, 0);
398 rb_define_method (cEcoreEvas, "get_size_min", c_get_size_min, 0);
399 rb_define_method (cEcoreEvas, "set_size_min", c_set_size_min, 2);
400 rb_define_method (cEcoreEvas, "get_size_max", c_get_size_max, 0);
401 rb_define_method (cEcoreEvas, "set_size_max", c_set_size_max, 2);
402 rb_define_method (cEcoreEvas, "move", c_move, 2);
403 rb_define_method (cEcoreEvas, "resize", c_resize, 2);
404 rb_define_method (cEcoreEvas, "title", c_title_get, 0);
405 rb_define_method (cEcoreEvas, "title=", c_title_set, 1);
406 rb_define_method (cEcoreEvas, "borderless?", c_borderless_get, 0);
407 rb_define_method (cEcoreEvas, "borderless=", c_borderless_set, 1);
408 rb_define_method (cEcoreEvas, "shaped?", c_shaped_get, 0);
409 rb_define_method (cEcoreEvas, "shaped=", c_shaped_set, 1);
410 rb_define_method (cEcoreEvas, "sticky?", c_sticky_get, 0);
411 rb_define_method (cEcoreEvas, "sticky=", c_sticky_set, 1);
412 rb_define_method (cEcoreEvas, "rotation", c_rotation_get, 0);
413 rb_define_method (cEcoreEvas, "rotation=", c_rotation_set, 1);
415 CALLBACK_ADD (cEcoreEvas, resize);
416 CALLBACK_ADD (cEcoreEvas, move);
417 CALLBACK_ADD (cEcoreEvas, show);
418 CALLBACK_ADD (cEcoreEvas, hide);
419 CALLBACK_ADD (cEcoreEvas, delete_request);
420 CALLBACK_ADD (cEcoreEvas, destroy);
421 CALLBACK_ADD (cEcoreEvas, focus_in);
422 CALLBACK_ADD (cEcoreEvas, focus_out);
423 CALLBACK_ADD (cEcoreEvas, mouse_in);
424 CALLBACK_ADD (cEcoreEvas, mouse_out);
425 CALLBACK_ADD (cEcoreEvas, pre_render);
426 CALLBACK_ADD (cEcoreEvas, post_render);
428 objects = rb_hash_new ();
429 rb_global_variable (&objects);