2 * $Id: rb_ecore_evas.c 45 2004-07-26 11:00:14Z 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
24 #include <Ecore_Evas.h>
27 #define __RB_ECORE_EVAS_C
28 #include "../ecore/rb_ecore.h"
29 #include "rb_ecore_evas_main.h"
30 #include "rb_ecore_evas.h"
32 #define CALLBACK_ADD_HANDLER(name) \
33 static void on_##name (Ecore_Evas *ee) \
35 VALUE self = rb_hash_aref (objects, INT2NUM ((long) ee)); \
36 VALUE hash = rb_hash_aref (callbacks, self); \
38 rb_funcall (rb_hash_aref (hash, rb_str_new2 (#name)), \
39 rb_intern ("call"), 0); \
42 static VALUE c_on_##name (VALUE self) \
46 GET_OBJ (self, Ecore_Evas *, ee); \
48 if (!rb_block_given_p ()) \
51 if (NIL_P ((hash = rb_hash_aref (callbacks, self)))) { \
52 hash = rb_hash_new (); \
54 rb_global_variable (&hash); \
55 rb_hash_aset (callbacks, self, hash); \
58 rb_hash_aset (hash, rb_str_new2 (#name), rb_block_proc ()); \
60 ecore_evas_callback_##name##_set (*ee, on_##name); \
65 #define CALLBACK_ADD(mod, name) \
66 rb_define_method ((mod), "on_"#name, c_on_##name, 0);
69 static VALUE evases, callbacks, objects;
71 /* called by the child classes */
72 void c_ecore_evas_free (Ecore_Evas **ee)
75 rb_hash_aset (objects, INT2NUM ((long) *ee), Qnil);
76 ecore_evas_free (*ee);
79 rb_hash_aset (evases, INT2NUM ((long) ee), Qnil);
81 ecore_evas_shutdown ();
87 static VALUE c_initialize (int argc, VALUE *argv, VALUE self)
89 Ecore_Evas **ee = NULL;
91 Data_Get_Struct (self, Ecore_Evas *, ee);
93 rb_hash_aset (objects, INT2NUM ((long) *ee), self);
98 static VALUE c_inspect (VALUE self)
100 INSPECT (self, Ecore_Evas *);
103 static VALUE c_show (VALUE self)
105 GET_OBJ (self, Ecore_Evas *, ee);
107 ecore_evas_show (*ee);
112 static VALUE c_hide (VALUE self)
114 GET_OBJ (self, Ecore_Evas *, ee);
116 ecore_evas_hide (*ee);
121 static VALUE c_visible_get (VALUE self)
123 GET_OBJ (self, Ecore_Evas *, ee);
125 return ecore_evas_visibility_get (*ee) ? Qtrue : Qfalse;
128 static VALUE c_raise (VALUE self)
130 GET_OBJ (self, Ecore_Evas *, ee);
132 ecore_evas_raise (*ee);
137 static VALUE c_lower (VALUE self)
139 GET_OBJ (self, Ecore_Evas *, ee);
141 ecore_evas_lower (*ee);
146 static VALUE c_layer_get (VALUE self)
148 GET_OBJ (self, Ecore_Evas *, ee);
150 return INT2FIX (ecore_evas_layer_get (*ee));
153 static VALUE c_layer_set (VALUE self, VALUE val)
155 GET_OBJ (self, Ecore_Evas *, ee);
157 Check_Type (val, T_FIXNUM);
159 ecore_evas_layer_set (*ee, FIX2INT (val));
164 static VALUE c_evas_get (VALUE self)
168 GET_OBJ (self, Ecore_Evas *, ee);
170 if (NIL_P (evas = rb_hash_aref (evases, INT2NUM ((long) (ee))))) {
171 evas = TO_EVAS (self, ecore_evas_get (*ee));
172 rb_hash_aset (evases, INT2NUM ((long) ee), evas);
178 static VALUE c_geometry_get (VALUE self)
180 int x = 0, y = 0, w = 0, h = 0;
182 GET_OBJ (self, Ecore_Evas *, ee);
184 ecore_evas_geometry_get (*ee, &x, &y, &w, &h);
186 return rb_ary_new3 (4, INT2FIX (x), INT2FIX (y),
187 INT2FIX (w), INT2FIX (h));
190 static VALUE c_get_size_min (VALUE self)
194 GET_OBJ (self, Ecore_Evas *, ee);
196 ecore_evas_size_min_get (*ee, &w, &h);
198 return rb_ary_new3 (2, INT2FIX (w), INT2FIX (h));
201 static VALUE c_set_size_min (VALUE self, VALUE w, VALUE h)
203 GET_OBJ (self, Ecore_Evas *, ee);
205 Check_Type (w, T_FIXNUM);
206 Check_Type (h, T_FIXNUM);
208 ecore_evas_size_min_set (*ee, FIX2INT (w), FIX2INT (h));
213 static VALUE c_get_size_max (VALUE self)
217 GET_OBJ (self, Ecore_Evas *, ee);
219 ecore_evas_size_max_get (*ee, &w, &h);
221 return rb_ary_new3 (2, INT2FIX (w), INT2FIX (h));
224 static VALUE c_set_size_max (VALUE self, VALUE w, VALUE h)
226 GET_OBJ (self, Ecore_Evas *, ee);
228 Check_Type (w, T_FIXNUM);
229 Check_Type (h, T_FIXNUM);
231 ecore_evas_size_max_set (*ee, FIX2INT (w), FIX2INT (h));
236 static VALUE c_move (VALUE self, VALUE x, VALUE y)
238 GET_OBJ (self, Ecore_Evas *, ee);
240 Check_Type (x, T_FIXNUM);
241 Check_Type (y, T_FIXNUM);
243 ecore_evas_move (*ee, FIX2INT (x), FIX2INT (y));
248 static VALUE c_resize (VALUE self, VALUE w, VALUE h)
250 GET_OBJ (self, Ecore_Evas *, ee);
252 Check_Type (w, T_FIXNUM);
253 Check_Type (h, T_FIXNUM);
255 ecore_evas_resize (*ee, FIX2INT (w), FIX2INT (h));
260 static VALUE c_title_get (VALUE self)
264 GET_OBJ (self, Ecore_Evas *, ee);
266 if (!(tmp = ecore_evas_title_get (*ee)))
269 return rb_str_new2 (tmp);
272 static VALUE c_title_set (VALUE self, VALUE val)
274 GET_OBJ (self, Ecore_Evas *, ee);
276 Check_Type (val, T_STRING);
278 ecore_evas_title_set (*ee, StringValuePtr (val));
283 static VALUE c_borderless_get (VALUE self)
285 GET_OBJ (self, Ecore_Evas *, ee);
287 return ecore_evas_borderless_get (*ee) ? Qtrue : Qfalse;
290 static VALUE c_borderless_set (VALUE self, VALUE val)
292 GET_OBJ (self, Ecore_Evas *, ee);
296 ecore_evas_borderless_set (*ee, val == Qtrue ? 1 : 0);
301 static VALUE c_shaped_get (VALUE self)
303 GET_OBJ (self, Ecore_Evas *, ee);
305 return ecore_evas_shaped_get (*ee) ? Qtrue : Qfalse;
308 static VALUE c_shaped_set (VALUE self, VALUE val)
310 GET_OBJ (self, Ecore_Evas *, ee);
314 ecore_evas_shaped_set (*ee, val == Qtrue ? 1 : 0);
319 static VALUE c_sticky_get (VALUE self)
321 GET_OBJ (self, Ecore_Evas *, ee);
323 return ecore_evas_sticky_get (*ee) ? Qtrue : Qfalse;
326 static VALUE c_sticky_set (VALUE self, VALUE val)
328 GET_OBJ (self, Ecore_Evas *, ee);
332 ecore_evas_sticky_set (*ee, val == Qtrue ? 1 : 0);
337 static VALUE c_rotation_get (VALUE self)
339 GET_OBJ (self, Ecore_Evas *, ee);
341 return INT2FIX (ecore_evas_rotation_get (*ee));
344 static VALUE c_rotation_set (VALUE self, VALUE val)
346 GET_OBJ (self, Ecore_Evas *, ee);
348 Check_Type (val, T_FIXNUM);
350 ecore_evas_rotation_set (*ee, FIX2INT (val));
355 /* FIXME: this is unsafe! */
356 static VALUE c_delete (VALUE self)
358 GET_OBJ (self, Ecore_Evas *, ee);
360 /* reap our children */
363 ecore_evas_free (*ee);
364 rb_hash_aset (objects, INT2NUM ((long) *ee), Qnil);
370 CALLBACK_ADD_HANDLER (resize);
371 CALLBACK_ADD_HANDLER (move);
372 CALLBACK_ADD_HANDLER (show);
373 CALLBACK_ADD_HANDLER (hide);
374 CALLBACK_ADD_HANDLER (delete_request);
375 CALLBACK_ADD_HANDLER (destroy);
376 CALLBACK_ADD_HANDLER (focus_in);
377 CALLBACK_ADD_HANDLER (focus_out);
378 CALLBACK_ADD_HANDLER (mouse_in);
379 CALLBACK_ADD_HANDLER (mouse_out);
380 CALLBACK_ADD_HANDLER (pre_render);
381 CALLBACK_ADD_HANDLER (post_render);
383 void Init_EcoreEvas (void)
385 cEcoreEvas = rb_define_class_under (mEvas, "EcoreEvas", rb_cObject);
387 rb_define_private_method (rb_singleton_class (cEcoreEvas),
389 rb_define_method (cEcoreEvas, "initialize", c_initialize, -1);
390 rb_define_method (cEcoreEvas, "inspect", c_inspect, 0);
391 rb_define_method (cEcoreEvas, "delete", c_delete, 0);
392 rb_define_method (cEcoreEvas, "show", c_show, 0);
393 rb_define_method (cEcoreEvas, "hide", c_hide, 0);
394 rb_define_method (cEcoreEvas, "visible?", c_visible_get, 0);
395 rb_define_method (cEcoreEvas, "raise", c_raise, 0);
396 rb_define_method (cEcoreEvas, "lower", c_lower, 0);
397 rb_define_method (cEcoreEvas, "layer", c_layer_get, 0);
398 rb_define_method (cEcoreEvas, "layer=", c_layer_set, 1);
399 rb_define_method (cEcoreEvas, "evas", c_evas_get, 0);
400 rb_define_method (cEcoreEvas, "geometry", c_geometry_get, 0);
401 rb_define_method (cEcoreEvas, "get_size_min", c_get_size_min, 0);
402 rb_define_method (cEcoreEvas, "set_size_min", c_set_size_min, 2);
403 rb_define_method (cEcoreEvas, "get_size_max", c_get_size_max, 0);
404 rb_define_method (cEcoreEvas, "set_size_max", c_set_size_max, 2);
405 rb_define_method (cEcoreEvas, "move", c_move, 2);
406 rb_define_method (cEcoreEvas, "resize", c_resize, 2);
407 rb_define_method (cEcoreEvas, "title", c_title_get, 0);
408 rb_define_method (cEcoreEvas, "title=", c_title_set, 1);
409 rb_define_method (cEcoreEvas, "borderless?", c_borderless_get, 0);
410 rb_define_method (cEcoreEvas, "borderless=", c_borderless_set, 1);
411 rb_define_method (cEcoreEvas, "shaped?", c_shaped_get, 0);
412 rb_define_method (cEcoreEvas, "shaped=", c_shaped_set, 1);
413 rb_define_method (cEcoreEvas, "sticky?", c_sticky_get, 0);
414 rb_define_method (cEcoreEvas, "sticky=", c_sticky_set, 1);
415 rb_define_method (cEcoreEvas, "rotation", c_rotation_get, 0);
416 rb_define_method (cEcoreEvas, "rotation=", c_rotation_set, 1);
418 CALLBACK_ADD (cEcoreEvas, resize);
419 CALLBACK_ADD (cEcoreEvas, move);
420 CALLBACK_ADD (cEcoreEvas, show);
421 CALLBACK_ADD (cEcoreEvas, hide);
422 CALLBACK_ADD (cEcoreEvas, delete_request);
423 CALLBACK_ADD (cEcoreEvas, destroy);
424 CALLBACK_ADD (cEcoreEvas, focus_in);
425 CALLBACK_ADD (cEcoreEvas, focus_out);
426 CALLBACK_ADD (cEcoreEvas, mouse_in);
427 CALLBACK_ADD (cEcoreEvas, mouse_out);
428 CALLBACK_ADD (cEcoreEvas, pre_render);
429 CALLBACK_ADD (cEcoreEvas, post_render);
431 evases = rb_hash_new ();
432 rb_global_variable (&evases);
434 objects = rb_hash_new ();
435 rb_global_variable (&objects);
437 callbacks = rb_hash_new ();
438 rb_global_variable (&callbacks);