We now use real structs to wrap objects.
[ruby-ecore.git] / src / ecore_evas / rb_ecore_evas.c
1 /*
2  * $Id: rb_ecore_evas.c 50 2004-08-01 10:18:39Z tilman $
3  *
4  * Copyright (C) 2004 Tilman Sauerbeck (tilman at code-monkey de)
5  *
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.
10  *
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.
15  *
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
19  */
20
21 #include <ruby.h>
22 #include <stdbool.h>
23
24 #include <Ecore.h>
25 #include <Ecore_Evas.h>
26 #include <evas/rb_evas.h>
27
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"
32
33 #define CALLBACK_ADD_HANDLER(name) \
34         static void on_##name (Ecore_Evas *real) \
35         { \
36                 VALUE self = rb_hash_aref (objects, INT2NUM ((long) real)); \
37                 VALUE cb; \
38 \
39                 GET_OBJ (self, RbEcoreEvas, ee); \
40 \
41                 cb = rb_hash_aref (ee->callbacks, rb_str_new2 (#name)); \
42                 rb_funcall (cb, rb_intern ("call"), 0); \
43         } \
44 \
45         static VALUE c_on_##name (VALUE self) \
46         { \
47                 GET_OBJ (self, RbEcoreEvas, ee); \
48 \
49                 if (!rb_block_given_p ()) \
50                         return Qnil; \
51 \
52                 rb_hash_aset (ee->callbacks, rb_str_new2 (#name), \
53                               rb_block_proc ()); \
54 \
55                 ecore_evas_callback_##name##_set (ee->real, on_##name); \
56 \
57                 return Qnil; \
58         }
59
60 #define CALLBACK_ADD(mod, name) \
61         rb_define_method ((mod), "on_"#name, c_on_##name, 0);
62
63 VALUE cEcoreEvas;
64 static VALUE objects;
65
66 /* called by the child classes */
67 void c_ecore_evas_mark (RbEcoreEvas *ee)
68 {
69         if (!NIL_P (ee->evas))
70                 rb_gc_mark (ee->evas);
71
72         rb_gc_mark (ee->callbacks);
73 }
74
75 void c_ecore_evas_free (RbEcoreEvas *ee, bool free_mem)
76 {
77         if (ee->real)
78                 ecore_evas_free (ee->real);
79
80         ecore_evas_shutdown ();
81         ecore_shutdown ();
82
83         if (free_mem)
84                 free (ee);
85 }
86
87 static VALUE c_init (int argc, VALUE *argv, VALUE self)
88 {
89         GET_OBJ (self, RbEcoreEvas, ee);
90
91         ee->evas = Qnil;
92         ee->callbacks = rb_hash_new ();
93
94         rb_hash_aset (objects, INT2NUM ((long) ee->real), self);
95
96         return Qnil;
97 }
98
99 static VALUE c_inspect (VALUE self)
100 {
101         INSPECT (self, RbEcoreEvas);
102 }
103
104 static VALUE c_show (VALUE self)
105 {
106         GET_OBJ (self, RbEcoreEvas, ee);
107
108         ecore_evas_show (ee->real);
109
110         return Qnil;
111 }
112
113 static VALUE c_hide (VALUE self)
114 {
115         GET_OBJ (self, RbEcoreEvas, ee);
116
117         ecore_evas_hide (ee->real);
118
119         return Qnil;
120 }
121
122 static VALUE c_visible_get (VALUE self)
123 {
124         GET_OBJ (self, RbEcoreEvas, ee);
125
126         return ecore_evas_visibility_get (ee->real) ? Qtrue : Qfalse;
127 }
128
129 static VALUE c_raise (VALUE self)
130 {
131         GET_OBJ (self, RbEcoreEvas, ee);
132
133         ecore_evas_raise (ee->real);
134
135         return Qnil;
136 }
137
138 static VALUE c_lower (VALUE self)
139 {
140         GET_OBJ (self, RbEcoreEvas, ee);
141
142         ecore_evas_lower (ee->real);
143
144         return Qnil;
145 }
146
147 static VALUE c_layer_get (VALUE self)
148 {
149         GET_OBJ (self, RbEcoreEvas, ee);
150
151         return INT2FIX (ecore_evas_layer_get (ee->real));
152 }
153
154 static VALUE c_layer_set (VALUE self, VALUE val)
155 {
156         GET_OBJ (self, RbEcoreEvas, ee);
157
158         Check_Type (val, T_FIXNUM);
159
160         ecore_evas_layer_set (ee->real, FIX2INT (val));
161
162         return Qnil;
163 }
164
165 static VALUE c_evas_get (VALUE self)
166 {
167         GET_OBJ (self, RbEcoreEvas, ee);
168
169         if (NIL_P (ee->evas))
170                 ee->evas = TO_EVAS (self, ecore_evas_get (ee->real));
171
172         return ee->evas;
173 }
174
175 static VALUE c_geometry_get (VALUE self)
176 {
177         int x = 0, y = 0, w = 0, h = 0;
178
179         GET_OBJ (self, RbEcoreEvas, ee);
180
181         ecore_evas_geometry_get (ee->real, &x, &y, &w, &h);
182
183         return rb_ary_new3 (4, INT2FIX (x), INT2FIX (y),
184                             INT2FIX (w), INT2FIX (h));
185 }
186
187 static VALUE c_get_size_min (VALUE self)
188 {
189         int w = 0, h = 0;
190
191         GET_OBJ (self, RbEcoreEvas, ee);
192
193         ecore_evas_size_min_get (ee->real, &w, &h);
194
195         return rb_ary_new3 (2, INT2FIX (w), INT2FIX (h));
196 }
197
198 static VALUE c_set_size_min (VALUE self, VALUE w, VALUE h)
199 {
200         GET_OBJ (self, RbEcoreEvas, ee);
201
202         Check_Type (w, T_FIXNUM);
203         Check_Type (h, T_FIXNUM);
204
205         ecore_evas_size_min_set (ee->real, FIX2INT (w), FIX2INT (h));
206
207         return Qnil;
208 }
209
210 static VALUE c_get_size_max (VALUE self)
211 {
212         int w = 0, h = 0;
213
214         GET_OBJ (self, RbEcoreEvas, ee);
215
216         ecore_evas_size_max_get (ee->real, &w, &h);
217
218         return rb_ary_new3 (2, INT2FIX (w), INT2FIX (h));
219 }
220
221 static VALUE c_set_size_max (VALUE self, VALUE w, VALUE h)
222 {
223         GET_OBJ (self, RbEcoreEvas, ee);
224
225         Check_Type (w, T_FIXNUM);
226         Check_Type (h, T_FIXNUM);
227
228         ecore_evas_size_max_set (ee->real, FIX2INT (w), FIX2INT (h));
229
230         return Qnil;
231 }
232
233 static VALUE c_move (VALUE self, VALUE x, VALUE y)
234 {
235         GET_OBJ (self, RbEcoreEvas, ee);
236
237         Check_Type (x, T_FIXNUM);
238         Check_Type (y, T_FIXNUM);
239
240         ecore_evas_move (ee->real, FIX2INT (x), FIX2INT (y));
241
242         return Qnil;
243 }
244
245 static VALUE c_resize (VALUE self, VALUE w, VALUE h)
246 {
247         GET_OBJ (self, RbEcoreEvas, ee);
248
249         Check_Type (w, T_FIXNUM);
250         Check_Type (h, T_FIXNUM);
251
252         ecore_evas_resize (ee->real, FIX2INT (w), FIX2INT (h));
253
254         return Qnil;
255 }
256
257 static VALUE c_title_get (VALUE self)
258 {
259         const char *tmp;
260
261         GET_OBJ (self, RbEcoreEvas, ee);
262
263         if (!(tmp = ecore_evas_title_get (ee->real)))
264                 return Qnil;
265         else
266                 return rb_str_new2 (tmp);
267 }
268
269 static VALUE c_title_set (VALUE self, VALUE val)
270 {
271         GET_OBJ (self, RbEcoreEvas, ee);
272
273         Check_Type (val, T_STRING);
274
275         ecore_evas_title_set (ee->real, StringValuePtr (val));
276
277         return Qnil;
278 }
279
280 static VALUE c_borderless_get (VALUE self)
281 {
282         GET_OBJ (self, RbEcoreEvas, ee);
283
284         return ecore_evas_borderless_get (ee->real) ? Qtrue : Qfalse;
285 }
286
287 static VALUE c_borderless_set (VALUE self, VALUE val)
288 {
289         GET_OBJ (self, RbEcoreEvas, ee);
290
291         CHECK_BOOL (val);
292
293         ecore_evas_borderless_set (ee->real, val == Qtrue);
294
295         return Qnil;
296 }
297
298 static VALUE c_shaped_get (VALUE self)
299 {
300         GET_OBJ (self, RbEcoreEvas, ee);
301
302         return ecore_evas_shaped_get (ee->real) ? Qtrue : Qfalse;
303 }
304
305 static VALUE c_shaped_set (VALUE self, VALUE val)
306 {
307         GET_OBJ (self, RbEcoreEvas, ee);
308
309         CHECK_BOOL (val);
310
311         ecore_evas_shaped_set (ee->real, val == Qtrue);
312
313         return Qnil;
314 }
315
316 static VALUE c_sticky_get (VALUE self)
317 {
318         GET_OBJ (self, RbEcoreEvas, ee);
319
320         return ecore_evas_sticky_get (ee->real) ? Qtrue : Qfalse;
321 }
322
323 static VALUE c_sticky_set (VALUE self, VALUE val)
324 {
325         GET_OBJ (self, RbEcoreEvas, ee);
326
327         CHECK_BOOL (val);
328
329         ecore_evas_sticky_set (ee->real, val == Qtrue);
330
331         return Qnil;
332 }
333
334 static VALUE c_rotation_get (VALUE self)
335 {
336         GET_OBJ (self, RbEcoreEvas, ee);
337
338         return INT2FIX (ecore_evas_rotation_get (ee->real));
339 }
340
341 static VALUE c_rotation_set (VALUE self, VALUE val)
342 {
343         GET_OBJ (self, RbEcoreEvas, ee);
344
345         Check_Type (val, T_FIXNUM);
346
347         ecore_evas_rotation_set (ee->real, FIX2INT (val));
348
349         return Qnil;
350 }
351
352 /* FIXME: this is unsafe! */
353 static VALUE c_delete (VALUE self)
354 {
355         GET_OBJ (self, RbEcoreEvas, ee);
356
357         /* reap our children */
358         rb_gc_start ();
359
360         ecore_evas_free (ee->real);
361         rb_hash_aset (objects, INT2NUM ((long) ee->real), Qnil);
362         ee->real = NULL;
363
364         return Qnil;
365 }
366
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);
379
380 void Init_EcoreEvas (void)
381 {
382         cEcoreEvas = rb_define_class_under (mEvas, "EcoreEvas", rb_cObject);
383
384         rb_define_private_method (rb_singleton_class (cEcoreEvas),
385                                   "new", NULL, 0);
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);
414
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);
427
428         objects = rb_hash_new ();
429         rb_global_variable (&objects);
430 }