raster pushed a commit to branch master. http://git.enlightenment.org/core/elementary.git/commit/?id=245a740c25f55bc3aa649757f05869a9ad8feba1
commit 245a740c25f55bc3aa649757f05869a9ad8feba1 Author: Carsten Haitzler (Rasterman) <[email protected]> Date: Sun Mar 9 00:49:33 2014 +0900 win - improve window engine choosing code to be simpler and support display this isn't a feature or a bug fix - it's a code logic improvement that also uses an ELM_DISPLAY environment variablew to choose a specific engine list, and still uses ELM_ENGINE and preferred engine. this makes it easy to add new api to prefer accel or not etc. --- src/lib/elm_win.c | 235 ++++++++++++++++++++++++------------------------------ 1 file changed, 104 insertions(+), 131 deletions(-) diff --git a/src/lib/elm_win.c b/src/lib/elm_win.c index b7625f4..e53088e 100644 --- a/src/lib/elm_win.c +++ b/src/lib/elm_win.c @@ -2844,7 +2844,8 @@ _win_constructor(Eo *obj, void *_pd, va_list *list) Evas_Object *parent; Evas *e; const Eina_List *l; - const char *fontpath, *fallback = NULL; + const char *fontpath, *engine = NULL, *enginelist[32], *disp; + int i; Elm_Win_Smart_Data tmp_sd; @@ -2853,17 +2854,6 @@ _win_constructor(Eo *obj, void *_pd, va_list *list) /* just to store some data while trying out to create a canvas */ memset(&tmp_sd, 0, sizeof(Elm_Win_Smart_Data)); -#define FALLBACK_TRY(engine) \ - if (!tmp_sd.ee) { \ - CRI(engine " engine creation failed. Trying default."); \ - } while (0) -#define FALLBACK_STORE(engine) \ - if (tmp_sd.ee) \ - { \ - CRI(engine "Fallback to %s successful.", engine); \ - fallback = engine; \ - } - switch (type) { case ELM_WIN_INLINED_IMAGE: @@ -2893,140 +2883,128 @@ _win_constructor(Eo *obj, void *_pd, va_list *list) break; default: - if (ENGINE_COMPARE(ELM_SOFTWARE_X11)) + disp = getenv("ELM_DISPLAY"); + if ((disp) && (!strcmp(disp, "x11"))) { - tmp_sd.ee = ecore_evas_software_x11_new(NULL, 0, 0, 0, 1, 1); - FALLBACK_TRY("Software X11"); - if (!tmp_sd.ee) - { - tmp_sd.ee = ecore_evas_fb_new(NULL, 0, 1, 1); - FALLBACK_STORE("Software FB"); - } + enginelist[0] = ENGINE_GET(); + enginelist[1] = ELM_SOFTWARE_X11; + enginelist[2] = ELM_OPENGL_X11; + enginelist[3] = NULL; } - else if (ENGINE_COMPARE(ELM_SOFTWARE_FB)) + else if ((disp) && (!strcmp(disp, "wl"))) { - tmp_sd.ee = ecore_evas_fb_new(NULL, 0, 1, 1); - FALLBACK_TRY("Software FB"); - if (!tmp_sd.ee) - { - tmp_sd.ee = ecore_evas_software_x11_new(NULL, 0, 0, 0, 1, 1); - FALLBACK_STORE("Software X11"); - } + enginelist[0] = ENGINE_GET(); + enginelist[1] = ELM_WAYLAND_SHM; + enginelist[2] = ELM_WAYLAND_EGL; + enginelist[3] = NULL; } - else if (ENGINE_COMPARE(ELM_OPENGL_X11)) + else if ((disp) && (!strcmp(disp, "win"))) { - int opt[10]; - int opt_i = 0; - - if (_elm_config->vsync) - { - opt[opt_i] = ECORE_EVAS_GL_X11_OPT_VSYNC; - opt_i++; - opt[opt_i] = 1; - opt_i++; - opt[opt_i] = 0; - } - if (opt_i > 0) - tmp_sd.ee = ecore_evas_gl_x11_options_new - (NULL, 0, 0, 0, 1, 1, opt); - else - tmp_sd.ee = ecore_evas_gl_x11_new(NULL, 0, 0, 0, 1, 1); - FALLBACK_TRY("OpenGL"); - if (!tmp_sd.ee) - { - tmp_sd.ee = ecore_evas_software_x11_new(NULL, 0, 0, 0, 1, 1); - FALLBACK_STORE("Software X11"); - if (!tmp_sd.ee) - { - tmp_sd.ee = ecore_evas_fb_new(NULL, 0, 1, 1); - FALLBACK_STORE("Software FB"); - } - } + enginelist[0] = ENGINE_GET(); + enginelist[1] = ELM_SOFTWARE_WIN32; + enginelist[2] = NULL; } - else if (ENGINE_COMPARE(ELM_SOFTWARE_WIN32)) + else if ((disp) && (!strcmp(disp, "sdl"))) { - tmp_sd.ee = ecore_evas_software_gdi_new(NULL, 0, 0, 1, 1); - FALLBACK_TRY("Software Win32"); - } - else if (ENGINE_COMPARE(ELM_SOFTWARE_PSL1GHT)) - { - tmp_sd.ee = ecore_evas_psl1ght_new(NULL, 1, 1); - FALLBACK_TRY("PSL1GHT"); - } - else if (ENGINE_COMPARE(ELM_SOFTWARE_SDL)) - { - tmp_sd.ee = ecore_evas_sdl_new(NULL, 0, 0, 0, 0, 0, 1); - FALLBACK_TRY("Software SDL"); - if (!tmp_sd.ee) - { - tmp_sd.ee = ecore_evas_software_x11_new(NULL, 0, 0, 0, 1, 1); - FALLBACK_STORE("Software X11"); - if (!tmp_sd.ee) - { - tmp_sd.ee = ecore_evas_fb_new(NULL, 0, 1, 1); - FALLBACK_STORE("Software FB"); - } - } + enginelist[0] = ENGINE_GET(); + enginelist[1] = ELM_SOFTWARE_SDL; + enginelist[2] = ELM_OPENGL_SDL; + enginelist[3] = NULL; } - else if (ENGINE_COMPARE(ELM_SOFTWARE_16_SDL)) + else if ((disp) && (!strcmp(disp, "mac"))) { - tmp_sd.ee = ecore_evas_sdl16_new(NULL, 0, 0, 0, 0, 0, 1); - FALLBACK_TRY("Software-16-SDL"); - if (!tmp_sd.ee) - { - tmp_sd.ee = ecore_evas_software_x11_new(NULL, 0, 0, 0, 1, 1); - FALLBACK_STORE("Software X11"); - if (!tmp_sd.ee) - { - tmp_sd.ee = ecore_evas_fb_new(NULL, 0, 1, 1); - FALLBACK_STORE("Software FB"); - } - } + enginelist[0] = ENGINE_GET(); + enginelist[1] = ELM_OPENGL_COCOA; + enginelist[2] = NULL; } - else if (ENGINE_COMPARE(ELM_OPENGL_SDL)) + else if ((disp) && (!strcmp(disp, "ews"))) { - tmp_sd.ee = ecore_evas_gl_sdl_new(NULL, 1, 1, 0, 0); - FALLBACK_TRY("OpenGL SDL"); - if (!tmp_sd.ee) - { - tmp_sd.ee = ecore_evas_software_x11_new(NULL, 0, 0, 0, 1, 1); - FALLBACK_STORE("Software X11"); - if (!tmp_sd.ee) - { - tmp_sd.ee = ecore_evas_fb_new(NULL, 0, 1, 1); - FALLBACK_STORE("Software FB"); - } - } + enginelist[0] = ENGINE_GET(); + enginelist[1] = ELM_EWS; + enginelist[2] = NULL; } - else if (ENGINE_COMPARE(ELM_OPENGL_COCOA)) + else if ((disp) && (!strcmp(disp, "fb"))) { - tmp_sd.ee = ecore_evas_cocoa_new(NULL, 1, 1, 0, 0); - FALLBACK_TRY("OpenGL Cocoa"); + enginelist[0] = ENGINE_GET(); + enginelist[1] = ELM_SOFTWARE_FB; + enginelist[2] = NULL; } - else if (ENGINE_COMPARE(ELM_BUFFER)) + else if ((disp) && (!strcmp(disp, "buffer"))) { - tmp_sd.ee = ecore_evas_buffer_new(1, 1); + enginelist[0] = ENGINE_GET(); + enginelist[1] = ELM_BUFFER; + enginelist[2] = NULL; } - else if (ENGINE_COMPARE(ELM_EWS)) + else if ((disp) && (!strcmp(disp, "ps3"))) { - tmp_sd.ee = ecore_evas_ews_new(0, 0, 1, 1); + enginelist[0] = ENGINE_GET(); + enginelist[1] = ELM_SOFTWARE_PSL1GHT; + enginelist[2] = NULL; } - else if (ENGINE_COMPARE(ELM_WAYLAND_SHM)) + else if ((disp) && (!strcmp(disp, "shot"))) { - tmp_sd.ee = ecore_evas_wayland_shm_new(NULL, 0, 0, 0, 1, 1, 0); + enginelist[0] = ENGINE_GET(); + enginelist[1] = NULL; } - else if (ENGINE_COMPARE(ELM_WAYLAND_EGL)) + else { - tmp_sd.ee = ecore_evas_wayland_egl_new(NULL, 0, 0, 0, 1, 1, 0); + enginelist[0] = ENGINE_GET(); + enginelist[1] = ELM_SOFTWARE_X11; + enginelist[2] = ELM_WAYLAND_SHM; + enginelist[3] = ELM_SOFTWARE_FB; + enginelist[4] = ELM_OPENGL_COCOA; + enginelist[5] = ELM_SOFTWARE_SDL; + enginelist[6] = NULL; } - else if (!strncmp(ENGINE_GET(), "shot:", 5)) + for (i = 0; i < 30; i++) { - tmp_sd.ee = ecore_evas_buffer_new(1, 1); - ecore_evas_manual_render_set(tmp_sd.ee, EINA_TRUE); - tmp_sd.shot.info = eina_stringshare_add - (ENGINE_GET() + 5); + if ((i > 0) && (!enginelist[i])) break; + if (!strcmp(enginelist[i], ELM_SOFTWARE_X11)) + tmp_sd.ee = ecore_evas_software_x11_new(NULL, 0, 0, 0, 1, 1); + else if (!strcmp(enginelist[i], ELM_OPENGL_X11)) + { + int opt[10], opt_i = 0; + + if (_elm_config->vsync) + { + opt[opt_i++] = ECORE_EVAS_GL_X11_OPT_VSYNC; + opt[opt_i++] = 1; + opt[opt_i++] = 0; + } + if (opt_i > 0) + tmp_sd.ee = ecore_evas_gl_x11_options_new(NULL, 0, 0, 0, 1, 1, opt); + else + tmp_sd.ee = ecore_evas_gl_x11_new(NULL, 0, 0, 0, 1, 1); + } + else if (!strcmp(enginelist[i], ELM_WAYLAND_SHM)) + tmp_sd.ee = ecore_evas_wayland_shm_new(NULL, 0, 0, 0, 1, 1, 0); + else if (!strcmp(enginelist[i], ELM_WAYLAND_EGL)) + tmp_sd.ee = ecore_evas_wayland_egl_new(NULL, 0, 0, 0, 1, 1, 0); + else if (!strcmp(enginelist[i], ELM_SOFTWARE_WIN32)) + tmp_sd.ee = ecore_evas_software_gdi_new(NULL, 0, 0, 1, 1); + else if (!strcmp(enginelist[i], ELM_SOFTWARE_SDL)) + tmp_sd.ee = ecore_evas_sdl_new(NULL, 0, 0, 0, 0, 0, 1); + else if (!strcmp(enginelist[i], ELM_OPENGL_SDL)) + tmp_sd.ee = ecore_evas_gl_sdl_new(NULL, 1, 1, 0, 0); + else if (!strcmp(enginelist[i], ELM_OPENGL_COCOA)) + tmp_sd.ee = ecore_evas_cocoa_new(NULL, 1, 1, 0, 0); + else if (!strcmp(enginelist[i], ELM_EWS)) + tmp_sd.ee = ecore_evas_ews_new(0, 0, 1, 1); + else if (!strcmp(enginelist[i], ELM_SOFTWARE_FB)) + tmp_sd.ee = ecore_evas_fb_new(NULL, 0, 1, 1); + else if (!strcmp(enginelist[i], ELM_BUFFER)) + tmp_sd.ee = ecore_evas_buffer_new(1, 1); + else if (!strcmp(enginelist[i], ELM_SOFTWARE_PSL1GHT)) + tmp_sd.ee = ecore_evas_psl1ght_new(NULL, 1, 1); + else if (!strncmp(enginelist[i], "shot:", 5)) + { + tmp_sd.ee = ecore_evas_buffer_new(1, 1); + ecore_evas_manual_render_set(tmp_sd.ee, EINA_TRUE); + tmp_sd.shot.info = eina_stringshare_add(ENGINE_GET() + 5); + } + engine = enginelist[i]; + if (tmp_sd.ee) break; } -#undef FALLBACK_TRY break; } @@ -3069,8 +3047,6 @@ _win_constructor(Eo *obj, void *_pd, va_list *list) #ifdef HAVE_ELEMENTARY_X else if (ENGINE_COMPARE(ELM_SOFTWARE_X11) || - ENGINE_COMPARE(ELM_SOFTWARE_16_X11) || - ENGINE_COMPARE(ELM_SOFTWARE_8_X11) || ENGINE_COMPARE(ELM_OPENGL_X11)) { sd->x.client_message_handler = ecore_event_handler_add @@ -3079,7 +3055,6 @@ _win_constructor(Eo *obj, void *_pd, va_list *list) (ECORE_X_EVENT_WINDOW_PROPERTY, _elm_win_property_change, obj); } #endif - else if (!strncmp(ENGINE_GET(), "shot:", 5)) _shot_init(sd); @@ -3181,14 +3156,13 @@ _win_constructor(Eo *obj, void *_pd, va_list *list) _elm_win_list = eina_list_append(_elm_win_list, obj); _elm_win_count++; - if (((fallback) && (!strcmp(fallback, "Software FB"))) || - ((!fallback) && (ENGINE_COMPARE(ELM_SOFTWARE_FB)))) + if (!strcmp(engine, ELM_SOFTWARE_FB)) { TRAP(sd, fullscreen_set, 1); } else if ((type != ELM_WIN_INLINED_IMAGE) && - (ENGINE_COMPARE(ELM_WAYLAND_SHM) || - ENGINE_COMPARE(ELM_WAYLAND_EGL))) + (!strcmp(engine, ELM_WAYLAND_SHM) || + (!strcmp(engine, ELM_WAYLAND_EGL)))) _elm_win_frame_add(sd, "default"); if (_elm_config->focus_highlight_enable) @@ -3209,8 +3183,7 @@ _win_constructor(Eo *obj, void *_pd, va_list *list) if ((_elm_config->softcursor_mode == ELM_SOFTCURSOR_MODE_ON) || ((_elm_config->softcursor_mode == ELM_SOFTCURSOR_MODE_AUTO) && - (((fallback) && (!strcmp(fallback, "Software FB"))) || - ((!fallback) && (ENGINE_COMPARE(ELM_SOFTWARE_FB)))))) + (!strcmp(engine, ELM_SOFTWARE_FB)))) { Evas_Object *o; Evas_Coord mw = 1, mh = 1, hx = 0, hy = 0; --
