9 #include "ecore_private.h"
11 #include "ecore_evas_private.h"
12 #include "Ecore_Evas.h"
14 static const char ASSOCIATE_KEY[] = "__Ecore_Evas_Associate";
16 static void _ecore_evas_object_associate(Ecore_Evas *ee, Evas_Object *obj, Ecore_Evas_Object_Associate_Flags flags);
17 static void _ecore_evas_object_dissociate(Ecore_Evas *ee, Evas_Object *obj);
21 _ecore_evas_associate_get(const Ecore_Evas *ee)
23 return ecore_evas_data_get(ee, ASSOCIATE_KEY);
27 _ecore_evas_associate_set(Ecore_Evas *ee, Evas_Object *obj)
29 ecore_evas_data_set(ee, ASSOCIATE_KEY, obj);
33 _ecore_evas_associate_del(Ecore_Evas *ee)
35 ecore_evas_data_set(ee, ASSOCIATE_KEY, NULL);
39 _evas_object_associate_get(const Evas_Object *obj)
41 return evas_object_data_get(obj, ASSOCIATE_KEY);
45 _evas_object_associate_set(Evas_Object *obj, Ecore_Evas *ee)
47 evas_object_data_set(obj, ASSOCIATE_KEY, ee);
51 _evas_object_associate_del(Evas_Object *obj)
53 evas_object_data_del(obj, ASSOCIATE_KEY);
56 /** Associated Events: ******************************************************/
58 /* Interceptors Callbacks */
61 _ecore_evas_obj_intercept_move(void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y)
63 Ecore_Evas *ee = data;
64 // FIXME: account for frame
65 ecore_evas_move(ee, x, y);
66 if (ecore_evas_override_get(ee)) evas_object_move(obj, x, y);
70 _ecore_evas_obj_intercept_raise(void *data, Evas_Object *obj __UNUSED__)
72 Ecore_Evas *ee = data;
77 _ecore_evas_obj_intercept_lower(void *data, Evas_Object *obj __UNUSED__)
79 Ecore_Evas *ee = data;
84 _ecore_evas_obj_intercept_stack_above(void *data __UNUSED__, Evas_Object *obj __UNUSED__, Evas_Object *above __UNUSED__)
86 INF("TODO: %s", __FUNCTION__);
90 _ecore_evas_obj_intercept_stack_below(void *data __UNUSED__, Evas_Object *obj __UNUSED__, Evas_Object *below __UNUSED__)
92 INF("TODO: %s", __FUNCTION__);
96 _ecore_evas_obj_intercept_layer_set(void *data, Evas_Object *obj __UNUSED__, int l)
98 Ecore_Evas *ee = data;
99 ecore_evas_layer_set(ee, l);
102 /* Event Callbacks */
105 _ecore_evas_obj_callback_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
107 Ecore_Evas *ee = data;
112 _ecore_evas_obj_callback_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
114 Ecore_Evas *ee = data;
119 _ecore_evas_obj_callback_resize(void *data, Evas *e, Evas_Object *obj, void *event_info __UNUSED__)
121 Ecore_Evas *ee = data;
122 Evas_Coord ow, oh, fw, fh;
124 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
125 evas_output_framespace_get(e, NULL, NULL, &fw, &fh);
128 ecore_evas_resize(ee, ow, oh);
132 _ecore_evas_obj_callback_changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
134 Ecore_Evas *ee = data;
137 evas_object_size_hint_min_get(obj, &w, &h);
138 ecore_evas_size_min_set(ee, w, h);
140 evas_object_size_hint_max_get(obj, &w, &h);
143 ecore_evas_size_max_set(ee, w, h);
147 _ecore_evas_obj_callback_del(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
149 Ecore_Evas *ee = data;
150 _ecore_evas_object_dissociate(ee, obj);
155 _ecore_evas_obj_callback_del_dissociate(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
157 Ecore_Evas *ee = data;
158 _ecore_evas_object_dissociate(ee, obj);
162 _ecore_evas_delete_request(Ecore_Evas *ee)
164 Evas_Object *obj = _ecore_evas_associate_get(ee);
165 _ecore_evas_object_dissociate(ee, obj);
166 evas_object_del(obj);
171 _ecore_evas_destroy(Ecore_Evas *ee)
173 Evas_Object *obj = _ecore_evas_associate_get(ee);
176 _ecore_evas_object_dissociate(ee, obj);
177 evas_object_del(obj);
181 _ecore_evas_resize(Ecore_Evas *ee)
183 Evas_Object *obj = _ecore_evas_associate_get(ee);
185 ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
186 evas_object_resize(obj, w, h);
190 _ecore_evas_pre_free(Ecore_Evas *ee)
192 Evas_Object *obj = _ecore_evas_associate_get(ee);
195 _ecore_evas_object_dissociate(ee, obj);
196 evas_object_del(obj);
200 _ecore_evas_object_evas_check(const char *function __UNUSED__, const Ecore_Evas *ee, const Evas_Object *obj)
202 const char *name, *type;
205 e = evas_object_evas_get(obj);
209 name = evas_object_name_get(obj);
210 type = evas_object_type_get(obj);
212 ERR("ERROR: %s(): object %p (name=\"%s\", type=\"%s\") evas "
213 "is not the same as this Ecore_Evas evas: %p != %p",
215 name ? name : "", type ? type : "", e, ee->evas);
217 if (getenv("ECORE_ERROR_ABORT")) abort();
223 ecore_evas_object_associate(Ecore_Evas *ee, Evas_Object *obj, Ecore_Evas_Object_Associate_Flags flags)
226 Evas_Object *old_obj;
228 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
230 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, __FUNCTION__);
234 CHECK_PARAM_POINTER_RETURN("obj", obj, EINA_FALSE);
235 if (!_ecore_evas_object_evas_check(__FUNCTION__, ee, obj))
238 old_ee = _evas_object_associate_get(obj);;
240 ecore_evas_object_dissociate(old_ee, obj);
242 old_obj = _ecore_evas_associate_get(ee);
244 ecore_evas_object_dissociate(ee, old_obj);
246 _ecore_evas_object_associate(ee, obj, flags);
251 ecore_evas_object_dissociate(Ecore_Evas *ee, Evas_Object *obj)
254 Evas_Object *old_obj;
256 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
258 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, __FUNCTION__);
262 CHECK_PARAM_POINTER_RETURN("obj", obj, EINA_FALSE);
263 old_ee = _evas_object_associate_get(obj);
265 ERR("ERROR: trying to dissociate object that is not using "
266 "this Ecore_Evas: %p != %p", ee, old_ee);
270 old_obj = _ecore_evas_associate_get(ee);
271 if (old_obj != obj) {
272 ERR("ERROR: trying to dissociate object that is not being "
273 "used by this Ecore_Evas: %p != %p", old_obj, obj);
277 _ecore_evas_object_dissociate(ee, obj);
283 ecore_evas_object_associate_get(const Ecore_Evas *ee)
285 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
287 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, __FUNCTION__);
290 return _ecore_evas_associate_get(ee);
294 _ecore_evas_object_associate(Ecore_Evas *ee, Evas_Object *obj, Ecore_Evas_Object_Associate_Flags flags)
296 evas_object_event_callback_add
297 (obj, EVAS_CALLBACK_SHOW,
298 _ecore_evas_obj_callback_show, ee);
299 evas_object_event_callback_add
300 (obj, EVAS_CALLBACK_HIDE,
301 _ecore_evas_obj_callback_hide, ee);
302 evas_object_event_callback_add
303 (obj, EVAS_CALLBACK_RESIZE,
304 _ecore_evas_obj_callback_resize, ee);
305 evas_object_event_callback_add
306 (obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
307 _ecore_evas_obj_callback_changed_size_hints, ee);
308 if (flags & ECORE_EVAS_OBJECT_ASSOCIATE_DEL)
309 evas_object_event_callback_add
310 (obj, EVAS_CALLBACK_DEL, _ecore_evas_obj_callback_del, ee);
312 evas_object_event_callback_add
313 (obj, EVAS_CALLBACK_DEL, _ecore_evas_obj_callback_del_dissociate, ee);
315 evas_object_intercept_move_callback_add
316 (obj, _ecore_evas_obj_intercept_move, ee);
318 if (flags & ECORE_EVAS_OBJECT_ASSOCIATE_STACK)
320 evas_object_intercept_raise_callback_add
321 (obj, _ecore_evas_obj_intercept_raise, ee);
322 evas_object_intercept_lower_callback_add
323 (obj, _ecore_evas_obj_intercept_lower, ee);
324 evas_object_intercept_stack_above_callback_add
325 (obj, _ecore_evas_obj_intercept_stack_above, ee);
326 evas_object_intercept_stack_below_callback_add
327 (obj, _ecore_evas_obj_intercept_stack_below, ee);
330 if (flags & ECORE_EVAS_OBJECT_ASSOCIATE_LAYER)
331 evas_object_intercept_layer_set_callback_add
332 (obj, _ecore_evas_obj_intercept_layer_set, ee);
334 if (flags & ECORE_EVAS_OBJECT_ASSOCIATE_DEL)
336 ecore_evas_callback_delete_request_set(ee, _ecore_evas_delete_request);
337 ecore_evas_callback_destroy_set(ee, _ecore_evas_destroy);
339 ecore_evas_callback_pre_free_set(ee, _ecore_evas_pre_free);
340 ecore_evas_callback_resize_set(ee, _ecore_evas_resize);
342 _evas_object_associate_set(obj, ee);
343 _ecore_evas_associate_set(ee, obj);
347 _ecore_evas_object_dissociate(Ecore_Evas *ee, Evas_Object *obj)
349 evas_object_event_callback_del_full
350 (obj, EVAS_CALLBACK_SHOW,
351 _ecore_evas_obj_callback_show, ee);
352 evas_object_event_callback_del_full
353 (obj, EVAS_CALLBACK_HIDE,
354 _ecore_evas_obj_callback_hide, ee);
355 evas_object_event_callback_del_full
356 (obj, EVAS_CALLBACK_RESIZE,
357 _ecore_evas_obj_callback_resize, ee);
358 evas_object_event_callback_del_full
359 (obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
360 _ecore_evas_obj_callback_changed_size_hints, ee);
361 evas_object_event_callback_del_full
362 (obj, EVAS_CALLBACK_DEL, _ecore_evas_obj_callback_del, ee);
363 evas_object_event_callback_del_full
364 (obj, EVAS_CALLBACK_DEL, _ecore_evas_obj_callback_del_dissociate, ee);
366 evas_object_intercept_move_callback_del
367 (obj, _ecore_evas_obj_intercept_move);
369 evas_object_intercept_raise_callback_del
370 (obj, _ecore_evas_obj_intercept_raise);
371 evas_object_intercept_lower_callback_del
372 (obj, _ecore_evas_obj_intercept_lower);
373 evas_object_intercept_stack_above_callback_del
374 (obj, _ecore_evas_obj_intercept_stack_above);
375 evas_object_intercept_stack_below_callback_del
376 (obj, _ecore_evas_obj_intercept_stack_below);
378 evas_object_intercept_layer_set_callback_del
379 (obj, _ecore_evas_obj_intercept_layer_set);
381 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
383 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, __FUNCTION__);
387 if (ee->func.fn_delete_request == _ecore_evas_delete_request)
388 ecore_evas_callback_delete_request_set(ee, NULL);
389 if (ee->func.fn_destroy == _ecore_evas_destroy)
390 ecore_evas_callback_destroy_set(ee, NULL);
391 if (ee->func.fn_resize == _ecore_evas_resize)
392 ecore_evas_callback_resize_set(ee, NULL);
393 if (ee->func.fn_pre_free == _ecore_evas_pre_free)
394 ecore_evas_callback_pre_free_set(ee, NULL);
396 _ecore_evas_associate_del(ee);
399 _evas_object_associate_del(obj);
403 * Helper ecore_getopt callback to list available Ecore_Evas engines.
405 * This will list all available engines except buffer, this is useful
406 * for applications to let user choose how they should create windows
407 * with ecore_evas_new().
409 * @c callback_data value is used as @c FILE* and says where to output
410 * messages, by default it is @c stdout. You can specify this value
411 * with ECORE_GETOPT_CALLBACK_FULL() or ECORE_GETOPT_CALLBACK_ARGS().
413 * If there is a boolean storage provided, then it is marked with 1
414 * when this option is executed.
415 * @param parser This parameter isn't in use.
416 * @param desc This parameter isn't in use.
417 * @param str This parameter isn't in use.
418 * @param data The data to be used.
419 * @param storage The storage to be used.
420 * @return The function always return 1.
423 ecore_getopt_callback_ecore_evas_list_engines(const Ecore_Getopt *parser __UNUSED__, const Ecore_Getopt_Desc *desc __UNUSED__, const char *str __UNUSED__, void *data, Ecore_Getopt_Value *storage)
432 lst = ecore_evas_engines_get();
434 fputs("supported engines:\n", fp);
435 EINA_LIST_FOREACH(lst, n, engine)
436 if (strcmp(engine, "buffer") != 0)
437 fprintf(fp, "\t%s\n", engine);
439 ecore_evas_engines_free(lst);