2 * $Id: rb_ecore_evas.c 40 2004-07-25 13:14:34Z 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 #include "../ecore/rb_ecore.h"
28 #include "rb_ecore_evas_main.h"
29 #include "rb_ecore_evas.h"
31 #define CALLBACK_ADD_HANDLER(name) \
32 static void on_##name (Ecore_Evas *ee) \
34 VALUE self = rb_hash_aref (objects, INT2NUM ((long) ee)); \
35 VALUE hash = rb_hash_aref (callbacks, self); \
37 rb_funcall (rb_hash_aref (hash, rb_str_new2 (#name)), \
38 rb_intern ("call"), 0); \
41 static VALUE c_on_##name (VALUE self) \
45 GET_OBJ (self, Ecore_Evas *, ee); \
47 if (!rb_block_given_p ()) \
50 if (NIL_P ((hash = rb_hash_aref (callbacks, self)))) { \
51 hash = rb_hash_new (); \
53 rb_global_variable (&hash); \
54 rb_hash_aset (callbacks, self, hash); \
57 rb_hash_aset (hash, rb_str_new2 (#name), rb_block_proc ()); \
59 ecore_evas_callback_##name##_set (*ee, on_##name); \
64 #define CALLBACK_ADD(mod, name) \
65 rb_define_method ((mod), "on_"#name, c_on_##name, 0);
67 static VALUE evases, callbacks, objects;
69 /* called by the child classes */
70 void c_ecore_evas_free (Ecore_Evas **ee)
73 rb_hash_aset (objects, INT2NUM ((long) *ee), Qnil);
74 ecore_evas_free (*ee);
77 rb_hash_aset (evases, INT2NUM ((long) ee), Qnil);
79 ecore_evas_shutdown ();
85 static VALUE c_initialize (int argc, VALUE *argv, VALUE self)
87 Ecore_Evas **ee = NULL;
89 Data_Get_Struct (self, Ecore_Evas *, ee);
91 rb_hash_aset (objects, INT2NUM ((long) *ee), self);
96 static VALUE c_inspect (VALUE self)
98 INSPECT (self, Ecore_Evas *);
101 static VALUE c_show (VALUE self)
103 GET_OBJ (self, Ecore_Evas *, ee);
105 ecore_evas_show (*ee);
110 static VALUE c_hide (VALUE self)
112 GET_OBJ (self, Ecore_Evas *, ee);
114 ecore_evas_hide (*ee);
119 static VALUE c_visible_get (VALUE self)
121 GET_OBJ (self, Ecore_Evas *, ee);
123 return ecore_evas_visibility_get (*ee) ? Qtrue : Qfalse;
126 static VALUE c_raise (VALUE self)
128 GET_OBJ (self, Ecore_Evas *, ee);
130 ecore_evas_raise (*ee);
135 static VALUE c_lower (VALUE self)
137 GET_OBJ (self, Ecore_Evas *, ee);
139 ecore_evas_lower (*ee);
144 static VALUE c_layer_get (VALUE self)
146 GET_OBJ (self, Ecore_Evas *, ee);
148 return INT2FIX (ecore_evas_layer_get (*ee));
151 static VALUE c_layer_set (VALUE self, VALUE val)
153 GET_OBJ (self, Ecore_Evas *, ee);
155 Check_Type (val, T_FIXNUM);
157 ecore_evas_layer_set (*ee, FIX2INT (val));
162 static VALUE c_evas_get (VALUE self)
166 GET_OBJ (self, Ecore_Evas *, ee);
168 if (NIL_P (evas = rb_hash_aref (evases, INT2NUM ((long) (ee))))) {
169 evas = TO_EVAS (self, ecore_evas_get (*ee));
170 rb_hash_aset (evases, INT2NUM ((long) ee), evas);
176 static VALUE c_geometry_get (VALUE self)
178 int x = 0, y = 0, w = 0, h = 0;
180 GET_OBJ (self, Ecore_Evas *, ee);
182 ecore_evas_geometry_get (*ee, &x, &y, &w, &h);
184 return rb_ary_new3 (4, INT2FIX (x), INT2FIX (y),
185 INT2FIX (w), INT2FIX (h));
188 static VALUE c_get_size_min (VALUE self)
192 GET_OBJ (self, Ecore_Evas *, ee);
194 ecore_evas_size_min_get (*ee, &w, &h);
196 return rb_ary_new3 (2, INT2FIX (w), INT2FIX (h));
199 static VALUE c_set_size_min (VALUE self, VALUE w, VALUE h)
201 GET_OBJ (self, Ecore_Evas *, ee);
203 Check_Type (w, T_FIXNUM);
204 Check_Type (h, T_FIXNUM);
206 ecore_evas_size_min_set (*ee, FIX2INT (w), FIX2INT (h));
211 static VALUE c_get_size_max (VALUE self)
215 GET_OBJ (self, Ecore_Evas *, ee);
217 ecore_evas_size_max_get (*ee, &w, &h);
219 return rb_ary_new3 (2, INT2FIX (w), INT2FIX (h));
222 static VALUE c_set_size_max (VALUE self, VALUE w, VALUE h)
224 GET_OBJ (self, Ecore_Evas *, ee);
226 Check_Type (w, T_FIXNUM);
227 Check_Type (h, T_FIXNUM);
229 ecore_evas_size_max_set (*ee, FIX2INT (w), FIX2INT (h));
234 static VALUE c_move (VALUE self, VALUE x, VALUE y)
236 GET_OBJ (self, Ecore_Evas *, ee);
238 Check_Type (x, T_FIXNUM);
239 Check_Type (y, T_FIXNUM);
241 ecore_evas_move (*ee, FIX2INT (x), FIX2INT (y));
246 static VALUE c_resize (VALUE self, VALUE w, VALUE h)
248 GET_OBJ (self, Ecore_Evas *, ee);
250 Check_Type (w, T_FIXNUM);
251 Check_Type (h, T_FIXNUM);
253 ecore_evas_resize (*ee, FIX2INT (w), FIX2INT (h));
258 static VALUE c_title_get (VALUE self)
262 GET_OBJ (self, Ecore_Evas *, ee);
264 if (!(tmp = ecore_evas_title_get (*ee)))
267 return rb_str_new2 (tmp);
270 static VALUE c_title_set (VALUE self, VALUE val)
272 GET_OBJ (self, Ecore_Evas *, ee);
274 Check_Type (val, T_STRING);
276 ecore_evas_title_set (*ee, StringValuePtr (val));
281 static VALUE c_borderless_get (VALUE self)
283 GET_OBJ (self, Ecore_Evas *, ee);
285 return ecore_evas_borderless_get (*ee) ? Qtrue : Qfalse;
288 static VALUE c_borderless_set (VALUE self, VALUE val)
290 GET_OBJ (self, Ecore_Evas *, ee);
294 ecore_evas_borderless_set (*ee, val == Qtrue ? 1 : 0);
299 static VALUE c_shaped_get (VALUE self)
301 GET_OBJ (self, Ecore_Evas *, ee);
303 return ecore_evas_shaped_get (*ee) ? Qtrue : Qfalse;
306 static VALUE c_shaped_set (VALUE self, VALUE val)
308 GET_OBJ (self, Ecore_Evas *, ee);
312 ecore_evas_shaped_set (*ee, val == Qtrue ? 1 : 0);
317 static VALUE c_sticky_get (VALUE self)
319 GET_OBJ (self, Ecore_Evas *, ee);
321 return ecore_evas_sticky_get (*ee) ? Qtrue : Qfalse;
324 static VALUE c_sticky_set (VALUE self, VALUE val)
326 GET_OBJ (self, Ecore_Evas *, ee);
330 ecore_evas_sticky_set (*ee, val == Qtrue ? 1 : 0);
335 static VALUE c_rotation_get (VALUE self)
337 GET_OBJ (self, Ecore_Evas *, ee);
339 return INT2FIX (ecore_evas_rotation_get (*ee));
342 static VALUE c_rotation_set (VALUE self, VALUE val)
344 GET_OBJ (self, Ecore_Evas *, ee);
346 Check_Type (val, T_FIXNUM);
348 ecore_evas_rotation_set (*ee, FIX2INT (val));
353 /* FIXME: this is unsafe! */
354 static VALUE c_delete (VALUE self)
356 GET_OBJ (self, Ecore_Evas *, ee);
358 /* reap our children */
361 ecore_evas_free (*ee);
362 rb_hash_aset (objects, INT2NUM ((long) *ee), Qnil);
368 CALLBACK_ADD_HANDLER (resize);
369 CALLBACK_ADD_HANDLER (move);
370 CALLBACK_ADD_HANDLER (show);
371 CALLBACK_ADD_HANDLER (hide);
372 CALLBACK_ADD_HANDLER (delete_request);
373 CALLBACK_ADD_HANDLER (destroy);
374 CALLBACK_ADD_HANDLER (focus_in);
375 CALLBACK_ADD_HANDLER (focus_out);
376 CALLBACK_ADD_HANDLER (mouse_in);
377 CALLBACK_ADD_HANDLER (mouse_out);
378 CALLBACK_ADD_HANDLER (pre_render);
379 CALLBACK_ADD_HANDLER (post_render);
381 void Init_EcoreEvas (void)
383 cEcoreEvas = rb_define_class_under (mEvas, "EcoreEvas", rb_cObject);
385 rb_define_private_method (rb_singleton_class (cEcoreEvas),
387 rb_define_method (cEcoreEvas, "initialize", c_initialize, -1);
388 rb_define_method (cEcoreEvas, "inspect", c_inspect, 0);
389 rb_define_method (cEcoreEvas, "delete", c_delete, 0);
390 rb_define_method (cEcoreEvas, "show", c_show, 0);
391 rb_define_method (cEcoreEvas, "hide", c_hide, 0);
392 rb_define_method (cEcoreEvas, "visible?", c_visible_get, 0);
393 rb_define_method (cEcoreEvas, "raise", c_raise, 0);
394 rb_define_method (cEcoreEvas, "lower", c_lower, 0);
395 rb_define_method (cEcoreEvas, "layer", c_layer_get, 0);
396 rb_define_method (cEcoreEvas, "layer=", c_layer_set, 1);
397 rb_define_method (cEcoreEvas, "evas", c_evas_get, 0);
398 rb_define_method (cEcoreEvas, "geometry", c_geometry_get, 0);
399 rb_define_method (cEcoreEvas, "get_size_min", c_get_size_min, 0);
400 rb_define_method (cEcoreEvas, "set_size_min", c_set_size_min, 2);
401 rb_define_method (cEcoreEvas, "get_size_max", c_get_size_max, 0);
402 rb_define_method (cEcoreEvas, "set_size_max", c_set_size_max, 2);
403 rb_define_method (cEcoreEvas, "move", c_move, 2);
404 rb_define_method (cEcoreEvas, "resize", c_resize, 2);
405 rb_define_method (cEcoreEvas, "title", c_title_get, 0);
406 rb_define_method (cEcoreEvas, "title=", c_title_set, 1);
407 rb_define_method (cEcoreEvas, "borderless?", c_borderless_get, 0);
408 rb_define_method (cEcoreEvas, "borderless=", c_borderless_set, 1);
409 rb_define_method (cEcoreEvas, "shaped?", c_shaped_get, 0);
410 rb_define_method (cEcoreEvas, "shaped=", c_shaped_set, 1);
411 rb_define_method (cEcoreEvas, "sticky?", c_sticky_get, 0);
412 rb_define_method (cEcoreEvas, "sticky=", c_sticky_set, 1);
413 rb_define_method (cEcoreEvas, "rotation", c_rotation_get, 0);
414 rb_define_method (cEcoreEvas, "rotation=", c_rotation_set, 1);
416 CALLBACK_ADD (cEcoreEvas, resize);
417 CALLBACK_ADD (cEcoreEvas, move);
418 CALLBACK_ADD (cEcoreEvas, show);
419 CALLBACK_ADD (cEcoreEvas, hide);
420 CALLBACK_ADD (cEcoreEvas, delete_request);
421 CALLBACK_ADD (cEcoreEvas, destroy);
422 CALLBACK_ADD (cEcoreEvas, focus_in);
423 CALLBACK_ADD (cEcoreEvas, focus_out);
424 CALLBACK_ADD (cEcoreEvas, mouse_in);
425 CALLBACK_ADD (cEcoreEvas, mouse_out);
426 CALLBACK_ADD (cEcoreEvas, pre_render);
427 CALLBACK_ADD (cEcoreEvas, post_render);
429 evases = rb_hash_new ();
430 rb_global_variable (&evases);
432 objects = rb_hash_new ();
433 rb_global_variable (&objects);
435 callbacks = rb_hash_new ();
436 rb_global_variable (&callbacks);