From 1b6f59e2539ce62f191fc3a8120e1522d8828f78 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sat, 7 May 2005 13:50:38 +0000 Subject: [PATCH] properly virtualize ecore_evas setup SVN revision: 14644 --- src/bin/e_border.c | 24 +++++++++++++++++++----- src/bin/e_border.h | 1 + src/bin/e_canvas.c | 16 ++++++++++++++++ src/bin/e_canvas.h | 1 + src/bin/e_config.c | 7 +++++++ src/bin/e_config.h | 11 +++++++++++ src/bin/e_container.c | 19 +++++++++++++++---- src/bin/e_error.c | 29 +++++++++++++++++++---------- src/bin/e_init.c | 19 +++++++++++++++---- src/bin/e_main.c | 6 +++--- src/bin/e_menu.c | 22 +++++++++++++++++----- src/bin/e_popup.c | 28 +++++++++++++++++++++------- src/bin/e_theme.c | 17 +++++++++++++++++ 13 files changed, 162 insertions(+), 38 deletions(-) diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 198be28..1f543e9 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -142,8 +142,8 @@ printf("GRAV TO %i\n", grav); \ ecore_x_window_gravity_set(bd->bg_win, grav); \ ecore_x_window_gravity_set(bd->client.shell_win, grav); \ ecore_x_window_gravity_set(bd->client.win, grav); \ -ecore_x_window_gravity_set(ecore_evas_software_x11_subwindow_get(bd->bg_ecore_evas), grav); \ -ecore_x_window_pixel_gravity_set(ecore_evas_software_x11_subwindow_get(bd->bg_ecore_evas), grav); +ecore_x_window_gravity_set(bd->bg_subwin, grav); \ +ecore_x_window_pixel_gravity_set(bd->bg_subwin, grav); /* externally accessible functions */ int @@ -222,12 +222,26 @@ e_border_new(E_Container *con, Ecore_X_Window win, int first_map) bd->win = ecore_x_window_override_new(bd->container->win, 0, 0, bd->w, bd->h); ecore_x_window_shape_events_select(bd->win, 1); e_bindings_mouse_grab(E_BINDING_CONTEXT_BORDER, bd->win); - bd->bg_ecore_evas = ecore_evas_software_x11_new(NULL, bd->win, 0, 0, bd->w, bd->h); - ecore_evas_software_x11_direct_resize_set(bd->bg_ecore_evas, 1); + if (e_canvas_engine_decide(e_config->evas_engine_borders) == + E_EVAS_ENGINE_GL_X11) + { + bd->bg_ecore_evas = ecore_evas_gl_x11_new(NULL, bd->win, + 0, 0, bd->w, bd->h); + ecore_evas_gl_x11_direct_resize_set(bd->bg_ecore_evas, 1); + bd->bg_win = ecore_evas_gl_x11_window_get(bd->bg_ecore_evas); + bd->bg_subwin = ecore_evas_gl_x11_subwindow_get(bd->bg_ecore_evas); + } + else + { + bd->bg_ecore_evas = ecore_evas_software_x11_new(NULL, bd->win, + 0, 0, bd->w, bd->h); + ecore_evas_software_x11_direct_resize_set(bd->bg_ecore_evas, 1); + bd->bg_win = ecore_evas_software_x11_window_get(bd->bg_ecore_evas); + bd->bg_subwin = ecore_evas_software_x11_subwindow_get(bd->bg_ecore_evas); + } e_canvas_add(bd->bg_ecore_evas); bd->event_win = ecore_x_window_input_new(bd->win, 0, 0, bd->w, bd->h); bd->bg_evas = ecore_evas_get(bd->bg_ecore_evas); - bd->bg_win = ecore_evas_software_x11_window_get(bd->bg_ecore_evas); ecore_x_window_shape_events_select(bd->bg_win, 1); ecore_evas_name_class_set(bd->bg_ecore_evas, "E", "Frame_Window"); ecore_evas_title_set(bd->bg_ecore_evas, "Enlightenment Frame"); diff --git a/src/bin/e_border.h b/src/bin/e_border.h index cd69087..543827c 100644 --- a/src/bin/e_border.h +++ b/src/bin/e_border.h @@ -77,6 +77,7 @@ struct _E_Border Ecore_Evas *bg_ecore_evas; Evas *bg_evas; Ecore_X_Window bg_win; + Ecore_X_Window bg_subwin; Evas_Object *bg_object; Evas_Object *icon_object; Ecore_X_Window event_win; diff --git a/src/bin/e_canvas.c b/src/bin/e_canvas.c index 59574f9..c5f6797 100644 --- a/src/bin/e_canvas.c +++ b/src/bin/e_canvas.c @@ -29,6 +29,22 @@ e_canvas_del(Ecore_Evas *ee) _e_canvases = evas_list_remove(_e_canvases, ee); } +int +e_canvas_engine_decide(int engine) +{ + /* if use default - use it */ + if (engine == E_EVAS_ENGINE_DEFAULT) + engine = e_config->evas_engine_default; + /* if engine is gl - do we support it? */ + if (engine == E_EVAS_ENGINE_GL_X11) + { + /* if we dont - fall back to software x11 */ + if (!ecore_evas_engine_type_supported_get(ECORE_EVAS_ENGINE_GL_X11)) + engine = E_EVAS_ENGINE_SOFTWARE_X11; + } + return engine; +} + void e_canvas_recache(void) { diff --git a/src/bin/e_canvas.h b/src/bin/e_canvas.h index 50e2fc9..278875e 100644 --- a/src/bin/e_canvas.h +++ b/src/bin/e_canvas.h @@ -8,6 +8,7 @@ EAPI void e_canvas_add(Ecore_Evas *ee); EAPI void e_canvas_del(Ecore_Evas *ee); +EAPI int e_canvas_engine_decide(int engine); EAPI void e_canvas_recache(void); EAPI void e_canvas_cache_flush(void); EAPI void e_canvas_cache_reload(void); diff --git a/src/bin/e_config.c b/src/bin/e_config.c index bd7aeb9..976ea63 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -135,6 +135,13 @@ e_config_init(void) e_config->zone_desks_x_count = 4; e_config->zone_desks_y_count = 1; e_config->use_virtual_roots = 0; + e_config->evas_engine_default = E_EVAS_ENGINE_SOFTWARE_X11; + e_config->evas_engine_container = E_EVAS_ENGINE_DEFAULT; + e_config->evas_engine_init = E_EVAS_ENGINE_DEFAULT; + e_config->evas_engine_menus = E_EVAS_ENGINE_DEFAULT; + e_config->evas_engine_borders = E_EVAS_ENGINE_DEFAULT; + e_config->evas_engine_errors = E_EVAS_ENGINE_DEFAULT; + e_config->evas_engine_popups = E_EVAS_ENGINE_DEFAULT; e_config->language = strdup(""); { E_Config_Module *em; diff --git a/src/bin/e_config.h b/src/bin/e_config.h index 42a6e12..bf60ae5 100644 --- a/src/bin/e_config.h +++ b/src/bin/e_config.h @@ -42,6 +42,10 @@ typedef Eet_Data_Descriptor E_Config_DD; #ifndef E_CONFIG_H #define E_CONFIG_H +#define E_EVAS_ENGINE_DEFAULT 0 +#define E_EVAS_ENGINE_SOFTWARE_X11 1 +#define E_EVAS_ENGINE_GL_X11 2 + struct _E_Config { char *desktop_default_background; @@ -57,6 +61,13 @@ struct _E_Config int zone_desks_x_count; int zone_desks_y_count; int use_virtual_roots; + int evas_engine_default; + int evas_engine_container; + int evas_engine_init; + int evas_engine_menus; + int evas_engine_borders; + int evas_engine_errors; + int evas_engine_popups; char *language; Evas_List *modules; Evas_List *font_fallbacks; diff --git a/src/bin/e_container.c b/src/bin/e_container.c index 3553fd2..5541704 100644 --- a/src/bin/e_container.c +++ b/src/bin/e_container.c @@ -73,12 +73,23 @@ e_container_new(E_Manager *man) { con->win = con->manager->win; } - con->bg_ecore_evas = ecore_evas_software_x11_new(NULL, con->win, 0, 0, con->w, con->h); - ecore_evas_override_set(con->bg_ecore_evas, 1); - ecore_evas_software_x11_direct_resize_set(con->bg_ecore_evas, 1); + if (e_canvas_engine_decide(e_config->evas_engine_container) == + E_EVAS_ENGINE_GL_X11) + { + con->bg_ecore_evas = ecore_evas_gl_x11_new(NULL, con->win, 0, 0, con->w, con->h); + ecore_evas_gl_x11_direct_resize_set(con->bg_ecore_evas, 1); + ecore_evas_override_set(con->bg_ecore_evas, 1); + con->bg_win = ecore_evas_gl_x11_window_get(con->bg_ecore_evas); + } + else + { + con->bg_ecore_evas = ecore_evas_software_x11_new(NULL, con->win, 0, 0, con->w, con->h); + ecore_evas_software_x11_direct_resize_set(con->bg_ecore_evas, 1); + ecore_evas_override_set(con->bg_ecore_evas, 1); + con->bg_win = ecore_evas_software_x11_window_get(con->bg_ecore_evas); + } e_canvas_add(con->bg_ecore_evas); con->bg_evas = ecore_evas_get(con->bg_ecore_evas); - con->bg_win = ecore_evas_software_x11_window_get(con->bg_ecore_evas); ecore_evas_name_class_set(con->bg_ecore_evas, "E", "Background_Window"); ecore_evas_title_set(con->bg_ecore_evas, "Enlightenment Background"); ecore_evas_avoid_damage_set(con->bg_ecore_evas, 1); diff --git a/src/bin/e_error.c b/src/bin/e_error.c index 51d026d..d4f7b9a 100644 --- a/src/bin/e_error.c +++ b/src/bin/e_error.c @@ -60,15 +60,30 @@ e_error_message_manager_show(E_Manager *man, char *title, char *txt) Evas_List *l, *shapelist = NULL; Evas_Coord maxw, maxh; E_Container *con; + Ecore_X_Window win; int x, y; error_w = 400; error_h = 200; x = (man->w - error_w) / 2; y = (man->h - error_h) / 2; - ee = ecore_evas_software_x11_new(NULL, man->win, x, y, error_w, error_h); - ecore_evas_override_set(ee, 1); - ecore_evas_software_x11_direct_resize_set(ee, 1); + if (e_canvas_engine_decide(e_config->evas_engine_errors) == + E_EVAS_ENGINE_GL_X11) + { + ee = ecore_evas_gl_x11_new(NULL, man->win, x, y, error_w, error_h); + ecore_evas_gl_x11_direct_resize_set(ee, 1); + ecore_evas_override_set(ee, 1); + win = ecore_evas_gl_x11_window_get(ee); + e_container_window_raise(con, win, 999); + } + else + { + ee = ecore_evas_software_x11_new(NULL, man->win, x, y, error_w, error_h); + ecore_evas_software_x11_direct_resize_set(ee, 1); + ecore_evas_override_set(ee, 1); + win = ecore_evas_software_x11_window_get(ee); + e_container_window_raise(con, win, 999); + } e_canvas_add(ee); ecore_evas_name_class_set(ee, "E", "Low_Level_Dialog"); @@ -330,13 +345,7 @@ e_error_message_manager_show(E_Manager *man, char *title, char *txt) o = evas_object_rectangle_add(e); evas_object_name_set(o, "allocated"); } - { - Ecore_X_Window win; - - win = ecore_evas_software_x11_window_get(ee); - e_container_window_raise(con, win, 999); - ecore_evas_show(ee); - } + ecore_evas_show(ee); } /* local subsystem functions */ diff --git a/src/bin/e_init.c b/src/bin/e_init.c index 8a7cff0..ca9cfc9 100644 --- a/src/bin/e_init.c +++ b/src/bin/e_init.c @@ -38,12 +38,23 @@ e_init_init(void) root = roots[0]; ecore_x_window_size_get(root, &w, &h); - _e_init_ecore_evas = ecore_evas_software_x11_new(NULL, root, 0, 0, w, h); - ecore_evas_override_set(_e_init_ecore_evas, 1); - ecore_evas_software_x11_direct_resize_set(_e_init_ecore_evas, 1); + if (e_canvas_engine_decide(e_config->evas_engine_init) == + E_EVAS_ENGINE_GL_X11) + { + _e_init_ecore_evas = ecore_evas_gl_x11_new(NULL, root, 0, 0, w, h); + ecore_evas_gl_x11_direct_resize_set(_e_init_ecore_evas, 1); + ecore_evas_override_set(_e_init_ecore_evas, 1); + _e_init_win = ecore_evas_gl_x11_window_get(_e_init_ecore_evas); + } + else + { + _e_init_ecore_evas = ecore_evas_software_x11_new(NULL, root, 0, 0, w, h); + ecore_evas_software_x11_direct_resize_set(_e_init_ecore_evas, 1); + ecore_evas_override_set(_e_init_ecore_evas, 1); + _e_init_win = ecore_evas_software_x11_window_get(_e_init_ecore_evas); + } e_canvas_add(_e_init_ecore_evas); _e_init_evas = ecore_evas_get(_e_init_ecore_evas); - _e_init_win = ecore_evas_software_x11_window_get(_e_init_ecore_evas); ecore_evas_name_class_set(_e_init_ecore_evas, "E", "Init_Window"); ecore_evas_title_set(_e_init_ecore_evas, "Enlightenment Init"); e_pointer_ecore_evas_set(_e_init_ecore_evas); diff --git a/src/bin/e_main.c b/src/bin/e_main.c index 588a9e9..e24813e 100644 --- a/src/bin/e_main.c +++ b/src/bin/e_main.c @@ -190,7 +190,7 @@ main(int argc, char **argv) } _e_main_shutdown_push(e_xinerama_shutdown); - ecore_x_grab(); +// ecore_x_grab(); ecore_x_io_error_handler_set(_e_main_cb_x_fatal, NULL); @@ -378,7 +378,7 @@ main(int argc, char **argv) e_managers_keys_grab(); - ecore_x_ungrab(); +// ecore_x_ungrab(); e_init_title_set(_("Enlightenment")); e_init_version_set(VERSION); @@ -491,7 +491,7 @@ _e_main_shutdown(int errorcode) static int _e_main_x_shutdown(void) { - ecore_x_ungrab(); +// ecore_x_ungrab(); ecore_x_focus_reset(); ecore_x_events_allow_all(); diff --git a/src/bin/e_menu.c b/src/bin/e_menu.c index b27960d..68d22de 100644 --- a/src/bin/e_menu.c +++ b/src/bin/e_menu.c @@ -1021,10 +1021,23 @@ _e_menu_realize(E_Menu *m) if (m->realized) return; m->realized = 1; - m->ecore_evas = ecore_evas_software_x11_new(NULL, m->zone->container->win, - m->cur.x, m->cur.y, - m->cur.w, m->cur.h); - ecore_evas_software_x11_direct_resize_set(m->ecore_evas, 1); + if (e_canvas_engine_decide(e_config->evas_engine_menus) == + E_EVAS_ENGINE_GL_X11) + { + m->ecore_evas = ecore_evas_gl_x11_new(NULL, m->zone->container->win, + m->cur.x, m->cur.y, + m->cur.w, m->cur.h); + ecore_evas_gl_x11_direct_resize_set(m->ecore_evas, 1); + m->evas_win = ecore_evas_gl_x11_window_get(m->ecore_evas); + } + else + { + m->ecore_evas = ecore_evas_software_x11_new(NULL, m->zone->container->win, + m->cur.x, m->cur.y, + m->cur.w, m->cur.h); + ecore_evas_software_x11_direct_resize_set(m->ecore_evas, 1); + m->evas_win = ecore_evas_software_x11_window_get(m->ecore_evas); + } e_canvas_add(m->ecore_evas); m->shape = e_container_shape_add(m->zone->container); e_container_shape_move(m->shape, m->cur.x, m->cur.y); @@ -1035,7 +1048,6 @@ _e_menu_realize(E_Menu *m) /* move cursor out to avoid event cycles during setup */ evas_event_feed_mouse_in(m->evas, NULL); evas_event_feed_mouse_move(m->evas, -1000000, -1000000, NULL); - m->evas_win = ecore_evas_software_x11_window_get(m->ecore_evas); ecore_x_window_shape_events_select(m->evas_win, 1); ecore_evas_name_class_set(m->ecore_evas, "E", "_e_menu_window"); ecore_evas_title_set(m->ecore_evas, "E Menu"); diff --git a/src/bin/e_popup.c b/src/bin/e_popup.c index 9a306da..43ad560 100644 --- a/src/bin/e_popup.c +++ b/src/bin/e_popup.c @@ -40,18 +40,32 @@ e_popup_new(E_Zone *zone, int x, int y, int w, int h) pop->w = w; pop->h = h; pop->layer = 250; - pop->ecore_evas = ecore_evas_software_x11_new(NULL, - pop->zone->container->win, - pop->zone->x + pop->x, - pop->zone->y + pop->y, - pop->w, pop->h); - ecore_evas_software_x11_direct_resize_set(pop->ecore_evas, 1); + if (e_canvas_engine_decide(e_config->evas_engine_popups) == + E_EVAS_ENGINE_GL_X11) + { + pop->ecore_evas = ecore_evas_gl_x11_new(NULL, + pop->zone->container->win, + pop->zone->x + pop->x, + pop->zone->y + pop->y, + pop->w, pop->h); + ecore_evas_gl_x11_direct_resize_set(pop->ecore_evas, 1); + pop->evas_win = ecore_evas_gl_x11_window_get(pop->ecore_evas); + } + else + { + pop->ecore_evas = ecore_evas_software_x11_new(NULL, + pop->zone->container->win, + pop->zone->x + pop->x, + pop->zone->y + pop->y, + pop->w, pop->h); + ecore_evas_software_x11_direct_resize_set(pop->ecore_evas, 1); + pop->evas_win = ecore_evas_software_x11_window_get(pop->ecore_evas); + } e_canvas_add(pop->ecore_evas); pop->shape = e_container_shape_add(pop->zone->container); e_container_shape_move(pop->shape, pop->zone->x + pop->x, pop->zone->y + pop->y); e_container_shape_resize(pop->shape, pop->w, pop->h); pop->evas = ecore_evas_get(pop->ecore_evas); - pop->evas_win = ecore_evas_software_x11_window_get(pop->ecore_evas); e_container_window_raise(pop->zone->container, pop->evas_win, pop->layer); ecore_x_window_shape_events_select(pop->evas_win, 1); ecore_evas_name_class_set(pop->ecore_evas, "E", "_e_popup_window"); diff --git a/src/bin/e_theme.c b/src/bin/e_theme.c index 06d8832..1bad9b9 100644 --- a/src/bin/e_theme.c +++ b/src/bin/e_theme.c @@ -40,6 +40,13 @@ e_theme_init(void) e_theme_file_set(buf, et->file); } /* + * this is used to sewt the theme for a CATEGORY of e17. "base" is always set + * to the default theme - because if a selected theme for lest say base/theme + * does not provide theme elements it can default back to the default theme. + * + * the idea is you can actually set a different theme for different parts of + * the desktop... :) + * * other possible categories... * e_theme_file_set("base/theme/borders", "default.edj"); * e_theme_file_set("base/theme/menus", "default.edj"); @@ -236,6 +243,16 @@ e_theme_file_set(char *category, char *file) mappings = evas_hash_add(mappings, category, res); } +void +e_theme_about(E_Zone *zone, const char *file) +{ + static E_Popup *pop = NULL; + + if (pop) return; + pop = e_popup_new(zone, zone->w / 2, zone->h / 2, 1, 1); + e_popup_show(pop); +} + /* local subsystem functions */ static Evas_Bool -- 2.7.4