From eec7bc458eee333fd7237a3bd43e8c2c884f21ca Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Thu, 29 Nov 2018 14:09:09 -0500 Subject: [PATCH] elementary: Support using no frame object Summary: Creation of the frame object can lead to significant delays in window creation time on limited-power devices (watches, mobile, tv, etc). This patch allows setting an environment variable and config value in order to completely skip frame object creation. This shaves about 50ms from startup on an i7 8600k, so should be more substantial a saves on limited-power devices. Reviewers: kimcinoo, ManMower Reviewed By: ManMower Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D7305 --- src/lib/elementary/efl_ui_win.c | 33 +++++++++++++++++++++++++++------ src/lib/elementary/elm_config.c | 11 +++++++++++ src/lib/elementary/elm_priv.h | 6 ++++-- 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c index 712238e04b..535316119e 100644 --- a/src/lib/elementary/efl_ui_win.c +++ b/src/lib/elementary/efl_ui_win.c @@ -4623,7 +4623,8 @@ _elm_win_frame_style_update(Efl_Ui_Win_Data *sd, Eina_Bool force_emit, Eina_Bool if (!efl_finalized_get(sd->obj)) return; if (EINA_LIKELY(sd->type == ELM_WIN_FAKE)) return; - CRI("Window has no frame object!"); + if (!_elm_config->win_no_border) + CRI("Window has no frame object!"); return; } @@ -4640,6 +4641,8 @@ _elm_win_frame_style_update(Efl_Ui_Win_Data *sd, Eina_Bool force_emit, Eina_Bool sd->csd.need_menu = EINA_FALSE; sd->csd.need_indicator = EINA_FALSE; } + else if (_elm_config->win_no_border) + sd->csd.need_borderless = EINA_TRUE; else { sd->csd.need_shadow = sd->csd.need && (!sd->maximized); @@ -5606,7 +5609,9 @@ _elm_win_finalize_internal(Eo *obj, Efl_Ui_Win_Data *sd, const char *name, Efl_U case EFL_UI_WIN_NAVIFRAME_BASIC: element = "naviframe"; break; default: break; } - _elm_win_frame_add(sd, element, style); + + if (!_elm_config->win_no_border) + _elm_win_frame_add(sd, element, style); if (sd->indimode != EFL_UI_WIN_INDICATOR_OFF) _indicator_add(sd); @@ -7330,13 +7335,29 @@ _elm_win_bg_set(Efl_Ui_Win_Data *sd, Eo *bg) return EINA_FALSE; if (elm_widget_is_legacy(sd->obj)) { - if (!edje_object_part_swallow(sd->frame_obj, "elm.swallow.background", bg)) - return EINA_FALSE; + if (!_elm_config->win_no_border) + { + if (!edje_object_part_swallow(sd->frame_obj, "elm.swallow.background", bg)) + return EINA_FALSE; + } + else + { + if (!edje_object_part_swallow(sd->legacy.edje, "elm.swallow.background", bg)) + return EINA_FALSE; + } } else { - if (!edje_object_part_swallow(sd->frame_obj, "efl.background", bg)) - return EINA_FALSE; + if (!_elm_config->win_no_border) + { + if (!edje_object_part_swallow(sd->frame_obj, "efl.background", bg)) + return EINA_FALSE; + } + else + { + if (!edje_object_part_swallow(sd->legacy.edje, "efl.background", bg)) + return EINA_FALSE; + } } efl_gfx_entity_visible_set(bg, 1); efl_gfx_size_hint_align_set(bg, -1, -1); diff --git a/src/lib/elementary/elm_config.c b/src/lib/elementary/elm_config.c index 13e80fd5da..6102ec6dcb 100644 --- a/src/lib/elementary/elm_config.c +++ b/src/lib/elementary/elm_config.c @@ -535,6 +535,7 @@ _desc_init(void) ELM_CONFIG_VAL(D, T, offline, T_UCHAR); ELM_CONFIG_VAL(D, T, powersave, T_INT); ELM_CONFIG_VAL(D, T, drag_anim_duration, T_DOUBLE); + ELM_CONFIG_VAL(D, T, win_no_border, T_UCHAR); #undef T #undef D #undef T_INT @@ -1868,6 +1869,7 @@ _config_load(Eina_Bool on_flush) _elm_config->popup_scrollable = EINA_FALSE; _elm_config->entry_select_allow = EINA_TRUE; _elm_config->drag_anim_duration = 0.0; + _elm_config->win_no_border = EINA_FALSE; _env_get(); } @@ -2077,6 +2079,8 @@ _elm_config_reload_do(Eina_Bool on_flush) KEEP_VAL(entry_select_allow); KEEP_VAL(drag_anim_duration); + KEEP_VAL(win_no_border); + _elm_config->priv = prev_config->priv; _config_free(prev_config); } @@ -2516,6 +2520,10 @@ _config_update(void) _elm_key_bindings_update(_elm_config, tcfg); IFCFGEND + IFCFG(0x0010) + _elm_config->win_no_border = EINA_FALSE; + IFCFGEND + /** * Fix user config for current ELM_CONFIG_EPOCH here. **/ @@ -2892,6 +2900,9 @@ _env_get(void) s = getenv("EFL_UI_DND_DRAG_ANIM_DURATION"); if (s) _elm_config->drag_anim_duration = _elm_atof(s); + + s = getenv("ELM_WIN_NO_BORDER"); + if (s) _elm_config->win_no_border = EINA_TRUE; } static void diff --git a/src/lib/elementary/elm_priv.h b/src/lib/elementary/elm_priv.h index 0c34917b88..6b181e8ffb 100644 --- a/src/lib/elementary/elm_priv.h +++ b/src/lib/elementary/elm_priv.h @@ -166,8 +166,8 @@ struct _Efl_Ui_Theme_Data * the users config doesn't need to be wiped - simply new values need * to be put in */ -# define ELM_CONFIG_FILE_GENERATION 0x0012 -# define ELM_CONFIG_VERSION_EPOCH_OFFSET 16 +# define ELM_CONFIG_FILE_GENERATION 0x0013 +# define ELM_CONFIG_VERSION_EPOCH_OFFSET 17 # define ELM_CONFIG_VERSION ((ELM_CONFIG_EPOCH << ELM_CONFIG_VERSION_EPOCH_OFFSET) | \ ELM_CONFIG_FILE_GENERATION) /* NB: profile configuration files (.src) must have their @@ -353,6 +353,7 @@ struct _Elm_Config_Flags Eina_Bool icon_theme : 1; Eina_Bool entry_select_allow : 1; // unused Eina_Bool drag_anim_duration : 1; + Eina_Bool win_no_border : 1; }; struct _Elm_Config @@ -498,6 +499,7 @@ struct _Elm_Config Eina_Bool offline; int powersave; double drag_anim_duration; + unsigned char win_no_border; /* Not part of the EET file */ Eina_Bool is_mirrored : 1;