1 #include <Elementary.h>
4 typedef struct _Widget_Data Widget_Data;
5 typedef struct _Subinfo Subinfo;
6 typedef struct _Part_Cursor Part_Cursor;
13 Eina_List *parts_cursors;
14 Eina_Bool needs_size_calc:1;
15 const char *clas, *group, *style;
33 const Evas_Object *reference;
37 unsigned short col, row, colspan, rowspan;
51 Eina_Bool engine_only:1;
54 static const char *widtype = NULL;
55 static void _del_hook(Evas_Object *obj);
56 static void _mirrored_set(Evas_Object *obj, Eina_Bool rtl);
57 static void _theme_hook(Evas_Object *obj);
58 static void _sizing_eval(Widget_Data *wd);
59 static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info);
60 static void _sub_del(void *data, Evas_Object *obj, void *event_info);
61 static void _part_cursor_free(Part_Cursor *pc);
63 static const char SIG_THEME_CHANGED[] = "theme,changed";
65 static const Evas_Smart_Cb_Description _signals[] = {
66 {SIG_THEME_CHANGED, ""},
71 _del_hook(Evas_Object *obj)
73 Widget_Data *wd = elm_widget_data_get(obj);
78 EINA_LIST_FREE(wd->subs, si)
80 eina_stringshare_del(si->part);
82 eina_stringshare_del(si->p.text.text);
85 EINA_LIST_FREE(wd->parts_cursors, pc) _part_cursor_free(pc);
90 _mirrored_set(Evas_Object *obj, Eina_Bool rtl)
92 Widget_Data *wd = elm_widget_data_get(obj);
94 edje_object_mirrored_set(wd->lay, rtl);
98 _theme_hook(Evas_Object *obj)
100 Widget_Data *wd = elm_widget_data_get(obj);
102 _elm_widget_mirrored_reload(obj);
103 _mirrored_set(obj, elm_widget_mirrored_get(obj));
104 _elm_theme_object_set(obj, wd->lay, wd->clas, wd->group, wd->style);
105 edje_object_scale_set(wd->lay, elm_widget_scale_get(obj) *
107 evas_object_smart_callback_call(obj, SIG_THEME_CHANGED, NULL);
112 _changed_hook(Evas_Object *obj)
114 Widget_Data *wd = elm_widget_data_get(obj);
116 if (wd->needs_size_calc)
119 wd->needs_size_calc = 0;
124 _signal_emit_hook(Evas_Object *obj, const char *emission, const char *source)
126 Widget_Data *wd = elm_widget_data_get(obj);
127 edje_object_signal_emit(wd->lay, emission, source);
131 _signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data)
133 Widget_Data *wd = elm_widget_data_get(obj);
134 edje_object_signal_callback_add(wd->lay, emission, source, func_cb, data);
138 _signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data)
140 Widget_Data *wd = elm_widget_data_get(obj);
141 edje_object_signal_callback_del_full(wd->lay, emission, source, func_cb,
147 _elm_layout_list_data_get(const Eina_List *list)
149 Subinfo *si = eina_list_data_get(list);
154 _elm_layout_focus_next_hook(const Evas_Object *obj, Elm_Focus_Direction dir, Evas_Object **next)
156 Widget_Data *wd = elm_widget_data_get(obj);
157 const Eina_List *items;
158 void *(*list_data_get) (const Eina_List *list);
160 if ((!wd) || (!wd->subs))
163 /* Focus chain (This block is diferent of elm_win cycle)*/
164 if ((items = elm_widget_focus_custom_chain_get(obj)))
165 list_data_get = eina_list_data_get;
169 list_data_get = _elm_layout_list_data_get;
171 if (!items) return EINA_FALSE;
174 return elm_widget_focus_list_next_get(obj, items, list_data_get, dir,
179 _sizing_eval(Widget_Data *wd)
181 Evas_Coord minw = -1, minh = -1;
182 edje_object_size_min_calc(wd->lay, &minw, &minh);
183 evas_object_size_hint_min_set(wd->obj, minw, minh);
184 evas_object_size_hint_max_set(wd->obj, -1, -1);
188 _request_sizing_eval(Widget_Data *wd)
190 if (wd->needs_size_calc) return;
191 wd->needs_size_calc = 1;
192 evas_object_smart_changed(wd->obj);
196 _part_cursor_free(Part_Cursor *pc)
198 eina_stringshare_del(pc->part);
199 eina_stringshare_del(pc->style);
200 eina_stringshare_del(pc->cursor);
205 _part_cursor_part_apply(const Part_Cursor *pc)
207 elm_object_cursor_set(pc->obj, pc->cursor);
208 elm_object_cursor_style_set(pc->obj, pc->style);
209 elm_object_cursor_engine_only_set(pc->obj, pc->engine_only);
213 _parts_cursors_find(Widget_Data *wd, const char *part)
217 EINA_LIST_FOREACH(wd->parts_cursors, l, pc)
219 if (!strcmp(pc->part, part))
226 _parts_cursors_apply(Widget_Data *wd)
228 const char *file, *group;
232 edje_object_file_get(wd->lay, &file, &group);
234 EINA_LIST_FOREACH(wd->parts_cursors, l, pc)
236 Evas_Object *obj = (Evas_Object *)edje_object_part_object_get
242 WRN("no part '%s' in group '%s' of file '%s'. "
243 "Cannot set cursor '%s'",
244 pc->part, group, file, pc->cursor);
247 else if (evas_object_pass_events_get(obj))
250 WRN("part '%s' in group '%s' of file '%s' has mouse_events: 0. "
251 "Cannot set cursor '%s'",
252 pc->part, group, file, pc->cursor);
257 _part_cursor_part_apply(pc);
262 _changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
264 _request_sizing_eval(data);
268 _sub_del(void *data __UNUSED__, Evas_Object *obj, void *event_info)
270 Widget_Data *wd = elm_widget_data_get(obj);
271 Evas_Object *sub = event_info;
275 EINA_LIST_FOREACH(wd->subs, l, si)
279 evas_object_event_callback_del_full(sub,
280 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
283 wd->subs = eina_list_remove_list(wd->subs, l);
284 eina_stringshare_del(si->part);
292 _signal_size_eval(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
294 _request_sizing_eval(data);
298 _parts_text_fix(Widget_Data *wd)
303 EINA_LIST_FOREACH(wd->subs, l, si)
305 if (si->type == TEXT)
306 edje_object_part_text_set(wd->lay, si->part, si->p.text.text);
311 _elm_layout_label_set(Evas_Object *obj, const char *part, const char *text)
313 Widget_Data *wd = elm_widget_data_get(obj);
316 ELM_CHECK_WIDTYPE(obj, widtype);
317 if (!part) part = "elm.text";
319 EINA_LIST_FOREACH(wd->subs, l, si)
321 if ((si->type == TEXT) && (!strcmp(part, si->part)))
325 eina_stringshare_del(si->part);
326 eina_stringshare_del(si->p.text.text);
328 edje_object_part_text_set(wd->lay, part, NULL);
329 wd->subs = eina_list_remove_list(wd->subs, l);
340 si = ELM_NEW(Subinfo);
343 si->part = eina_stringshare_add(part);
344 wd->subs = eina_list_append(wd->subs, si);
347 eina_stringshare_replace(&si->p.text.text, text);
348 edje_object_part_text_set(wd->lay, part, text);
349 _request_sizing_eval(wd);
353 _elm_layout_label_get(const Evas_Object *obj, const char *part)
355 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
356 Widget_Data *wd = elm_widget_data_get(obj);
357 if (!part) part = "elm.text";
358 return edje_object_part_text_get(wd->lay, part);
362 _content_set_hook(Evas_Object *obj, const char *part, Evas_Object *content)
364 ELM_CHECK_WIDTYPE(obj, widtype);
365 Widget_Data *wd = elm_widget_data_get(obj);
369 EINA_LIST_FOREACH(wd->subs, l, si)
371 if ((si->type == SWALLOW) && (!strcmp(part, si->part)))
373 if (content == si->obj) return;
374 evas_object_del(si->obj);
380 elm_widget_sub_object_add(obj, content);
381 evas_object_event_callback_add(content,
382 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
383 _changed_size_hints, wd);
384 if (!edje_object_part_swallow(wd->lay, part, content))
385 WRN("could not swallow %p into part '%s'", content, part);
386 si = ELM_NEW(Subinfo);
388 si->part = eina_stringshare_add(part);
390 wd->subs = eina_list_append(wd->subs, si);
392 _request_sizing_eval(wd);
396 _content_get_hook(const Evas_Object *obj, const char *part)
398 Widget_Data *wd = elm_widget_data_get(obj);
401 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
403 EINA_LIST_FOREACH(wd->subs, l, si)
405 if ((si->type == SWALLOW) && !strcmp(part, si->part))
412 _content_unset_hook(Evas_Object *obj, const char *part)
414 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
415 Widget_Data *wd = elm_widget_data_get(obj);
418 if (!wd) return NULL;
419 EINA_LIST_FOREACH(wd->subs, l, si)
421 if ((si->type == SWALLOW) && (!strcmp(part, si->part)))
423 Evas_Object *content;
424 if (!si->obj) return NULL;
425 content = si->obj; /* si will die in _sub_del due elm_widget_sub_object_del() */
426 elm_widget_sub_object_del(obj, content);
427 edje_object_part_unswallow(wd->lay, content);
435 elm_layout_add(Evas_Object *parent)
441 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
443 ELM_SET_WIDTYPE(widtype, "layout");
444 elm_widget_type_set(obj, "layout");
445 elm_widget_sub_object_add(parent, obj);
446 elm_widget_data_set(obj, wd);
447 elm_widget_del_hook_set(obj, _del_hook);
448 elm_widget_theme_hook_set(obj, _theme_hook);
449 elm_widget_changed_hook_set(obj, _changed_hook);
450 elm_widget_can_focus_set(obj, EINA_FALSE);
451 elm_widget_focus_next_hook_set(obj, _elm_layout_focus_next_hook);
452 elm_widget_signal_emit_hook_set(obj, _signal_emit_hook);
453 elm_widget_signal_callback_add_hook_set(obj, _signal_callback_add_hook);
454 elm_widget_signal_callback_del_hook_set(obj, _signal_callback_del_hook);
455 elm_widget_text_set_hook_set(obj, _elm_layout_label_set);
456 elm_widget_text_get_hook_set(obj, _elm_layout_label_get);
457 elm_widget_content_set_hook_set(obj, _content_set_hook);
458 elm_widget_content_get_hook_set(obj, _content_get_hook);
459 elm_widget_content_unset_hook_set(obj, _content_unset_hook);
462 wd->lay = edje_object_add(e);
463 elm_widget_resize_object_set(obj, wd->lay);
464 edje_object_signal_callback_add(wd->lay, "size,eval", "elm",
465 _signal_size_eval, wd);
467 evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
468 evas_object_smart_callbacks_descriptions_set(obj, _signals);
470 _mirrored_set(obj, elm_widget_mirrored_get(obj));
471 _request_sizing_eval(wd);
476 elm_layout_file_set(Evas_Object *obj, const char *file, const char *group)
478 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
479 Widget_Data *wd = elm_widget_data_get(obj);
480 if (!wd) return EINA_FALSE;
481 Eina_Bool ret = edje_object_file_set(wd->lay, file, group);
485 _request_sizing_eval(wd);
486 _parts_cursors_apply(wd);
488 else DBG("failed to set edje file '%s', group '%s': %s",
490 edje_load_error_str(edje_object_load_error_get(wd->lay)));
495 elm_layout_theme_set(Evas_Object *obj, const char *clas, const char *group, const char *style)
497 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
498 Widget_Data *wd = elm_widget_data_get(obj);
499 if (!wd) return EINA_FALSE;
500 Eina_Bool ret = _elm_theme_object_set(obj, wd->lay, clas, group, style);
507 _request_sizing_eval(wd);
508 _parts_cursors_apply(wd);
514 elm_layout_content_set(Evas_Object *obj, const char *swallow, Evas_Object *content)
516 _content_set_hook(obj, swallow, content);
521 elm_layout_content_get(const Evas_Object *obj, const char *swallow)
523 return _content_get_hook(obj, swallow);
527 elm_layout_content_unset(Evas_Object *obj, const char *swallow)
529 return _content_unset_hook(obj, swallow);
533 elm_layout_text_set(Evas_Object *obj, const char *part, const char *text)
535 _elm_layout_label_set(obj, part, text);
539 elm_layout_text_get(const Evas_Object *obj, const char *part)
541 return _elm_layout_label_get(obj, part);
545 elm_layout_box_append(Evas_Object *obj, const char *part, Evas_Object *child)
547 ELM_CHECK_WIDTYPE(obj, widtype);
548 Widget_Data *wd = elm_widget_data_get(obj);
552 if (!edje_object_part_box_append(wd->lay, part, child))
553 WRN("child %p could not be appended to box part '%s'", child, part);
554 elm_widget_sub_object_add(obj, child);
555 evas_object_event_callback_add
556 (child, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, wd);
558 si = ELM_NEW(Subinfo);
559 si->type = BOX_APPEND;
560 si->part = eina_stringshare_add(part);
562 wd->subs = eina_list_append(wd->subs, si);
563 _request_sizing_eval(wd);
567 elm_layout_box_prepend(Evas_Object *obj, const char *part, Evas_Object *child)
569 ELM_CHECK_WIDTYPE(obj, widtype);
570 Widget_Data *wd = elm_widget_data_get(obj);
574 if (!edje_object_part_box_prepend(wd->lay, part, child))
575 WRN("child %p could not be prepended to box part '%s'", child, part);
576 elm_widget_sub_object_add(obj, child);
577 evas_object_event_callback_add
578 (child, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, wd);
580 si = ELM_NEW(Subinfo);
581 si->type = BOX_PREPEND;
582 si->part = eina_stringshare_add(part);
584 wd->subs = eina_list_prepend(wd->subs, si);
585 _request_sizing_eval(wd);
589 _box_reference_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
592 si->p.box.reference = NULL;
596 elm_layout_box_insert_before(Evas_Object *obj, const char *part, Evas_Object *child, const Evas_Object *reference)
598 ELM_CHECK_WIDTYPE(obj, widtype);
599 Widget_Data *wd = elm_widget_data_get(obj);
603 if (!edje_object_part_box_insert_before(wd->lay, part, child, reference))
604 WRN("child %p could not be inserted before %p inf box part '%s'",
605 child, reference, part);
607 si = ELM_NEW(Subinfo);
608 si->type = BOX_INSERT_BEFORE;
609 si->part = eina_stringshare_add(part);
611 si->p.box.reference = reference;
613 elm_widget_sub_object_add(obj, child);
614 evas_object_event_callback_add
615 (child, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, wd);
616 evas_object_event_callback_add
617 ((Evas_Object *)reference, EVAS_CALLBACK_DEL, _box_reference_del, si);
619 wd->subs = eina_list_append(wd->subs, si);
620 _request_sizing_eval(wd);
624 elm_layout_box_insert_at(Evas_Object *obj, const char *part, Evas_Object *child, unsigned int pos)
626 ELM_CHECK_WIDTYPE(obj, widtype);
627 Widget_Data *wd = elm_widget_data_get(obj);
631 if (!edje_object_part_box_insert_at(wd->lay, part, child, pos))
632 WRN("child %p could not be inserted at %u to box part '%s'",
635 elm_widget_sub_object_add(obj, child);
636 evas_object_event_callback_add
637 (child, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, wd);
639 si = ELM_NEW(Subinfo);
640 si->type = BOX_INSERT_AT;
641 si->part = eina_stringshare_add(part);
644 wd->subs = eina_list_append(wd->subs, si);
645 _request_sizing_eval(wd);
649 _sub_box_remove(Widget_Data *wd, Subinfo *si)
653 if (si->type == BOX_INSERT_BEFORE)
654 evas_object_event_callback_del_full
655 ((Evas_Object *)si->p.box.reference,
656 EVAS_CALLBACK_DEL, _box_reference_del, si);
658 child = si->obj; /* si will die in _sub_del due elm_widget_sub_object_del() */
659 edje_object_part_box_remove(wd->lay, si->part, child);
660 elm_widget_sub_object_del(wd->obj, child);
665 _sub_table_remove(Widget_Data *wd, Subinfo *si)
669 child = si->obj; /* si will die in _sub_del due elm_widget_sub_object_del() */
670 edje_object_part_table_unpack(wd->lay, si->part, child);
671 elm_widget_sub_object_del(wd->obj, child);
676 _sub_box_is(const Subinfo *si)
682 case BOX_INSERT_BEFORE:
691 elm_layout_box_remove(Evas_Object *obj, const char *part, Evas_Object *child)
693 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
694 Widget_Data *wd = elm_widget_data_get(obj);
698 if (!wd) return NULL;
700 EINA_SAFETY_ON_NULL_RETURN_VAL(part, NULL);
701 EINA_SAFETY_ON_NULL_RETURN_VAL(child, NULL);
702 EINA_LIST_FOREACH(wd->subs, l, si)
704 if (!_sub_box_is(si)) continue;
705 if ((si->obj == child) && (!strcmp(si->part, part)))
706 return _sub_box_remove(wd, si);
712 elm_layout_box_remove_all(Evas_Object *obj, const char *part, Eina_Bool clear)
714 ELM_CHECK_WIDTYPE(obj, widtype);
715 Widget_Data *wd = elm_widget_data_get(obj);
720 EINA_SAFETY_ON_NULL_RETURN(part);
722 lst = eina_list_clone(wd->subs);
723 EINA_LIST_FREE(lst, si)
725 if (!_sub_box_is(si)) continue;
726 if (!strcmp(si->part, part))
728 Evas_Object *child = _sub_box_remove(wd, si);
729 if ((clear) && (child)) evas_object_del(child);
732 /* eventually something may not be added with layout, del them as well */
733 edje_object_part_box_remove_all(wd->lay, part, clear);
737 elm_layout_table_pack(Evas_Object *obj, const char *part, Evas_Object *child, unsigned short col, unsigned short row, unsigned short colspan, unsigned short rowspan)
739 ELM_CHECK_WIDTYPE(obj, widtype);
740 Widget_Data *wd = elm_widget_data_get(obj);
744 if (!edje_object_part_table_pack
745 (wd->lay, part, child, col, row, colspan, rowspan))
746 WRN("child %p could not be packed into box part '%s' col=%uh, row=%hu, "
747 "colspan=%hu, rowspan=%hu", child, part, col, row, colspan, rowspan);
749 elm_widget_sub_object_add(obj, child);
750 evas_object_event_callback_add
751 (child, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, wd);
753 si = ELM_NEW(Subinfo);
754 si->type = TABLE_PACK;
755 si->part = eina_stringshare_add(part);
757 si->p.table.col = col;
758 si->p.table.row = row;
759 si->p.table.colspan = colspan;
760 si->p.table.rowspan = rowspan;
761 wd->subs = eina_list_append(wd->subs, si);
762 _request_sizing_eval(wd);
766 elm_layout_table_unpack(Evas_Object *obj, const char *part, Evas_Object *child)
768 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
769 Widget_Data *wd = elm_widget_data_get(obj);
773 if (!wd) return NULL;
775 EINA_SAFETY_ON_NULL_RETURN_VAL(part, NULL);
776 EINA_SAFETY_ON_NULL_RETURN_VAL(child, NULL);
777 EINA_LIST_FOREACH(wd->subs, l, si)
779 if (si->type != TABLE_PACK) continue;
780 if ((si->obj == child) && (!strcmp(si->part, part)))
781 return _sub_table_remove(wd, si);
787 elm_layout_table_clear(Evas_Object *obj, const char *part, Eina_Bool clear)
789 ELM_CHECK_WIDTYPE(obj, widtype);
790 Widget_Data *wd = elm_widget_data_get(obj);
795 EINA_SAFETY_ON_NULL_RETURN(part);
797 lst = eina_list_clone(wd->subs);
798 EINA_LIST_FREE(lst, si)
800 if (si->type != TABLE_PACK) continue;
801 if (!strcmp(si->part, part))
803 Evas_Object *child = _sub_table_remove(wd, si);
804 if ((clear) && (child)) evas_object_del(child);
807 /* eventually something may not be added with layout, del them as well */
808 edje_object_part_table_clear(wd->lay, part, clear);
812 elm_layout_edje_get(const Evas_Object *obj)
814 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
815 Widget_Data *wd = elm_widget_data_get(obj);
816 if (!wd) return NULL;
821 elm_layout_data_get(const Evas_Object *obj, const char *key)
823 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
824 Widget_Data *wd = elm_widget_data_get(obj);
825 return edje_object_data_get(wd->lay, key);
829 elm_layout_sizing_eval(Evas_Object *obj)
831 ELM_CHECK_WIDTYPE(obj, widtype);
832 Widget_Data *wd = elm_widget_data_get(obj);
833 EINA_SAFETY_ON_NULL_RETURN(wd);
834 _request_sizing_eval(wd);
838 elm_layout_part_cursor_set(Evas_Object *obj, const char *part_name, const char *cursor)
840 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
841 EINA_SAFETY_ON_NULL_RETURN_VAL(part_name, EINA_FALSE);
842 Widget_Data *wd = elm_widget_data_get(obj);
843 EINA_SAFETY_ON_NULL_RETURN_VAL(wd, EINA_FALSE);
844 Evas_Object *part_obj;
846 part_obj = (Evas_Object *)edje_object_part_object_get(wd->lay, part_name);
849 const char *group, *file;
850 edje_object_file_get(wd->lay, &file, &group);
851 WRN("no part '%s' in group '%s' of file '%s'. Cannot set cursor '%s'",
852 part_name, group, file, cursor);
855 if (evas_object_pass_events_get(part_obj))
857 const char *group, *file;
858 edje_object_file_get(wd->lay, &file, &group);
859 WRN("part '%s' in group '%s' of file '%s' has mouse_events: 0. "
860 "Cannot set cursor '%s'",
861 part_name, group, file, cursor);
865 elm_object_sub_cursor_set(part_obj, obj, eina_stringshare_add(cursor));
870 elm_layout_part_cursor_get(const Evas_Object *obj, const char *part_name)
872 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
873 EINA_SAFETY_ON_NULL_RETURN_VAL(part_name, NULL);
874 Widget_Data *wd = elm_widget_data_get(obj);
875 EINA_SAFETY_ON_NULL_RETURN_VAL(wd, NULL);
876 Part_Cursor *pc = _parts_cursors_find(wd, part_name);
877 EINA_SAFETY_ON_NULL_RETURN_VAL(pc, NULL);
878 EINA_SAFETY_ON_NULL_RETURN_VAL(pc->obj, NULL);
879 return elm_object_cursor_get(pc->obj);
883 elm_layout_part_cursor_unset(Evas_Object *obj, const char *part_name)
885 ELM_CHECK_WIDTYPE(obj, widtype);
886 EINA_SAFETY_ON_NULL_RETURN(part_name);
887 Widget_Data *wd = elm_widget_data_get(obj);
888 EINA_SAFETY_ON_NULL_RETURN(wd);
892 EINA_LIST_FOREACH(wd->parts_cursors, l, pc)
894 if (!strcmp(part_name, pc->part))
896 if (pc->obj) elm_object_cursor_unset(pc->obj);
897 _part_cursor_free(pc);
898 wd->parts_cursors = eina_list_remove_list(wd->parts_cursors, l);
905 elm_layout_part_cursor_style_set(Evas_Object *obj, const char *part_name, const char *style)
907 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
908 EINA_SAFETY_ON_NULL_RETURN_VAL(part_name, EINA_FALSE);
909 Widget_Data *wd = elm_widget_data_get(obj);
910 EINA_SAFETY_ON_NULL_RETURN_VAL(wd, EINA_FALSE);
911 Part_Cursor *pc = _parts_cursors_find(wd, part_name);
912 EINA_SAFETY_ON_NULL_RETURN_VAL(pc, EINA_FALSE);
913 EINA_SAFETY_ON_NULL_RETURN_VAL(pc->obj, EINA_FALSE);
915 eina_stringshare_replace(&pc->style, style);
916 elm_object_cursor_style_set(pc->obj, pc->style);
921 elm_layout_part_cursor_style_get(const Evas_Object *obj, const char *part_name)
923 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
924 EINA_SAFETY_ON_NULL_RETURN_VAL(part_name, NULL);
925 Widget_Data *wd = elm_widget_data_get(obj);
926 EINA_SAFETY_ON_NULL_RETURN_VAL(wd, NULL);
927 Part_Cursor *pc = _parts_cursors_find(wd, part_name);
928 EINA_SAFETY_ON_NULL_RETURN_VAL(pc, NULL);
929 EINA_SAFETY_ON_NULL_RETURN_VAL(pc->obj, NULL);
930 return elm_object_cursor_style_get(pc->obj);
934 elm_layout_part_cursor_engine_only_set(Evas_Object *obj, const char *part_name, Eina_Bool engine_only)
936 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
937 EINA_SAFETY_ON_NULL_RETURN_VAL(part_name, EINA_FALSE);
938 Widget_Data *wd = elm_widget_data_get(obj);
939 EINA_SAFETY_ON_NULL_RETURN_VAL(wd, EINA_FALSE);
940 Part_Cursor *pc = _parts_cursors_find(wd, part_name);
941 EINA_SAFETY_ON_NULL_RETURN_VAL(pc, EINA_FALSE);
942 EINA_SAFETY_ON_NULL_RETURN_VAL(pc->obj, EINA_FALSE);
944 pc->engine_only = !!engine_only;
945 elm_object_cursor_engine_only_set(pc->obj, pc->engine_only);
950 elm_layout_part_cursor_engine_only_get(const Evas_Object *obj, const char *part_name)
952 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
953 EINA_SAFETY_ON_NULL_RETURN_VAL(part_name, EINA_FALSE);
954 Widget_Data *wd = elm_widget_data_get(obj);
955 EINA_SAFETY_ON_NULL_RETURN_VAL(wd, EINA_FALSE);
956 Part_Cursor *pc = _parts_cursors_find(wd, part_name);
957 EINA_SAFETY_ON_NULL_RETURN_VAL(pc, EINA_FALSE);
958 EINA_SAFETY_ON_NULL_RETURN_VAL(pc->obj, EINA_FALSE);
959 return elm_object_cursor_engine_only_get(pc->obj);