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_theme_search_enabled_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 evas_object_event_callback_del_full(content,
428 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
429 _changed_size_hints, wd);
430 edje_object_part_unswallow(wd->lay, content);
438 elm_layout_add(Evas_Object *parent)
444 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
446 ELM_SET_WIDTYPE(widtype, "layout");
447 elm_widget_type_set(obj, "layout");
448 elm_widget_sub_object_add(parent, obj);
449 elm_widget_data_set(obj, wd);
450 elm_widget_del_hook_set(obj, _del_hook);
451 elm_widget_theme_hook_set(obj, _theme_hook);
452 elm_widget_changed_hook_set(obj, _changed_hook);
453 elm_widget_can_focus_set(obj, EINA_FALSE);
454 elm_widget_focus_next_hook_set(obj, _elm_layout_focus_next_hook);
455 elm_widget_signal_emit_hook_set(obj, _signal_emit_hook);
456 elm_widget_signal_callback_add_hook_set(obj, _signal_callback_add_hook);
457 elm_widget_signal_callback_del_hook_set(obj, _signal_callback_del_hook);
458 elm_widget_text_set_hook_set(obj, _elm_layout_label_set);
459 elm_widget_text_get_hook_set(obj, _elm_layout_label_get);
460 elm_widget_content_set_hook_set(obj, _content_set_hook);
461 elm_widget_content_get_hook_set(obj, _content_get_hook);
462 elm_widget_content_unset_hook_set(obj, _content_unset_hook);
465 wd->lay = edje_object_add(e);
466 elm_widget_resize_object_set(obj, wd->lay);
467 edje_object_signal_callback_add(wd->lay, "size,eval", "elm",
468 _signal_size_eval, wd);
470 evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
471 evas_object_smart_callbacks_descriptions_set(obj, _signals);
473 _mirrored_set(obj, elm_widget_mirrored_get(obj));
474 _request_sizing_eval(wd);
479 elm_layout_file_set(Evas_Object *obj, const char *file, const char *group)
481 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
482 Widget_Data *wd = elm_widget_data_get(obj);
483 if (!wd) return EINA_FALSE;
484 Eina_Bool ret = edje_object_file_set(wd->lay, file, group);
488 _request_sizing_eval(wd);
489 _parts_cursors_apply(wd);
491 else DBG("failed to set edje file '%s', group '%s': %s",
493 edje_load_error_str(edje_object_load_error_get(wd->lay)));
498 elm_layout_theme_set(Evas_Object *obj, const char *clas, const char *group, const char *style)
500 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
501 Widget_Data *wd = elm_widget_data_get(obj);
502 if (!wd) return EINA_FALSE;
503 Eina_Bool ret = _elm_theme_object_set(obj, wd->lay, clas, group, style);
510 _request_sizing_eval(wd);
511 _parts_cursors_apply(wd);
517 elm_layout_content_set(Evas_Object *obj, const char *swallow, Evas_Object *content)
519 _content_set_hook(obj, swallow, content);
525 elm_layout_content_get(const Evas_Object *obj, const char *swallow)
527 return _content_get_hook(obj, swallow);
531 elm_layout_content_unset(Evas_Object *obj, const char *swallow)
533 return _content_unset_hook(obj, swallow);
537 elm_layout_text_set(Evas_Object *obj, const char *part, const char *text)
539 _elm_layout_label_set(obj, part, text);
544 elm_layout_text_get(const Evas_Object *obj, const char *part)
546 return _elm_layout_label_get(obj, part);
550 elm_layout_box_append(Evas_Object *obj, const char *part, Evas_Object *child)
552 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
553 Widget_Data *wd = elm_widget_data_get(obj);
555 if (!wd) return EINA_FALSE;
557 if (!edje_object_part_box_append(wd->lay, part, child))
558 WRN("child %p could not be appended to box part '%s'", child, part);
559 elm_widget_sub_object_add(obj, child);
560 evas_object_event_callback_add
561 (child, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, wd);
563 si = ELM_NEW(Subinfo);
564 si->type = BOX_APPEND;
565 si->part = eina_stringshare_add(part);
567 wd->subs = eina_list_append(wd->subs, si);
568 _request_sizing_eval(wd);
574 elm_layout_box_prepend(Evas_Object *obj, const char *part, Evas_Object *child)
576 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
577 Widget_Data *wd = elm_widget_data_get(obj);
579 if (!wd) return EINA_FALSE;
581 if (!edje_object_part_box_prepend(wd->lay, part, child))
582 WRN("child %p could not be prepended to box part '%s'", child, part);
583 elm_widget_sub_object_add(obj, child);
584 evas_object_event_callback_add
585 (child, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, wd);
587 si = ELM_NEW(Subinfo);
588 si->type = BOX_PREPEND;
589 si->part = eina_stringshare_add(part);
591 wd->subs = eina_list_prepend(wd->subs, si);
592 _request_sizing_eval(wd);
598 _box_reference_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
601 si->p.box.reference = NULL;
605 elm_layout_box_insert_before(Evas_Object *obj, const char *part, Evas_Object *child, const Evas_Object *reference)
607 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
608 Widget_Data *wd = elm_widget_data_get(obj);
610 if (!wd) return EINA_FALSE;
612 if (!edje_object_part_box_insert_before(wd->lay, part, child, reference))
613 WRN("child %p could not be inserted before %p inf box part '%s'",
614 child, reference, part);
616 si = ELM_NEW(Subinfo);
617 si->type = BOX_INSERT_BEFORE;
618 si->part = eina_stringshare_add(part);
620 si->p.box.reference = reference;
622 elm_widget_sub_object_add(obj, child);
623 evas_object_event_callback_add
624 (child, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, wd);
625 evas_object_event_callback_add
626 ((Evas_Object *)reference, EVAS_CALLBACK_DEL, _box_reference_del, si);
628 wd->subs = eina_list_append(wd->subs, si);
629 _request_sizing_eval(wd);
635 elm_layout_box_insert_at(Evas_Object *obj, const char *part, Evas_Object *child, unsigned int pos)
637 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
638 Widget_Data *wd = elm_widget_data_get(obj);
640 if (!wd) return EINA_FALSE;
642 if (!edje_object_part_box_insert_at(wd->lay, part, child, pos))
643 WRN("child %p could not be inserted at %u to box part '%s'",
646 elm_widget_sub_object_add(obj, child);
647 evas_object_event_callback_add
648 (child, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, wd);
650 si = ELM_NEW(Subinfo);
651 si->type = BOX_INSERT_AT;
652 si->part = eina_stringshare_add(part);
655 wd->subs = eina_list_append(wd->subs, si);
656 _request_sizing_eval(wd);
662 _sub_box_remove(Widget_Data *wd, Subinfo *si)
666 if (si->type == BOX_INSERT_BEFORE)
667 evas_object_event_callback_del_full
668 ((Evas_Object *)si->p.box.reference,
669 EVAS_CALLBACK_DEL, _box_reference_del, si);
671 child = si->obj; /* si will die in _sub_del due elm_widget_sub_object_del() */
672 edje_object_part_box_remove(wd->lay, si->part, child);
673 elm_widget_sub_object_del(wd->obj, child);
678 _sub_table_remove(Widget_Data *wd, Subinfo *si)
682 child = si->obj; /* si will die in _sub_del due elm_widget_sub_object_del() */
683 edje_object_part_table_unpack(wd->lay, si->part, child);
684 elm_widget_sub_object_del(wd->obj, child);
689 _sub_box_is(const Subinfo *si)
695 case BOX_INSERT_BEFORE:
704 elm_layout_box_remove(Evas_Object *obj, const char *part, Evas_Object *child)
706 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
707 Widget_Data *wd = elm_widget_data_get(obj);
711 if (!wd) return NULL;
713 EINA_SAFETY_ON_NULL_RETURN_VAL(part, NULL);
714 EINA_SAFETY_ON_NULL_RETURN_VAL(child, NULL);
715 EINA_LIST_FOREACH(wd->subs, l, si)
717 if (!_sub_box_is(si)) continue;
718 if ((si->obj == child) && (!strcmp(si->part, part)))
719 return _sub_box_remove(wd, si);
725 elm_layout_box_remove_all(Evas_Object *obj, const char *part, Eina_Bool clear)
727 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
728 Widget_Data *wd = elm_widget_data_get(obj);
732 if (!wd) return EINA_FALSE;
733 EINA_SAFETY_ON_NULL_RETURN_VAL(part, EINA_FALSE);
735 lst = eina_list_clone(wd->subs);
736 EINA_LIST_FREE(lst, si)
738 if (!_sub_box_is(si)) continue;
739 if (!strcmp(si->part, part))
741 Evas_Object *child = _sub_box_remove(wd, si);
742 if ((clear) && (child)) evas_object_del(child);
745 /* eventually something may not be added with layout, del them as well */
746 edje_object_part_box_remove_all(wd->lay, part, clear);
752 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)
754 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
755 Widget_Data *wd = elm_widget_data_get(obj);
757 if (!wd) return EINA_FALSE;
759 if (!edje_object_part_table_pack
760 (wd->lay, part, child, col, row, colspan, rowspan))
761 WRN("child %p could not be packed into box part '%s' col=%uh, row=%hu, "
762 "colspan=%hu, rowspan=%hu", child, part, col, row, colspan, rowspan);
764 elm_widget_sub_object_add(obj, child);
765 evas_object_event_callback_add
766 (child, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, wd);
768 si = ELM_NEW(Subinfo);
769 si->type = TABLE_PACK;
770 si->part = eina_stringshare_add(part);
772 si->p.table.col = col;
773 si->p.table.row = row;
774 si->p.table.colspan = colspan;
775 si->p.table.rowspan = rowspan;
776 wd->subs = eina_list_append(wd->subs, si);
777 _request_sizing_eval(wd);
783 elm_layout_table_unpack(Evas_Object *obj, const char *part, Evas_Object *child)
785 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
786 Widget_Data *wd = elm_widget_data_get(obj);
790 if (!wd) return NULL;
792 EINA_SAFETY_ON_NULL_RETURN_VAL(part, NULL);
793 EINA_SAFETY_ON_NULL_RETURN_VAL(child, NULL);
794 EINA_LIST_FOREACH(wd->subs, l, si)
796 if (si->type != TABLE_PACK) continue;
797 if ((si->obj == child) && (!strcmp(si->part, part)))
798 return _sub_table_remove(wd, si);
804 elm_layout_table_clear(Evas_Object *obj, const char *part, Eina_Bool clear)
806 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
807 Widget_Data *wd = elm_widget_data_get(obj);
811 if (!wd) return EINA_FALSE;
812 EINA_SAFETY_ON_NULL_RETURN_VAL(part, EINA_FALSE);
814 lst = eina_list_clone(wd->subs);
815 EINA_LIST_FREE(lst, si)
817 if (si->type != TABLE_PACK) continue;
818 if (!strcmp(si->part, part))
820 Evas_Object *child = _sub_table_remove(wd, si);
821 if ((clear) && (child)) evas_object_del(child);
824 /* eventually something may not be added with layout, del them as well */
825 edje_object_part_table_clear(wd->lay, part, clear);
831 elm_layout_edje_get(const Evas_Object *obj)
833 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
834 Widget_Data *wd = elm_widget_data_get(obj);
835 if (!wd) return NULL;
840 elm_layout_data_get(const Evas_Object *obj, const char *key)
842 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
843 Widget_Data *wd = elm_widget_data_get(obj);
844 return edje_object_data_get(wd->lay, key);
848 elm_layout_sizing_eval(Evas_Object *obj)
850 ELM_CHECK_WIDTYPE(obj, widtype);
851 Widget_Data *wd = elm_widget_data_get(obj);
852 EINA_SAFETY_ON_NULL_RETURN(wd);
853 _request_sizing_eval(wd);
857 elm_layout_part_cursor_set(Evas_Object *obj, const char *part_name, const char *cursor)
859 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
860 EINA_SAFETY_ON_NULL_RETURN_VAL(part_name, EINA_FALSE);
861 Widget_Data *wd = elm_widget_data_get(obj);
862 EINA_SAFETY_ON_NULL_RETURN_VAL(wd, EINA_FALSE);
863 Evas_Object *part_obj;
866 part_obj = (Evas_Object *)edje_object_part_object_get(wd->lay, part_name);
869 const char *group, *file;
870 edje_object_file_get(wd->lay, &file, &group);
871 WRN("no part '%s' in group '%s' of file '%s'. Cannot set cursor '%s'",
872 part_name, group, file, cursor);
875 if (evas_object_pass_events_get(part_obj))
877 const char *group, *file;
878 edje_object_file_get(wd->lay, &file, &group);
879 WRN("part '%s' in group '%s' of file '%s' has mouse_events: 0. "
880 "Cannot set cursor '%s'",
881 part_name, group, file, cursor);
885 pc = _parts_cursors_find(wd, part_name);
886 if (pc) eina_stringshare_replace(&pc->cursor, cursor);
889 pc = calloc(1, sizeof(*pc));
890 pc->part = eina_stringshare_add(part_name);
891 pc->cursor = eina_stringshare_add(cursor);
892 pc->style = eina_stringshare_add("default");
893 wd->parts_cursors = eina_list_append(wd->parts_cursors, pc);
897 elm_object_sub_cursor_set(part_obj, obj, pc->cursor);
902 elm_layout_part_cursor_get(const Evas_Object *obj, const char *part_name)
904 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
905 EINA_SAFETY_ON_NULL_RETURN_VAL(part_name, NULL);
906 Widget_Data *wd = elm_widget_data_get(obj);
907 EINA_SAFETY_ON_NULL_RETURN_VAL(wd, NULL);
908 Part_Cursor *pc = _parts_cursors_find(wd, part_name);
909 EINA_SAFETY_ON_NULL_RETURN_VAL(pc, NULL);
910 EINA_SAFETY_ON_NULL_RETURN_VAL(pc->obj, NULL);
911 return elm_object_cursor_get(pc->obj);
915 elm_layout_part_cursor_unset(Evas_Object *obj, const char *part_name)
917 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
918 EINA_SAFETY_ON_NULL_RETURN_VAL(part_name, EINA_FALSE);
919 Widget_Data *wd = elm_widget_data_get(obj);
920 EINA_SAFETY_ON_NULL_RETURN_VAL(wd, EINA_FALSE);
924 EINA_LIST_FOREACH(wd->parts_cursors, l, pc)
926 if (!strcmp(part_name, pc->part))
928 if (pc->obj) elm_object_cursor_unset(pc->obj);
929 _part_cursor_free(pc);
930 wd->parts_cursors = eina_list_remove_list(wd->parts_cursors, l);
939 elm_layout_part_cursor_style_set(Evas_Object *obj, const char *part_name, const char *style)
941 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
942 EINA_SAFETY_ON_NULL_RETURN_VAL(part_name, EINA_FALSE);
943 Widget_Data *wd = elm_widget_data_get(obj);
944 EINA_SAFETY_ON_NULL_RETURN_VAL(wd, EINA_FALSE);
945 Part_Cursor *pc = _parts_cursors_find(wd, part_name);
946 EINA_SAFETY_ON_NULL_RETURN_VAL(pc, EINA_FALSE);
947 EINA_SAFETY_ON_NULL_RETURN_VAL(pc->obj, EINA_FALSE);
949 eina_stringshare_replace(&pc->style, style);
950 elm_object_cursor_style_set(pc->obj, pc->style);
955 elm_layout_part_cursor_style_get(const Evas_Object *obj, const char *part_name)
957 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
958 EINA_SAFETY_ON_NULL_RETURN_VAL(part_name, NULL);
959 Widget_Data *wd = elm_widget_data_get(obj);
960 EINA_SAFETY_ON_NULL_RETURN_VAL(wd, NULL);
961 Part_Cursor *pc = _parts_cursors_find(wd, part_name);
962 EINA_SAFETY_ON_NULL_RETURN_VAL(pc, NULL);
963 EINA_SAFETY_ON_NULL_RETURN_VAL(pc->obj, NULL);
964 return elm_object_cursor_style_get(pc->obj);
968 elm_layout_part_cursor_engine_only_set(Evas_Object *obj, const char *part_name, Eina_Bool engine_only)
970 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
971 EINA_SAFETY_ON_NULL_RETURN_VAL(part_name, EINA_FALSE);
972 Widget_Data *wd = elm_widget_data_get(obj);
973 EINA_SAFETY_ON_NULL_RETURN_VAL(wd, EINA_FALSE);
974 Part_Cursor *pc = _parts_cursors_find(wd, part_name);
975 EINA_SAFETY_ON_NULL_RETURN_VAL(pc, EINA_FALSE);
976 EINA_SAFETY_ON_NULL_RETURN_VAL(pc->obj, EINA_FALSE);
978 pc->engine_only = !!engine_only;
979 elm_object_cursor_theme_search_enabled_set(pc->obj, pc->engine_only);
984 elm_layout_part_cursor_engine_only_get(const Evas_Object *obj, const char *part_name)
986 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
987 EINA_SAFETY_ON_NULL_RETURN_VAL(part_name, EINA_FALSE);
988 Widget_Data *wd = elm_widget_data_get(obj);
989 EINA_SAFETY_ON_NULL_RETURN_VAL(wd, EINA_FALSE);
990 Part_Cursor *pc = _parts_cursors_find(wd, part_name);
991 EINA_SAFETY_ON_NULL_RETURN_VAL(pc, EINA_FALSE);
992 EINA_SAFETY_ON_NULL_RETURN_VAL(pc->obj, EINA_FALSE);
993 return elm_object_cursor_theme_search_enabled_get(pc->obj);