els_cursor: avoid forcing a recursive canvas layout recalc when adding cursor

use deferred size hints to avoid unnecessary recalcs

Differential Revision: https://phab.enlightenment.org/D5948
This commit is contained in:
Mike Blumenkrantz 2018-04-16 16:07:14 -04:00
parent 668d68cdf4
commit 08fe88cb2d
1 changed files with 25 additions and 10 deletions

View File

@ -191,6 +191,21 @@ struct _Elm_Cursor
Eina_Bool theme_search:1; Eina_Bool theme_search:1;
}; };
static void
_elm_cursor_obj_hints(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Elm_Cursor *cur = data;
int x, y;
evas_object_size_hint_min_get(cur->obj, &x, &y);
if ((x < 8) || (y < 8))
{
x = 8;
y = 8;
}
evas_object_resize(cur->obj, x, y);
}
static void static void
_elm_cursor_obj_del(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) _elm_cursor_obj_del(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{ {
@ -200,6 +215,8 @@ _elm_cursor_obj_del(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UN
{ {
evas_object_event_callback_del_full(cur->obj, EVAS_CALLBACK_DEL, evas_object_event_callback_del_full(cur->obj, EVAS_CALLBACK_DEL,
_elm_cursor_obj_del, cur); _elm_cursor_obj_del, cur);
evas_object_event_callback_del_full(cur->obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
_elm_cursor_obj_hints, cur);
cur->obj = NULL; cur->obj = NULL;
ELM_SAFE_FREE(cur->hotobj, evas_object_del); ELM_SAFE_FREE(cur->hotobj, evas_object_del);
} }
@ -257,8 +274,6 @@ _elm_cursor_hot_change(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA
static Eina_Bool static Eina_Bool
_elm_cursor_obj_add(Evas_Object *obj, Elm_Cursor *cur) _elm_cursor_obj_add(Evas_Object *obj, Elm_Cursor *cur)
{ {
int x, y;
#ifdef HAVE_ELEMENTARY_WL2 #ifdef HAVE_ELEMENTARY_WL2
const char *engine_name; const char *engine_name;
@ -271,6 +286,8 @@ _elm_cursor_obj_add(Evas_Object *obj, Elm_Cursor *cur)
cur->obj = edje_object_add(cur->evas); cur->obj = edje_object_add(cur->evas);
if (!cur->obj) return EINA_FALSE; if (!cur->obj) return EINA_FALSE;
edje_object_freeze(cur->obj);
edje_object_update_hints_set(cur->obj, 1);
if (!elm_widget_theme_object_set(obj, cur->obj, "cursor", cur->cursor_name, if (!elm_widget_theme_object_set(obj, cur->obj, "cursor", cur->cursor_name,
cur->style ? cur->style : "default")) cur->style ? cur->style : "default"))
@ -302,14 +319,10 @@ _elm_cursor_obj_add(Evas_Object *obj, Elm_Cursor *cur)
evas_object_event_callback_add(cur->obj, EVAS_CALLBACK_DEL, evas_object_event_callback_add(cur->obj, EVAS_CALLBACK_DEL,
_elm_cursor_obj_del, cur); _elm_cursor_obj_del, cur);
edje_object_size_min_get(cur->obj, &x, &y); evas_object_event_callback_add(cur->obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
edje_object_size_min_restricted_calc(cur->obj, &x, &y, x, y); _elm_cursor_obj_hints, cur);
if ((x < 8) || (y < 8)) edje_object_thaw(cur->obj);
{
x = 8;
y = 8;
}
evas_object_resize(cur->obj, x, y);
return EINA_TRUE; return EINA_TRUE;
} }
@ -677,6 +690,8 @@ elm_object_cursor_unset(Evas_Object *obj)
{ {
evas_object_event_callback_del_full(cur->obj, EVAS_CALLBACK_DEL, evas_object_event_callback_del_full(cur->obj, EVAS_CALLBACK_DEL,
_elm_cursor_obj_del, cur); _elm_cursor_obj_del, cur);
evas_object_event_callback_del_full(cur->obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
_elm_cursor_obj_hints, cur);
ELM_SAFE_FREE(cur->obj, evas_object_del); ELM_SAFE_FREE(cur->obj, evas_object_del);
} }