From 30939bf353e8065ba9454eaa9f89d73311e2725f Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Thu, 7 Jan 2010 05:29:06 +0000 Subject: [PATCH] clean up engines - put idle entere handlign in core. same with lists. quyartz looks broken to me. sdl looks like it could be much more complete - like multiple sdl windows/instances. anyway - allow rendering to be manual. SVN revision: 44938 --- legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h | 4 + legacy/ecore/src/lib/ecore_evas/ecore_evas.c | 168 ++++++++++++++---- .../src/lib/ecore_evas/ecore_evas_buffer.c | 26 ++- .../src/lib/ecore_evas/ecore_evas_directfb.c | 45 +---- .../ecore/src/lib/ecore_evas/ecore_evas_fb.c | 100 +++++------ .../src/lib/ecore_evas/ecore_evas_private.h | 5 + .../src/lib/ecore_evas/ecore_evas_quartz.c | 8 +- .../ecore/src/lib/ecore_evas/ecore_evas_sdl.c | 107 +++++------ .../src/lib/ecore_evas/ecore_evas_win32.c | 56 ++---- .../src/lib/ecore_evas/ecore_evas_wince.c | 53 ++---- .../ecore/src/lib/ecore_evas/ecore_evas_x.c | 57 ++---- 11 files changed, 290 insertions(+), 339 deletions(-) diff --git a/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h b/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h index 5222f0952e..be48537dcc 100644 --- a/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h +++ b/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h @@ -321,6 +321,10 @@ EAPI void ecore_evas_sticky_set(Ecore_Evas *ee, int sticky); EAPI int ecore_evas_sticky_get(const Ecore_Evas *ee); EAPI void ecore_evas_ignore_events_set(Ecore_Evas *ee, int ignore); EAPI int ecore_evas_ignore_events_get(const Ecore_Evas *ee); +EAPI void ecore_evas_manual_render_set(Ecore_Evas *ee, int manual_render); +EAPI int ecore_evas_manual_render_get(const Ecore_Evas *ee); +EAPI void ecore_evas_manual_render(Ecore_Evas *ee); + EAPI Ecore_Window ecore_evas_window_get(const Ecore_Evas *ee); diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas.c index ca292ad819..3019550d55 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas.c @@ -22,6 +22,40 @@ static int _ecore_evas_init_count = 0; static Ecore_Fd_Handler *_ecore_evas_async_events_fd = NULL; static int _ecore_evas_async_events_fd_handler(void *data, Ecore_Fd_Handler *fd_handler); +static Ecore_Idle_Enterer *ecore_evas_idle_enterer = NULL; +static Ecore_Evas *ecore_evases = NULL; +static int _ecore_evas_fps_debug = 0; + +static int +_ecore_evas_idle_enter(void *data __UNUSED__) +{ + Ecore_Evas *ee; + double t1 = 0.0; + double t2 = 0.0; + int rend = 0; + + if (!ecore_evases) return 1; + if (_ecore_evas_fps_debug) + { + t1 = ecore_time_get(); + } + EINA_INLIST_FOREACH(ecore_evases, ee) + { + if (!ee->manual_render) + { + if (ee->engine.func->fn_render) + rend |= ee->engine.func->fn_render(ee); + } + } + if (_ecore_evas_fps_debug) + { + t2 = ecore_time_get(); + if (rend) + _ecore_evas_fps_debug_rendertime_add(t2 - t1); + } + return 1; +} + /** * Query if a particular renginering engine target has support * @param engine The engine to check support for @@ -178,6 +212,12 @@ ecore_evas_init(void) ECORE_FD_READ, _ecore_evas_async_events_fd_handler, NULL, NULL, NULL); + + ecore_evas_idle_enterer = + ecore_idle_enterer_add(_ecore_evas_idle_enter, NULL); + if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1; + if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init(); + return _ecore_evas_init_count; shutdown_ecore: @@ -197,6 +237,12 @@ ecore_evas_init(void) EAPI int ecore_evas_shutdown(void) { + while (ecore_evases) _ecore_evas_free(ecore_evases); + + if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown(); + ecore_idle_enterer_del(ecore_evas_idle_enterer); + ecore_evas_idle_enterer = NULL; + if (--_ecore_evas_init_count != 0) return _ecore_evas_init_count; @@ -2284,12 +2330,12 @@ EAPI void ecore_evas_withdrawn_set(Ecore_Evas *ee, int withdrawn) { if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS)) - { - ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, - "ecore_evas_withdrawn_set"); - return; - } - + { + ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, + "ecore_evas_withdrawn_set"); + return; + } + IFC(ee, fn_withdrawn_set) (ee, withdrawn); IFE; } @@ -2304,12 +2350,12 @@ EAPI int ecore_evas_withdrawn_get(const Ecore_Evas *ee) { if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS)) - { - ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, - "ecore_evas_withdrawn_get"); - return 0; - } else - return ee->prop.withdrawn ? 1:0; + { + ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, + "ecore_evas_withdrawn_get"); + return 0; + } else + return ee->prop.withdrawn ? 1:0; } /** @@ -2323,12 +2369,12 @@ EAPI void ecore_evas_sticky_set(Ecore_Evas *ee, int sticky) { if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS)) - { - ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, - "ecore_evas_sticky_set"); - return; - } - + { + ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, + "ecore_evas_sticky_set"); + return; + } + IFC(ee, fn_sticky_set) (ee, sticky); IFE; } @@ -2344,12 +2390,12 @@ EAPI int ecore_evas_sticky_get(const Ecore_Evas *ee) { if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS)) - { - ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, - "ecore_evas_sticky_get"); - return 0; - } else - return ee->prop.sticky ? 1:0; + { + ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, + "ecore_evas_sticky_get"); + return 0; + } else + return ee->prop.sticky ? 1:0; } /** @@ -2363,12 +2409,12 @@ EAPI void ecore_evas_ignore_events_set(Ecore_Evas *ee, int ignore) { if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS)) - { - ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, - "ecore_evas_ignore_events_set"); - return; - } - + { + ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, + "ecore_evas_ignore_events_set"); + return; + } + IFC(ee, fn_ignore_events_set) (ee, ignore); IFE; } @@ -2384,12 +2430,49 @@ EAPI int ecore_evas_ignore_events_get(const Ecore_Evas *ee) { if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS)) - { - ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, - "ecore_evas_ignore_events_get"); - return 0; - } else - return ee->ignore_events ? 1 : 0; + { + ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, + "ecore_evas_ignore_events_get"); + return 0; + } + return ee->ignore_events ? 1 : 0; +} + +EAPI void +ecore_evas_manual_render_set(Ecore_Evas *ee, int manual_render) +{ + if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS)) + { + ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, + "ecore_evas_manual_render_set"); + return; + } + ee->manual_render = manual_render; +} + +EAPI int +ecore_evas_manual_render_get(const Ecore_Evas *ee) +{ + if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS)) + { + ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, + "ecore_evas_manual_render_get"); + return 0; + } + return ee->manual_render ? 1 : 0; +} + +EAPI void +ecore_evas_manual_render(Ecore_Evas *ee) +{ + if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS)) + { + ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, + "ecore_evas_manual_render"); + return; + } + if (ee->engine.func->fn_render) + ee->engine.func->fn_render(ee); } EAPI Ecore_Window @@ -2491,6 +2574,14 @@ _ecore_evas_fps_debug_rendertime_add(double t) } } +void +_ecore_evas_register(Ecore_Evas *ee) +{ + ee->registered = 1; + ecore_evases = (Ecore_Evas *)eina_inlist_prepend + (EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee)); +} + void _ecore_evas_free(Ecore_Evas *ee) { @@ -2518,6 +2609,11 @@ _ecore_evas_free(Ecore_Evas *ee) if (ee->engine.idle_flush_timer) ecore_timer_del(ee->engine.idle_flush_timer); if (ee->engine.func->fn_free) ee->engine.func->fn_free(ee); + if (ee->registered) + { + ecore_evases = (Ecore_Evas *)eina_inlist_remove + (EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee)); + } free(ee); } diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_buffer.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_buffer.c index 526160970e..33ab5b1602 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_buffer.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_buffer.c @@ -12,17 +12,11 @@ #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER static int _ecore_evas_init_count = 0; -static int _ecore_evas_fps_debug = 0; - -static Ecore_Evas *ecore_evases = NULL; - static int _ecore_evas_buffer_init(void) { _ecore_evas_init_count++; if (_ecore_evas_init_count > 1) return _ecore_evas_init_count; - if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1; - if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init(); return _ecore_evas_init_count; } @@ -39,8 +33,6 @@ _ecore_evas_buffer_free(Ecore_Evas *ee) } else { - ecore_evases = (Ecore_Evas *) eina_inlist_remove(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee)); - free(ee->engine.buffer.pixels); } _ecore_evas_buffer_shutdown(); @@ -91,11 +83,6 @@ _ecore_evas_buffer_shutdown(void) _ecore_evas_init_count--; if (_ecore_evas_init_count == 0) { - while (ecore_evases) - { - _ecore_evas_free(ecore_evases); - } - if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown(); } if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0; return _ecore_evas_init_count; @@ -372,7 +359,7 @@ _ecore_evas_buffer_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UN if (ee->func.fn_hide) ee->func.fn_hide(ee); } -static const Ecore_Evas_Engine_Func _ecore_buffer_engine_func = +static Ecore_Evas_Engine_Func _ecore_buffer_engine_func = { _ecore_evas_buffer_free, NULL, @@ -418,7 +405,9 @@ static const Ecore_Evas_Engine_Func _ecore_buffer_engine_func = NULL, NULL, NULL, - NULL + NULL, + + NULL // render }; #endif @@ -499,7 +488,9 @@ ecore_evas_buffer_new(int w, int h) evas_event_feed_mouse_in(ee->evas, 0, NULL); - ecore_evases = (Ecore_Evas *) eina_inlist_prepend(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee)); + ee->engine.func->fn_render = _ecore_evas_buffer_render; + _ecore_evas_register(ee); + return ee; #else return NULL; @@ -636,6 +627,9 @@ ecore_evas_object_image_new(Ecore_Evas *ee_target) evas_key_lock_add(ee->evas, "Scroll_Lock"); ee_target->sub_ecore_evas = eina_list_append(ee_target->sub_ecore_evas, ee); + + ee->engine.func->fn_render = _ecore_evas_buffer_render; + return o; #else return NULL; diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_directfb.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_directfb.c index 2ae6e3e251..e301d41974 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_directfb.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_directfb.c @@ -19,14 +19,10 @@ #ifdef BUILD_ECORE_EVAS_DIRECTFB static int _ecore_evas_init_count = 0; -static int _ecore_evas_fps_debug = 0; static Ecore_Event_Handler *ecore_evas_event_handlers[13]; -static Ecore_Evas *ecore_evases = NULL; static Eina_Hash *ecore_evases_hash = NULL; -static Ecore_Idle_Enterer *ecore_evas_directfb_idle_enterer = NULL; - static void _ecore_evas_directfb_render(Ecore_Evas *ee) { @@ -51,28 +47,6 @@ _ecore_evas_directfb_render(Ecore_Evas *ee) if (ee->func.fn_post_render) ee->func.fn_post_render(ee); } -static int -_ecore_evas_directfb_idle_enter(void *data __UNUSED__) -{ - Ecore_Evas *ee; - double t1 = 0.0; - double t2 = 0.0; - - if (!ecore_evases) return 1; - if (_ecore_evas_fps_debug) - { - t1 = ecore_time_get(); - } - EINA_INLIST_FOREACH(ecore_evases, ee) - _ecore_evas_directfb_render(ee); - if (_ecore_evas_fps_debug) - { - t2 = ecore_time_get(); - _ecore_evas_fps_debug_rendertime_add(t2 - t1); - } - return 1; -} - static char * _ecore_evas_directfb_winid_str_get(Ecore_X_Window win) { @@ -258,12 +232,8 @@ _ecore_evas_directfb_shutdown(void) { int i; - while (ecore_evases) _ecore_evas_free(ecore_evases); for (i = 0; i < 8; i++) ecore_event_handler_del(ecore_evas_event_handlers[i]); - ecore_idle_enterer_del(ecore_evas_directfb_idle_enterer); - ecore_evas_directfb_idle_enterer = NULL; - if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown(); } if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0; return _ecore_evas_init_count; @@ -278,9 +248,6 @@ _ecore_evas_directfb_init(void) { _ecore_evas_init_count++; if (_ecore_evas_init_count > 1) return _ecore_evas_init_count; - if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1; - ecore_evas_directfb_idle_enterer = ecore_idle_enterer_add(_ecore_evas_directfb_idle_enter, NULL); - if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init(); ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_KEY_DOWN, _ecore_evas_directfb_event_key_down, NULL); ecore_evas_event_handlers[1] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_KEY_UP, _ecore_evas_directfb_event_key_up, NULL); @@ -307,7 +274,6 @@ _ecore_evas_directfb_free(Ecore_Evas *ee) { eina_hash_del(ecore_evases_hash, _ecore_evas_directfb_winid_str_get(ee->engine.directfb.window->id), ee); ecore_directfb_window_free(ee->engine.directfb.window); - ecore_evases = (Ecore_Evas *) eina_inlist_remove(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee)); _ecore_evas_directfb_shutdown(); ecore_directfb_shutdown(); } @@ -469,7 +435,7 @@ _ecore_evas_directfb_window_get(const Ecore_Evas *ee) #endif #ifdef BUILD_ECORE_EVAS_DIRECTFB -static const Ecore_Evas_Engine_Func _ecore_directfb_engine_func = +static Ecore_Evas_Engine_Func _ecore_directfb_engine_func = { _ecore_evas_directfb_free, /* free an ecore_evas */ NULL, /* cb resize */ @@ -515,7 +481,9 @@ static const Ecore_Evas_Engine_Func _ecore_directfb_engine_func = NULL, /* withdrawn */ NULL, /* sticky */ NULL, /* ignore events */ - NULL /* alpha */ + NULL, /* alpha */ + + NULL // render }; #endif @@ -572,7 +540,10 @@ ecore_evas_directfb_new(const char *disp_name, int windowed, int x, int y, int w einfo->info.surface = window->surface; evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); } - ecore_evases = (Ecore_Evas *) eina_inlist_prepend(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee)); + + ee->engine.func->fn_render = _ecore_evas_directfb_render; + _ecore_evas_register(ee); + if (!ecore_evases_hash) ecore_evases_hash = eina_hash_string_superfast_new(NULL); eina_hash_add(ecore_evases_hash, _ecore_evas_directfb_winid_str_get(ee->engine.directfb.window->id), ee); diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c index cafc7d6745..9758560890 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c @@ -22,12 +22,9 @@ #ifdef BUILD_ECORE_EVAS_FB static int _ecore_evas_init_count = 0; -static int _ecore_evas_fps_debug = 0; static char *ecore_evas_default_display = "0"; static Eina_List *ecore_evas_input_devices = NULL; -static Ecore_Evas *ecore_evases = NULL; static Ecore_Event_Handler *ecore_evas_event_handlers[6] = {NULL, NULL, NULL, NULL, NULL, NULL}; -static Ecore_Idle_Enterer *ecore_evas_idle_enterer = NULL; static void _ecore_evas_mouse_move_process_fb(Ecore_Evas *ee, int x, int y, unsigned int timestamp) @@ -67,10 +64,12 @@ _ecore_evas_mouse_move_process_fb(Ecore_Evas *ee, int x, int y, unsigned int tim evas_event_feed_mouse_move(ee->evas, y, (fbw - ee->w) + ee->w - x - 1, timestamp, NULL); } +static Ecore_Evas *fb_ee = NULL; + static Ecore_Evas * _ecore_evas_fb_match(void) { - return ecore_evases; + return fb_ee; } static void @@ -80,8 +79,7 @@ _ecore_evas_fb_lose(void *data __UNUSED__) Eina_List *ll; Ecore_Fb_Input_Device *dev; - EINA_INLIST_FOREACH(ecore_evases, ee) - ee->visible = 0; + if (fb_ee) fb_ee->visible = 0; EINA_LIST_FOREACH(ecore_evas_input_devices, ll, dev) ecore_fb_input_device_listen(dev, 0); @@ -94,8 +92,10 @@ _ecore_evas_fb_gain(void *data __UNUSED__) Eina_List *ll; Ecore_Fb_Input_Device *dev; - EINA_INLIST_FOREACH(ecore_evases,ee) + if (fb_ee) { + ee = fb_ee; + ee->visible = 1; if ((ee->rotation == 90) || (ee->rotation == 270)) evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w); @@ -191,53 +191,39 @@ _ecore_evas_event_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void * } static int -_ecore_evas_idle_enter(void *data __UNUSED__) +_ecore_evas_fb_render(Ecore_Evas *ee) { - Ecore_Evas *ee; - double t1 = 0.0; - double t2 = 0.0; - - if (!ecore_evases) return 1; - if (_ecore_evas_fps_debug) + int rend = 0; + + if (ee->visible) { - t1 = ecore_time_get(); - } - EINA_INLIST_FOREACH(ecore_evases, ee) - { - if (ee->visible) - { - Eina_List *updates; - + Eina_List *updates; + #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER - Eina_List *ll; - Ecore_Evas *ee2; + Eina_List *ll; + Ecore_Evas *ee2; #endif - if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee); + if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee); #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER - EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2) - { - if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2); - _ecore_evas_buffer_render(ee2); - if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2); - } + EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2) + { + if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2); + _ecore_evas_buffer_render(ee2); + if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2); + } #endif - updates = evas_render_updates(ee->evas); - if (updates) - { - evas_render_updates_free(updates); - _ecore_evas_idle_timeout_update(ee); - } - if (ee->func.fn_post_render) ee->func.fn_post_render(ee); - } - else - evas_norender(ee->evas); + updates = evas_render_updates(ee->evas); + if (updates) + { + evas_render_updates_free(updates); + _ecore_evas_idle_timeout_update(ee); + rend = 1; + } + if (ee->func.fn_post_render) ee->func.fn_post_render(ee); } - if (_ecore_evas_fps_debug) - { - t2 = ecore_time_get(); - _ecore_evas_fps_debug_rendertime_add(t2 - t1); - } - return 1; + else + evas_norender(ee->evas); + return rend; } static int @@ -254,9 +240,6 @@ _ecore_evas_fb_init(int w, int h) _ecore_evas_init_count++; if (_ecore_evas_init_count > 1) return _ecore_evas_init_count; - if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1; - ecore_evas_idle_enterer = ecore_idle_enterer_add(_ecore_evas_idle_enter, NULL); - if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init(); /* register all input devices */ input_dir = opendir("/dev/input/"); if (!input_dir) return _ecore_evas_init_count; @@ -322,7 +305,7 @@ _ecore_evas_fb_init(int w, int h) static void _ecore_evas_fb_free(Ecore_Evas *ee) { - ecore_evases = (Ecore_Evas *) eina_inlist_remove(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee)); + if (fb_ee == ee) fb_ee = NULL; _ecore_evas_fb_shutdown(); ecore_fb_shutdown(); } @@ -521,19 +504,15 @@ _ecore_evas_fb_shutdown(void) { int i; - while (ecore_evases) _ecore_evas_free(ecore_evases); for (i = 0; i < 5; i++) ecore_event_handler_del(ecore_evas_event_handlers[i]); - ecore_idle_enterer_del(ecore_evas_idle_enterer); - ecore_evas_idle_enterer = NULL; - if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown(); ecore_fb_ts_shutdown(); } if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0; return _ecore_evas_init_count; } -static const Ecore_Evas_Engine_Func _ecore_fb_engine_func = +static Ecore_Evas_Engine_Func _ecore_fb_engine_func = { _ecore_evas_fb_free, NULL, @@ -579,7 +558,9 @@ static const Ecore_Evas_Engine_Func _ecore_fb_engine_func = NULL, NULL, NULL, - NULL + NULL, + + NULL // render }; #endif @@ -673,7 +654,10 @@ ecore_evas_fb_new(const char *disp_name, int rotation, int w, int h) evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL); - ecore_evases = (Ecore_Evas *) eina_inlist_prepend(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee)); + ee->engine.func->fn_render = _ecore_evas_buffer_render; + _ecore_evas_register(ee); + fb_ee = ee; + return ee; } #else diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h b/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h index d3c9b38d26..0bbf36f313 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h @@ -183,6 +183,8 @@ struct _Ecore_Evas_Engine_Func void (*fn_sticky_set) (Ecore_Evas *ee, int sticky); void (*fn_ignore_events_set) (Ecore_Evas *ee, int ignore); void (*fn_alpha_set) (Ecore_Evas *ee, int alpha); + + int (*fn_render) (Ecore_Evas *ee); }; struct _Ecore_Evas_Engine @@ -331,6 +333,8 @@ struct _Ecore_Evas Eina_List *sub_ecore_evas; unsigned char ignore_events : 1; + unsigned char manual_render : 1; + unsigned char registered : 1; }; #ifdef BUILD_ECORE_EVAS_X11 @@ -356,6 +360,7 @@ int _ecore_evas_wince_shutdown(void); void _ecore_evas_fps_debug_init(void); void _ecore_evas_fps_debug_shutdown(void); void _ecore_evas_fps_debug_rendertime_add(double t); +void _ecore_evas_register(Ecore_Evas *ee); void _ecore_evas_free(Ecore_Evas *ee); void _ecore_evas_idle_timeout_update(Ecore_Evas *ee); void _ecore_evas_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp); diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_quartz.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_quartz.c index 0b29f752f8..dcc43ebc59 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_quartz.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_quartz.c @@ -21,6 +21,8 @@ #include "Ecore_Quartz.h" #include "Evas_Engine_Quartz.h" +// FIXME: this engine has lots of problems. only 1 window at a time, drawRect looks wrong, doesnt handle resizes and more + static int _ecore_evas_init_count = 0; static Ecore_Evas *ecore_evases = NULL; static Ecore_Event_Handler *ecore_evas_event_handlers[4] = { @@ -292,7 +294,7 @@ _ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int h evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee); } -static const Ecore_Evas_Engine_Func _ecore_quartz_engine_func = +static Ecore_Evas_Engine_Func _ecore_quartz_engine_func = { _ecore_evas_quartz_free, NULL, @@ -336,7 +338,9 @@ static const Ecore_Evas_Engine_Func _ecore_quartz_engine_func = NULL, NULL, NULL, - NULL + NULL, + + NULL // render }; #endif diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_sdl.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_sdl.c index d16fe91952..19fedbfc25 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_sdl.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_sdl.c @@ -16,28 +16,26 @@ #include "ecore_evas_private.h" #include "Ecore_Evas.h" +// fixme: 1 sdl window only at a time? seems wrong + #ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL /* static char *ecore_evas_default_display = "0"; */ /* static Ecore_List *ecore_evas_input_devices = NULL; */ static int _ecore_evas_init_count = 0; -#ifndef _WIN32 -static int _ecore_evas_fps_debug = 0; -#endif /* _WIN32 */ -static Ecore_Evas *ecore_evases = NULL; + +static Ecore_Evas *sdl_ee = NULL; static Ecore_Event_Handler *ecore_evas_event_handlers[4] = { NULL, NULL, NULL, NULL }; -static Ecore_Idle_Enterer *ecore_evas_idle_enterer = NULL; -static Ecore_Poller *ecore_evas_event = NULL; static const char *ecore_evas_sdl_default = "EFL SDL"; static Ecore_Evas * _ecore_evas_sdl_match(void) { - return ecore_evases; + return sdl_ee; } static int @@ -99,7 +97,7 @@ _ecore_evas_sdl_event_video_expose(void *data __UNUSED__, int type __UNUSED__, v return 0; } -static void +static int _ecore_evas_render(Ecore_Evas *ee) { Eina_List *updates; @@ -110,63 +108,44 @@ _ecore_evas_render(Ecore_Evas *ee) evas_render_updates_free(updates); _ecore_evas_idle_timeout_update(ee); } + return (int)updates; } static int -_ecore_evas_idle_enter(void *data __UNUSED__) +ecore_evas_sdl_render(Ecore_Evas *ee) { - Ecore_Evas *ee; - double t1 = 0.0; - double t2 = 0.0; - - if (!ecore_evases) return 1; -#ifndef _WIN32 - if (_ecore_evas_fps_debug) - { - t1 = ecore_time_get(); - } -#endif /* _WIN32 */ - EINA_INLIST_FOREACH(ecore_evases, ee) - { + int rend = 0; + #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER - Eina_List *ll; - Ecore_Evas *ee2; - - EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2) - { - if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2); - _ecore_evas_buffer_render(ee2); - if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2); - } -#endif - - if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee); - - if (ee->prop.avoid_damage) _ecore_evas_render(ee); - else if ((ee->visible) || - ((ee->should_be_visible) && (ee->prop.fullscreen)) || - ((ee->should_be_visible) && (ee->prop.override))) - _ecore_evas_render(ee); - else - evas_norender(ee->evas); - - if (ee->func.fn_post_render) ee->func.fn_post_render(ee); - } -#ifndef _WIN32 - if (_ecore_evas_fps_debug) + Eina_List *ll; + Ecore_Evas *ee2; + + EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2) { - t2 = ecore_time_get(); - _ecore_evas_fps_debug_rendertime_add(t2 - t1); + if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2); + _ecore_evas_buffer_render(ee2); + if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2); } -#endif /* _WIN32 */ - return 1; +#endif + + if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee); + + if (ee->prop.avoid_damage) rend = _ecore_evas_render(ee); + else if ((ee->visible) || + ((ee->should_be_visible) && (ee->prop.fullscreen)) || + ((ee->should_be_visible) && (ee->prop.override))) + rend = _ecore_evas_render(ee); + else + evas_norender(ee->evas); + + if (ee->func.fn_post_render) ee->func.fn_post_render(ee); + return rend; } static int _ecore_evas_sdl_event(void *data __UNUSED__) { ecore_sdl_feed_events(); - return 1; } @@ -179,7 +158,10 @@ _ecore_evas_sdl_init(int w __UNUSED__, int h __UNUSED__) #ifndef _WIN32 if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1; #endif /* _WIN32 */ - ecore_evas_idle_enterer = ecore_idle_enterer_add(_ecore_evas_idle_enter, NULL); + // this is pretty bad: poller? and set poll time? pol time is meant to be + // adjustable for things like polling battery state, or amoutn of spare + // memory etc. + // ecore_evas_event = ecore_poller_add(ECORE_POLLER_CORE, 1, _ecore_evas_sdl_event, NULL); ecore_poller_poll_interval_set(ECORE_POLLER_CORE, 0.006); #ifndef _WIN32 @@ -204,13 +186,9 @@ _ecore_evas_sdl_shutdown(void) { int i; - while (ecore_evases) _ecore_evas_free(ecore_evases); - for (i = 0; i < sizeof (ecore_evas_event_handlers) / sizeof (Ecore_Event_Handler*); i++) ecore_event_handler_del(ecore_evas_event_handlers[i]); ecore_event_evas_shutdown(); - ecore_idle_enterer_del(ecore_evas_idle_enterer); - ecore_evas_idle_enterer = NULL; ecore_poller_del(ecore_evas_event); ecore_evas_event = NULL; #ifndef _WIN32 @@ -224,7 +202,8 @@ _ecore_evas_sdl_shutdown(void) static void _ecore_evas_sdl_free(Ecore_Evas *ee) { - ecore_evases = (Ecore_Evas *) eina_inlist_remove(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee)); + if (sdl_ee == ee) sdl_ee = NULL; + ecore_event_window_unregister(0); _ecore_evas_sdl_shutdown(); ecore_sdl_shutdown(); @@ -300,7 +279,7 @@ _ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int h evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee); } -static const Ecore_Evas_Engine_Func _ecore_sdl_engine_func = +static Ecore_Evas_Engine_Func _ecore_sdl_engine_func = { _ecore_evas_sdl_free, NULL, @@ -346,7 +325,9 @@ static const Ecore_Evas_Engine_Func _ecore_sdl_engine_func = NULL, NULL, NULL, - NULL + NULL, + + NULL // render }; static Ecore_Evas* @@ -423,7 +404,11 @@ _ecore_evas_internal_sdl_new(int rmethod, const char* name, int w, int h, int fu SDL_ShowCursor(SDL_DISABLE); - ecore_evases = (Ecore_Evas *) eina_inlist_prepend(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee)); + ee->engine.func->fn_render = _ecore_evas_sdl_render; + _ecore_evas_register(ee); + + sdl_ee = ee; + return ee; } #endif diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_win32.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_win32.c index bbf7db9fc5..0fb92e1899 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_win32.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_win32.c @@ -26,11 +26,8 @@ #define ECORE_EVAS_EVENT_COUNT 8 static int _ecore_evas_init_count = 0; -static int _ecore_evas_fps_debug = 0; static Ecore_Event_Handler *ecore_evas_event_handlers[ECORE_EVAS_EVENT_COUNT]; -static Ecore_Idle_Enterer *ecore_evas_idle_enterer = NULL; -static Ecore_Evas *ecore_evases = NULL; static int _ecore_evas_win32_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event); @@ -50,10 +47,11 @@ static int _ecore_evas_win32_event_window_delete_request(void *data __UNUSED__, /* Private functions */ -static void +static int _ecore_evas_win32_render(Ecore_Evas *ee) { - Eina_List *updates; + int rend = 0; + Eina_List *updates = NULL; #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER Eina_List *ll; Ecore_Evas *ee2; @@ -88,31 +86,9 @@ _ecore_evas_win32_render(Ecore_Evas *ee) } else evas_norender(ee->evas); + if (updates) rend = 1; if (ee->func.fn_post_render) ee->func.fn_post_render(ee); -} - -static int -_ecore_evas_win32_idle_enter(void *data __UNUSED__) -{ - Ecore_Evas *ee; - double t1 = 0.0; - double t2 = 0.0; - - if (!ecore_evases) return 1; - if (_ecore_evas_fps_debug) - { - t1 = ecore_time_get(); - } - EINA_INLIST_FOREACH(ecore_evases, ee) - _ecore_evas_win32_render(ee); - - /* ecore_x_flush(); */ - if (_ecore_evas_fps_debug) - { - t2 = ecore_time_get(); -/* _ecore_evas_fps_debug_rendertime_add(t2 - t1); */ - } - return 1; + return rend; } static int @@ -121,12 +97,7 @@ _ecore_evas_win32_init(void) _ecore_evas_init_count++; if (_ecore_evas_init_count > 1) return _ecore_evas_init_count; - - if (getenv("ECORE_EVAS_FPS_DEBUG")) - _ecore_evas_fps_debug = 1; - - ecore_evas_idle_enterer = ecore_idle_enterer_add(_ecore_evas_win32_idle_enter, NULL); - + ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_IN, _ecore_evas_win32_event_mouse_in, NULL); ecore_evas_event_handlers[1] = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_OUT, _ecore_evas_win32_event_mouse_out, NULL); ecore_evas_event_handlers[2] = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_DAMAGE, _ecore_evas_win32_event_window_damage, NULL); @@ -148,11 +119,8 @@ _ecore_evas_win32_shutdown(void) { int i; - while (ecore_evases) _ecore_evas_free(ecore_evases); for (i = 0; i < ECORE_EVAS_EVENT_COUNT; i++) ecore_event_handler_del(ecore_evas_event_handlers[i]); - ecore_idle_enterer_del(ecore_evas_idle_enterer); - ecore_evas_idle_enterer = NULL; ecore_event_evas_shutdown(); } @@ -401,7 +369,6 @@ _ecore_evas_win32_free(Ecore_Evas *ee) ecore_win32_window_free((struct _Ecore_Win32_Window *)ee->prop.window); ecore_event_window_unregister(ee->prop.window); - ecore_evases = (Ecore_Evas *) eina_inlist_remove(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee)); _ecore_evas_win32_shutdown(); ecore_win32_shutdown(); } @@ -835,7 +802,7 @@ _ecore_evas_win32_fullscreen_set(Ecore_Evas *ee, int on) } -static const Ecore_Evas_Engine_Func _ecore_win32_engine_func = +static Ecore_Evas_Engine_Func _ecore_win32_engine_func = { _ecore_evas_win32_free, NULL, @@ -881,7 +848,9 @@ static const Ecore_Evas_Engine_Func _ecore_win32_engine_func = NULL, /* _ecore_evas_x_withdrawn_set */ NULL, /* _ecore_evas_x_sticky_set */ NULL, /* _ecore_evas_x_ignore_events_set */ - NULL /* _ecore_evas_x_alpha_set */ + NULL, /* _ecore_evas_x_alpha_set */ + + NULL // render }; #endif /* BUILD_ECORE_EVAS_WIN32 */ @@ -1108,9 +1077,10 @@ _ecore_evas_win32_new_internal(int (*_ecore_evas_engine_init)(Ecore_Evas *ee), return NULL; } - ecore_evases = (Ecore_Evas *) eina_inlist_prepend(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee)); + ee->engine.func->fn_render = _ecore_evas_win32_render; + _ecore_evas_register(ee); ecore_event_window_register(ee->prop.window, ee, ee->evas, _ecore_evas_mouse_move_process); - + return ee; } diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_wince.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_wince.c index 0245e1d391..7e558f5609 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_wince.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_wince.c @@ -26,11 +26,8 @@ #define ECORE_EVAS_EVENT_COUNT 7 static int _ecore_evas_init_count = 0; -static int _ecore_evas_fps_debug = 0; static Ecore_Event_Handler *ecore_evas_event_handlers[ECORE_EVAS_EVENT_COUNT]; -static Ecore_Idle_Enterer *ecore_evas_idle_enterer = NULL; -static Ecore_Evas *ecore_evases = NULL; static int _ecore_evas_wince_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event); @@ -48,9 +45,10 @@ static int _ecore_evas_wince_event_window_delete_request(void *data __UNUSED__, /* Private functions */ -static void +static int _ecore_evas_wince_render(Ecore_Evas *ee) { + int rend = 0; Eina_List *updates = NULL; #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER Eina_List *ll; @@ -86,30 +84,9 @@ _ecore_evas_wince_render(Ecore_Evas *ee) } else evas_norender(ee->evas); + if (updates) rend = 1; if (ee->func.fn_post_render) ee->func.fn_post_render(ee); -} - -static int -_ecore_evas_wince_idle_enter(void *data __UNUSED__) -{ - Ecore_Evas *ee; - double t1 = 0.0; - double t2 = 0.0; - - if (!ecore_evases) return 1; - if (_ecore_evas_fps_debug) - { - t1 = ecore_time_get(); - } - EINA_INLIST_FOREACH(ecore_evases, ee) - _ecore_evas_wince_render(ee); - - if (_ecore_evas_fps_debug) - { - t2 = ecore_time_get(); - _ecore_evas_fps_debug_rendertime_add(t2 - t1); - } - return 1; + return rend; } static int @@ -118,12 +95,7 @@ _ecore_evas_wince_init(void) _ecore_evas_init_count++; if (_ecore_evas_init_count > 1) return _ecore_evas_init_count; - - if (getenv("ECORE_EVAS_FPS_DEBUG")) - _ecore_evas_fps_debug = 1; - - ecore_evas_idle_enterer = ecore_idle_enterer_add(_ecore_evas_wince_idle_enter, NULL); - + ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_WINCE_EVENT_MOUSE_IN, _ecore_evas_wince_event_mouse_in, NULL); ecore_evas_event_handlers[1] = ecore_event_handler_add(ECORE_WINCE_EVENT_MOUSE_OUT, _ecore_evas_wince_event_mouse_out, NULL); ecore_evas_event_handlers[2] = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_DAMAGE, _ecore_evas_wince_event_window_damage, NULL); @@ -132,8 +104,6 @@ _ecore_evas_wince_init(void) ecore_evas_event_handlers[5] = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_HIDE, _ecore_evas_wince_event_window_hide, NULL); ecore_evas_event_handlers[6] = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST, _ecore_evas_wince_event_window_delete_request, NULL); - if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init(); - ecore_event_evas_init(); return _ecore_evas_init_count; } @@ -146,12 +116,8 @@ _ecore_evas_wince_shutdown(void) { int i; - while (ecore_evases) _ecore_evas_free(ecore_evases); for (i = 0; i < ECORE_EVAS_EVENT_COUNT; i++) ecore_event_handler_del(ecore_evas_event_handlers[i]); - ecore_idle_enterer_del(ecore_evas_idle_enterer); - ecore_evas_idle_enterer = NULL; - if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown(); ecore_event_evas_shutdown(); } @@ -708,7 +674,7 @@ _ecore_evas_wince_fullscreen_set(Ecore_Evas *ee, int on) } } -static const Ecore_Evas_Engine_Func _ecore_wince_engine_func = +static Ecore_Evas_Engine_Func _ecore_wince_engine_func = { _ecore_evas_wince_free, NULL, @@ -754,7 +720,9 @@ static const Ecore_Evas_Engine_Func _ecore_wince_engine_func = NULL, /* _ecore_evas_x_withdrawn_set */ NULL, /* _ecore_evas_x_sticky_set */ NULL, /* _ecore_evas_x_ignore_events_set */ - NULL /* _ecore_evas_x_alpha_set */ + NULL, /* _ecore_evas_x_alpha_set */ + + NULL // render }; /* API */ @@ -848,7 +816,8 @@ ecore_evas_software_wince_new_internal(int backend, ecore_wince_window_resume_set((Ecore_WinCE_Window *)ee->prop.window, einfo->func.resume); } - ecore_evases = (Ecore_Evas *) eina_inlist_prepend(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee)); + ee->engine.func->fn_render = _ecore_evas_wince_render; + _ecore_evas_register(ee); ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process); return ee; diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c index 35d02e232c..3c7af16a52 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c @@ -21,11 +21,7 @@ #ifdef BUILD_ECORE_EVAS_X11 static int _ecore_evas_init_count = 0; -static int _ecore_evas_fps_debug = 0; - -static Ecore_Evas *ecore_evases = NULL; static Ecore_Event_Handler *ecore_evas_event_handlers[12]; -static Ecore_Idle_Enterer *ecore_evas_idle_enterer = NULL; #ifdef HAVE_ECORE_X_XCB static xcb_visualtype_t * @@ -997,38 +993,11 @@ _ecore_evas_x_layer_update(Ecore_Evas *ee) /* FIXME: Set gnome layer */ } -static int -_ecore_evas_x_idle_enter(void *data __UNUSED__) -{ - Ecore_Evas *ee; - double t1 = 0.0; - double t2 = 0.0; - int rend = 0; - - if (!ecore_evases) return 1; - if (_ecore_evas_fps_debug) - { - t1 = ecore_time_get(); - } - EINA_INLIST_FOREACH(ecore_evases, ee) - rend |= _ecore_evas_x_render(ee); - ecore_x_flush(); - if (_ecore_evas_fps_debug) - { - t2 = ecore_time_get(); - if (rend) - _ecore_evas_fps_debug_rendertime_add(t2 - t1); - } - return 1; -} - static int _ecore_evas_x_init(void) { _ecore_evas_init_count++; if (_ecore_evas_init_count > 1) return _ecore_evas_init_count; - if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1; - ecore_evas_idle_enterer = ecore_idle_enterer_add(_ecore_evas_x_idle_enter, NULL); ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_IN, _ecore_evas_x_event_mouse_in, NULL); ecore_evas_event_handlers[1] = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_OUT, _ecore_evas_x_event_mouse_out, NULL); ecore_evas_event_handlers[2] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, _ecore_evas_x_event_window_focus_in, NULL); @@ -1042,7 +1011,6 @@ _ecore_evas_x_init(void) ecore_evas_event_handlers[10] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, _ecore_evas_x_event_property_change, NULL); ecore_evas_event_handlers[11] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE, _ecore_evas_x_event_visibility_change, NULL); ecore_event_evas_init(); - if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init(); return _ecore_evas_init_count; } @@ -1058,7 +1026,7 @@ _ecore_evas_x_free(Ecore_Evas *ee) ee->engine.x.mask = 0; ee->engine.x.gc = 0; ee->engine.x.damages = NULL; - ecore_event_window_unregister(ee->prop.window); + ecore_event_window_unregister(ee->prop.window); while (ee->engine.x.win_extra) { Ecore_X_Window *winp; @@ -1068,7 +1036,6 @@ _ecore_evas_x_free(Ecore_Evas *ee) ecore_event_window_unregister(*winp); free(winp); } - ecore_evases = (Ecore_Evas *) eina_inlist_remove(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee)); _ecore_evas_x_shutdown(); ecore_x_shutdown(); } @@ -2179,19 +2146,15 @@ _ecore_evas_x_shutdown(void) { unsigned int i; - while (ecore_evases) _ecore_evas_free(ecore_evases); for (i = 0; i < sizeof(ecore_evas_event_handlers) / sizeof(Ecore_Event_Handler*); i++) ecore_event_handler_del(ecore_evas_event_handlers[i]); - ecore_idle_enterer_del(ecore_evas_idle_enterer); - ecore_evas_idle_enterer = NULL; - if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown(); ecore_event_evas_shutdown(); } if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0; return _ecore_evas_init_count; } -static const Ecore_Evas_Engine_Func _ecore_x_engine_func = +static Ecore_Evas_Engine_Func _ecore_x_engine_func = { _ecore_evas_x_free, NULL, @@ -2237,7 +2200,9 @@ static const Ecore_Evas_Engine_Func _ecore_x_engine_func = _ecore_evas_x_withdrawn_set, _ecore_evas_x_sticky_set, _ecore_evas_x_ignore_events_set, - _ecore_evas_x_alpha_set + _ecore_evas_x_alpha_set, + + NULL // render }; #endif /* BUILD_ECORE_EVAS_X11 */ @@ -2485,7 +2450,8 @@ ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent, 0 /* window_group */, 0 /* is_urgent */); - ecore_evases = (Ecore_Evas *) eina_inlist_prepend(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee)); + ee->engine.func->fn_render = _ecore_evas_x_render; + _ecore_evas_register(ee); ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process); return ee; } @@ -2674,7 +2640,8 @@ ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent, 0 /* window_group */, 0 /* is_urgent */); - ecore_evases = (Ecore_Evas *) eina_inlist_prepend(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee)); + ee->engine.func->fn_render = _ecore_evas_x_render; + _ecore_evas_register(ee); ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process); # endif /* HAVE_ECORE_X_XCB */ @@ -2922,7 +2889,8 @@ ecore_evas_xrender_x11_new(const char *disp_name, Ecore_X_Window parent, 0 /* window_group */, 0 /* is_urgent */); - ecore_evases = (Ecore_Evas *) eina_inlist_prepend(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee)); + ee->engine.func->fn_render = _ecore_evas_x_render; + _ecore_evas_register(ee); ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process); return ee; } @@ -3134,7 +3102,8 @@ ecore_evas_software_x11_16_new(const char *disp_name, Ecore_X_Window parent, 0 /* window_group */, 0 /* is_urgent */); - ecore_evases = (Ecore_Evas *) eina_inlist_prepend(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee)); + ee->engine.func->fn_render = _ecore_evas_x_render; + _ecore_evas_register(ee); ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process); return ee; }