elm - add apis to deal with accel perference

this deals with an issue brought up today on irc - seemingly rage
asking for accel is causing segvs in vbox with its gl accel subsystem
- the only way to disable this is an env var, and this is unfriendly,
so make config gui and stuff to mess with accel preference to fix this.
This commit is contained in:
Carsten Haitzler 2014-08-06 00:04:11 +09:00
parent 8582b2e149
commit f54afe89cc
5 changed files with 174 additions and 144 deletions

View File

@ -1303,25 +1303,6 @@ _config_all_changed(void *data,
return ECORE_CALLBACK_PASS_ON;
}
static void
_engine_use(void *data,
Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Evas_Object *li;
const char *selection;
li = data;
selection = elm_object_item_data_get(elm_list_selected_item_get(li));
if (!strcmp(elm_config_engine_get(), selection))
return;
elm_config_engine_set(selection);
elm_config_all_flush();
elm_config_save(); /* make sure new engine has its data dir */
}
static void
_profile_use(void *data,
Evas_Object *obj EINA_UNUSED,
@ -2628,14 +2609,6 @@ _status_config_fonts(Evas_Object *win,
elm_naviframe_item_simple_push(naviframe, base);
}
static void
_engines_list_item_del_cb(void *data,
Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
free(data);
}
static void
_profiles_list_item_del_cb(void *data,
Evas_Object *obj EINA_UNUSED,
@ -3377,148 +3350,86 @@ _status_config_scrolling(Evas_Object *win,
elm_naviframe_item_simple_push(naviframe, sc);
}
static char *
_engine_name_prettify(const char *engine)
static void
_cb_accel(void *data, Evas_Object *obj EINA_UNUSED, void *info EINA_UNUSED)
{
char *ret, *ptr;
const char *val = data;
const char *ss = elm_config_accel_preference_get();
ret = strdup(engine);
ret[0] -= 0x20;
while ((ptr = strpbrk(ret, "_")))
if ((!ss) || (ss && (strcasecmp(ss, val))))
{
*ptr = ' ';
elm_config_accel_preference_set(val);
elm_config_all_flush();
elm_config_save();
}
return ret;
}
/* FIXME! ideally, we would trim elm_config.c's _elm_engines list at
build time, making a getter for is as in ecore-evas. */
static Eina_Bool
_elm_engine_supported(const char *engine)
{
const char *engines[] = {
"software_x11",
"fb",
"directfb",
"software_16_x11",
"software_8_x11",
"xrender_x11",
"opengl_x11",
"software_gdi",
"sdl",
"software_16_sdl",
"opengl_sdl",
"ews",
"opengl_cocoa",
"psl1ght",
"wayland_shm",
"wayland_egl",
NULL
};
unsigned int i;
for (i = 0; engines[i]; i++)
{
#define ENGINE_COMPARE(name) (!strcmp(engines[i], name))
if (ENGINE_COMPARE(engine))
return EINA_TRUE;
#undef ENGINE_COMPARE
}
return EINA_FALSE;
}
static void
_engines_list_fill(Evas_Object *l_widget,
Eina_List *e_names)
_cb_accel_override(void *data EINA_UNUSED, Evas_Object *obj, void *info EINA_UNUSED)
{
const char *engine, *cur_engine;
void *sel_it = NULL;
Eina_List *l;
Eina_Bool val = elm_check_state_get(obj);
Eina_Bool sb = elm_config_accel_preference_override_get();
if (!e_names)
return;
cur_engine = elm_config_engine_get();
EINA_LIST_FOREACH(e_names, l, engine)
if (val != sb)
{
const char *label;
Elm_Object_Item *list_it;
if (!_elm_engine_supported(engine))
continue;
label = _engine_name_prettify(engine);
list_it = elm_list_item_append(l_widget, label, NULL, NULL, NULL,
strdup(engine));
elm_object_item_del_cb_set(list_it, _engines_list_item_del_cb);
free((void *)label);
if (!strcmp(cur_engine, engine))
sel_it = list_it;
elm_config_accel_preference_override_set(val);
elm_config_all_flush();
elm_config_save();
}
if (sel_it) elm_list_item_selected_set(sel_it, EINA_TRUE);
elm_list_go(l_widget);
}
static void
_status_config_rendering(Evas_Object *win,
Evas_Object *naviframe)
{
Evas_Object *li, *bx, *fr, *sp, *pd, *bt;
Eina_List *engines;
Evas_Object *li, *bx, *ck;
Elm_Object_Item *it;
bx = elm_box_add(win);
evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
fr = elm_frame_add(win);
elm_object_text_set(fr, "Available Engines");
evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(bx, fr);
evas_object_show(fr);
li = elm_list_add(win);
elm_object_content_set(fr, li);
evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
engines = ecore_evas_engines_get();
_engines_list_fill(li, engines);
ecore_evas_engines_free(engines);
elm_box_pack_end(bx, li);
evas_object_show(li);
evas_object_data_set(win, "engines_list", li);
/////////////////////////////////////////////
sp = elm_separator_add(win);
elm_separator_horizontal_set(sp, EINA_TRUE);
evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
elm_box_pack_end(bx, sp);
evas_object_show(sp);
it = elm_list_item_append(li, "No Acceleration", NULL, NULL,
_cb_accel, "none");
if (!elm_config_accel_preference_get() ||
(!strcasecmp(elm_config_accel_preference_get(), "none")))
elm_list_item_selected_set(it, EINA_TRUE);
pd = elm_frame_add(win);
elm_object_style_set(pd, "pad_medium");
evas_object_size_hint_weight_set(pd, 0.0, 0.0);
evas_object_size_hint_align_set(pd, 0.5, 0.5);
elm_box_pack_end(bx, pd);
evas_object_show(pd);
it = elm_list_item_append(li, "OpenGL / OpenGL-ES", NULL, NULL,
_cb_accel, "gl");
if (elm_config_accel_preference_get() &&
((!strcasecmp(elm_config_accel_preference_get(), "gl")) ||
(!strcasecmp(elm_config_accel_preference_get(), "opengl"))))
elm_list_item_selected_set(it, EINA_TRUE);
bt = elm_button_add(win);
evas_object_smart_callback_add(bt, "clicked", _engine_use, li);
elm_object_text_set(bt, "Use Engine");
evas_object_size_hint_weight_set(bt, 0.0, 0.0);
evas_object_size_hint_align_set(bt, 0.5, 0.5);
elm_object_content_set(pd, bt);
evas_object_show(bt);
it = elm_list_item_append(li, "3D (any 3D hardware)", NULL, NULL,
_cb_accel, "3d");
if (elm_config_accel_preference_get() &&
(!strcasecmp(elm_config_accel_preference_get(), "3d")))
elm_list_item_selected_set(it, EINA_TRUE);
it = elm_list_item_append(li, "Hardware (any hardware)", NULL, NULL,
_cb_accel, "hw");
if (elm_config_accel_preference_get() &&
((!strcasecmp(elm_config_accel_preference_get(), "hw")) ||
(!strcasecmp(elm_config_accel_preference_get(), "hardware")) ||
(!strcasecmp(elm_config_accel_preference_get(), "accel"))))
elm_list_item_selected_set(it, EINA_TRUE);
elm_list_go(li);
CHECK_ADD("Override Preferred Acceleration",
"Force any application requesting<br>"
"acceleration to use the system<br>"
"configured acceleration as above",
_cb_accel_override, NULL);
elm_check_state_set(ck, elm_config_accel_preference_override_get());
evas_object_data_set(win, "rendering", bx);
elm_naviframe_item_simple_push(naviframe, bx);

View File

@ -480,6 +480,8 @@ _desc_init(void)
#define D _config_edd
ELM_CONFIG_VAL(D, T, config_version, T_INT);
ELM_CONFIG_VAL(D, T, engine, T_STRING);
ELM_CONFIG_VAL(D, T, accel, T_STRING);
ELM_CONFIG_VAL(D, T, accel_override, T_UCHAR);
ELM_CONFIG_VAL(D, T, vsync, T_UCHAR);
ELM_CONFIG_VAL(D, T, thumbscroll_enable, T_UCHAR);
ELM_CONFIG_VAL(D, T, thumbscroll_threshold, T_INT);
@ -1311,6 +1313,7 @@ _config_free(Elm_Config *cfg)
eina_stringshare_del(fontdir);
}
eina_stringshare_del(cfg->engine);
eina_stringshare_del(cfg->accel);
EINA_LIST_FREE(cfg->font_overlays, fo)
{
eina_stringshare_del(fo->text_class);
@ -1501,6 +1504,8 @@ _config_load(void)
_elm_config = ELM_NEW(Elm_Config);
_elm_config->config_version = ELM_CONFIG_VERSION;
_elm_config->engine = eina_stringshare_add(DEFAULT_ENGINE);
_elm_config->accel = NULL;
_elm_config->accel_override = 0;
_elm_config->vsync = 0;
_elm_config->thumbscroll_enable = EINA_TRUE;
_elm_config->thumbscroll_threshold = 24;
@ -2680,6 +2685,30 @@ elm_config_cache_edje_collection_cache_size_set(int size)
_elm_recache();
}
EAPI Eina_Bool
elm_config_vsync_get(void)
{
return _elm_config->vsync;
}
EAPI void
elm_config_vsync_set(Eina_Bool enabled)
{
_elm_config->vsync = enabled;
}
EAPI Eina_Bool
elm_config_accel_preference_override_get(void)
{
return _elm_config->accel_override;
}
EAPI void
elm_config_accel_preference_override_set(Eina_Bool enabled)
{
_elm_config->accel_override = enabled;
}
EAPI Eina_Bool
elm_config_focus_highlight_enabled_get(void)
{
@ -3362,17 +3391,22 @@ elm_config_preferred_engine_set(const char *engine)
EAPI const char *
elm_config_accel_preference_get(void)
{
return _elm_accel_preference;
if (_elm_accel_preference) return _elm_accel_preference;
return _elm_config->accel;
}
EAPI void
elm_config_accel_preference_set(const char *pref)
{
if (pref)
eina_stringshare_replace(&(_elm_accel_preference), pref);
{
eina_stringshare_replace(&(_elm_accel_preference), pref);
eina_stringshare_replace(&(_elm_config->accel), pref);
}
else
{
ELM_SAFE_FREE(_elm_accel_preference, eina_stringshare_del);
ELM_SAFE_FREE(_elm_config->accel, eina_stringshare_del);
}
}

View File

@ -1196,6 +1196,56 @@ EAPI int elm_config_cache_edje_collection_cache_size_get(void);
*/
EAPI void elm_config_cache_edje_collection_cache_size_set(int size);
/**
* Get the configured vsync flag
*
* This gets the globally configured vsync flag that asks some backend
* engines to use vsync display if possible.
*
* @return If vsync is enabled
*
* @since 1.11
*/
EAPI Eina_Bool elm_config_vsync_get(void);
/**
* Set the configured vsync flag
*
* This sets the globally configured vsync flag that asks some backend
* engines to use vsync display if possible.
*
* @param enabled This should be EINA_TRUE if enabled, or EINA_FALSE if not.
*
* @since 1.11
*/
EAPI void elm_config_vsync_set(Eina_Bool enabled);
/**
* Get the acceleration override preference flag
*
* This gets the acceleration override preference. This is a flag that
* has the global system acceleration preference configureation forcibly
* override whatever acceleration preference the application may want.
*
* @return If acceleration override is enabled
*
* @since 1.11
*/
EAPI Eina_Bool elm_config_accel_preference_override_get(void);
/**
* Set the acceleration override preference flag
*
* This sets the acceleration override preference. This is a flag that
* has the global system acceleration preference configureation forcibly
* override whatever acceleration preference the application may want.
*
* @param enabled This should be EINA_TRUE if enabled, or EINA_FALSE if not.
*
* @since 1.11
*/
EAPI void elm_config_accel_preference_override_set(Eina_Bool enabled);
/**
* Get the enable status of the focus highlight
*

View File

@ -182,6 +182,8 @@ struct _Elm_Config
{
int config_version;
const char *engine;
const char *accel;
unsigned char accel_override;
unsigned char vsync;
unsigned char thumbscroll_enable;
int thumbscroll_threshold;

View File

@ -2932,8 +2932,11 @@ _accel_is_gl(void)
{
const char *env = NULL;
const char *str;
str = _elm_accel_preference;
if (_elm_config->accel) str = _elm_config->accel;
if (_elm_accel_preference) str = _elm_accel_preference;
if ((_elm_config->accel_override) && (_elm_config->accel))
str = _elm_config->accel;
env = getenv("ELM_ACCEL");
if (env) str = env;
if ((str) &&
@ -3077,6 +3080,36 @@ _elm_win_constructor(Eo *obj, Elm_Win_Data *sd, const char *name, Elm_Win_Type t
enginelist[0] = ENGINE_GET();
enginelist[1] = NULL;
}
else if (getenv("DISPLAY"))
{
if (_accel_is_gl())
{
enginelist[0] = ELM_OPENGL_X11;
enginelist[1] = ELM_SOFTWARE_X11;
enginelist[2] = NULL;
}
else
{
enginelist[0] = ELM_SOFTWARE_X11;
enginelist[1] = ELM_OPENGL_X11;
enginelist[2] = NULL;
}
}
else if (getenv("WAYLAND_DISPLAY"))
{
if (_accel_is_gl())
{
enginelist[0] = ELM_WAYLAND_EGL;
enginelist[1] = ELM_WAYLAND_SHM;
enginelist[2] = NULL;
}
else
{
enginelist[0] = ELM_WAYLAND_SHM;
enginelist[1] = ELM_WAYLAND_EGL;
enginelist[2] = NULL;
}
}
else
{
if (_accel_is_gl())