From 59d7929e739a1b9dfb54509ab1ac8df46b321970 Mon Sep 17 00:00:00 2001 From: Gustavo Sverzut Barbieri Date: Thu, 21 Jun 2007 22:49:36 +0000 Subject: [PATCH] Ecore_Evas now supports software_16_x11 engine. SVN revision: 30424 --- legacy/ecore/configure.in | 41 ++ legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h | 11 +- legacy/ecore/src/lib/ecore_evas/ecore_evas.c | 7 + .../src/lib/ecore_evas/ecore_evas_private.h | 3 + .../ecore/src/lib/ecore_evas/ecore_evas_x.c | 460 ++++++++++++++++-- 5 files changed, 485 insertions(+), 37 deletions(-) diff --git a/legacy/ecore/configure.in b/legacy/ecore/configure.in index f513a3068d..432ef810f6 100644 --- a/legacy/ecore/configure.in +++ b/legacy/ecore/configure.in @@ -413,6 +413,45 @@ else fi PCFLAGS=$CFLAGS +have_ecore_evas_x11_16="no"; + +AC_ARG_ENABLE(ecore-evas-x11-16, + AC_HELP_STRING( + [--enable-ecore-evas-x11-16], + [enable 16bpp optimized mode support in the ecore_evas module. [[default=disabled]]] + ), [ + want_ecore_evas_x11_16=$enableval + ], [ + want_ecore_evas_x11_16=no + ] +) + +AC_MSG_CHECKING(whether ecore_evas x11-16 support is to be built) +AC_MSG_RESULT($want_ecore_evas_x11_16) + +dnl X11 16bpp support requires X support, so we should +dnl handle the case where our user is on crack +dnl i.e. user disables X but enables X11 16bpp +PCFLAGS=$CFLAGS +CFLAGS="$EVAS_CFLAGS $CFLAGS" +if test "x$want_ecore_evas_x11_16" = "xyes" -a "x$have_ecore_x" = "xyes"; then + AC_CHECK_HEADER(Evas_Engine_Software_16_X11.h, + [ + AC_DEFINE(BUILD_ECORE_EVAS_X11_16, 1, [Support for X11 16bpp Engine in Ecore_Evas]) + have_ecore_evas_x11_16="yes"; + ], [ + dummy=no + ], [ + #include + ] + ) +else + if test "x$want_ecore_evas_x11_16" = "xyes"; then + AC_MSG_WARN(Silly monkey: ecore_evas_x11_16 requires ecore_x ... disabling ecore_evas_x11_16) + fi +fi +PCFLAGS=$CFLAGS + AC_MSG_CHECKING(whether ecore_evas DirectFB support is to be built) AC_ARG_ENABLE(ecore-evas-dfb, [ --disable-ecore-evas-dfb disable DirectFB in the ecore_evas module], @@ -718,6 +757,7 @@ AM_CONDITIONAL(BUILD_ECORE_X, test $have_ecore_x = yes -a $have_ecore_x_xcb = no AM_CONDITIONAL(BUILD_ECORE_X_XCB, test $have_ecore_x_xcb = yes) AM_CONDITIONAL(BUILD_ECORE_EVAS_GL, test $have_ecore_evas_gl = yes) AM_CONDITIONAL(BUILD_ECORE_EVAS_XRENDER, test $have_ecore_evas_xrender = yes) +AM_CONDITIONAL(BUILD_ECORE_EVAS_X11_16, test $have_ecore_evas_x11_16 = yes) AM_CONDITIONAL(BUILD_ECORE_EVAS_DIRECTFB, test $have_ecore_evas_dfb = yes) AM_CONDITIONAL(BUILD_ECORE_EVAS_FB, test $have_ecore_evas_fb = yes) AM_CONDITIONAL(BUILD_ECORE_EVAS_BUFFER, test $have_ecore_evas_buffer = yes) @@ -779,6 +819,7 @@ echo " Ecore_DFB....................: $have_ecore_directfb" echo " Ecore_Evas...................: $have_ecore_evas" echo " Ecore_Evas GL Support........: $have_ecore_evas_gl" echo " Ecore_Evas XRender Support...: $have_ecore_evas_xrender" +echo " Ecore_Evas X11 16bpp Support.: $have_ecore_evas_16_x11" echo " Ecore_Evas FB Support........: $have_ecore_evas_fb" echo " Ecore_Evas DFB Support.......: $have_ecore_evas_dfb" echo " Ecore_Evas Buffer Support....: $have_ecore_evas_buffer" diff --git a/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h b/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h index 8ca2694010..d164f048bc 100644 --- a/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h +++ b/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h @@ -51,6 +51,7 @@ extern "C" { #define HAVE_ECORE_EVAS_X 1 #define HAVE_ECORE_EVAS_FB 1 #define HAVE_ECORE_EVAS_GL 1 +#define HAVE_ECORE_EVAS_X11_16 1 #define HAVE_ECORE_EVAS_DIRECTFB 1 typedef enum _Ecore_Evas_Engine_Type @@ -60,7 +61,8 @@ typedef enum _Ecore_Evas_Engine_Type ECORE_EVAS_ENGINE_GL_X11, ECORE_EVAS_ENGINE_SOFTWARE_BUFFER, ECORE_EVAS_ENGINE_XRENDER_X11, - ECORE_EVAS_ENGINE_DIRECTFB + ECORE_EVAS_ENGINE_DIRECTFB, + ECORE_EVAS_ENGINE_SOFTWARE_X11_16, } Ecore_Evas_Engine_Type; #ifndef _ECORE_X_H @@ -107,6 +109,13 @@ EAPI void ecore_evas_xrender_x11_direct_resize_set(Ecore_Evas *ee, in EAPI int ecore_evas_xrender_x11_direct_resize_get(Ecore_Evas *ee); EAPI void ecore_evas_xrender_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win); +EAPI Ecore_Evas *ecore_evas_software_x11_16_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h); +EAPI Ecore_X_Window ecore_evas_software_x11_16_window_get(Ecore_Evas *ee); +EAPI Ecore_X_Window ecore_evas_software_x11_16_subwindow_get(Ecore_Evas *ee); +EAPI void ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee, int on); +EAPI int ecore_evas_software_x11_16_direct_resize_get(Ecore_Evas *ee); +EAPI void ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win); + EAPI Ecore_Evas *ecore_evas_fb_new(char *disp_name, int rotation, int w, int h); EAPI Ecore_Evas *ecore_evas_directfb_new(const char *disp_name, int windowed, int x, int y, int w, int h); diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas.c index 8f35005594..38921898fe 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas.c @@ -46,6 +46,13 @@ ecore_evas_engine_type_supported_get(Ecore_Evas_Engine_Type engine) #else return 0; #endif + + case ECORE_EVAS_ENGINE_SOFTWARE_X11_16: +#ifdef BUILD_ECORE_EVAS_X11_16 + return 1; +#else + return 0; +#endif break; case ECORE_EVAS_ENGINE_SOFTWARE_BUFFER: #ifdef BUILD_ECORE_EVAS_BUFFER 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 a784e4f907..ed2d8b5142 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h @@ -46,6 +46,9 @@ # ifdef BUILD_ECORE_EVAS_XRENDER # include # endif +# ifdef BUILD_ECORE_EVAS_X11_16 +# include +# endif # endif /* HAVE_ECORE_X_XCB */ #endif #ifdef BUILD_ECORE_EVAS_FB 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 df6a45455c..38e31164d4 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c @@ -505,6 +505,27 @@ _ecore_evas_x_resize_shape(Ecore_Evas *ee) } #endif /* BUILD_ECORE_EVAS_XRENDER */ } + else if (!strcmp(ee->driver, "software_16_x11")) + { +#if defined(BUILD_ECORE_X) && defined(BUILD_ECORE_EVAS_X11_16) +#if 0 /* XXX no shaped window support for software_16_x11 */ + Evas_Engine_Info_Software_16_X11 *einfo; + + einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas); + if (einfo) + { + GC gc; + XGCValues gcv; + + if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask); + ee->engine.x.mask = ecore_x_pixmap_new(ee->engine.x.win, ee->w, ee->h, 1); + einfo->info.mask = ee->engine.x.mask; + evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); + evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); + } +#endif /* XXX no shaped window support for software_16_x11 */ +#endif /* defined(BUILD_ECORE_X) && defined(BUILD_ECORE_EVAS_X11_16) */ + } } static void @@ -1497,6 +1518,7 @@ _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation) if (ee->rotation == rotation) return; if (!strcmp(ee->driver, "gl_x11")) return; + if (!strcmp(ee->driver, "software_16_x11")) return; rot_dif = ee->rotation - rotation; if (rot_dif < 0) rot_dif = -rot_dif; if (!strcmp(ee->driver, "software_x11")) @@ -1711,6 +1733,39 @@ _ecore_evas_x_shaped_set(Ecore_Evas *ee, int shaped) } #endif } + else if (!strcmp(ee->driver, "software_16_x11")) + { +#if defined(BUILD_ECORE_X) && defined(BUILD_ECORE_EVAS_X11_16) +#if 0 /* XXX no shaped window support for software_16_x11 */ + Evas_Engine_Info_Software_16_X11 *einfo; + + einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas); + ee->shaped = shaped; + if (einfo) + { + if (ee->shaped) + { + GC gc; + XGCValues gcv; + + ee->engine.x.mask = ecore_x_pixmap_new(ee->engine.x.win, ee->w, ee->h, 1); + einfo->info.mask = ee->engine.x.mask; + evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); + evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); + } + else + { + if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask); + ee->engine.x.mask = 0; + einfo->info.mask = 0; + evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); + ecore_x_window_shape_mask_set(ee->engine.x.win, 0); + } + } +#endif /* XXX no shaped window support for software_16_x11 */ +#endif /* defined(BUILD_ECORE_X) && defined(BUILD_ECORE_EVAS_X11_16) */ + } + } /* FIXME, round trip */ @@ -1858,6 +1913,54 @@ _ecore_evas_x_alpha_set(Ecore_Evas *ee, int alpha) if (ee->prop.focused) ecore_x_window_focus(ee->engine.x.win); #endif } + else if (!strcmp(ee->driver, "software_16_x11")) + { +#if defined(BUILD_ECORE_X) && defined(BUILD_ECORE_EVAS_X11_16) + Evas_Engine_Info_Software_16_X11 *einfo; + + einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas); + if (!einfo) return; + + ee->shaped = 0; + ee->alpha = alpha; + ecore_x_window_del(ee->engine.x.win); + ecore_evases_hash = evas_hash_del(ecore_evases_hash, _ecore_evas_x_winid_str_get(ee->engine.x.win), ee); + if (ee->alpha) + { + if (ee->prop.override) + ee->engine.x.win = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->x, ee->y, ee->w, ee->h); + else + ee->engine.x.win = ecore_x_window_argb_new(ee->engine.x.win_root, ee->x, ee->y, ee->w, ee->h); + } + else + { + if (ee->prop.override) + ee->engine.x.win = ecore_x_window_override_new(ee->engine.x.win_root, ee->x, ee->y, ee->w, ee->h); + else + ee->engine.x.win = ecore_x_window_new(ee->engine.x.win_root, ee->x, ee->y, ee->w, ee->h); + } + +#if 0 /* XXX no alpha window support for software_16_x11 */ + einfo->info.destination_alpha = alpha; +#endif /* XXX no alpha window support for software_16_x11 */ + +#if 0 /* XXX no shaped window support for software_16_x11 */ + if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask); + ee->engine.x.mask = 0; + einfo->info.mask = 0; +#endif /* XXX no shaped window support for software_16_x11 */ + + einfo->info.drawable = ee->engine.x.win; + evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); + evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); + ecore_x_window_shape_mask_set(ee->engine.x.win, 0); + ecore_evases_hash = evas_hash_add(ecore_evases_hash, _ecore_evas_x_winid_str_get(ee->engine.x.win), ee); + if (ee->prop.borderless) + ecore_x_mwm_borderless_set(ee->engine.x.win, ee->prop.borderless); + if (ee->visible) ecore_x_window_show(ee->engine.x.win); + if (ee->prop.focused) ecore_x_window_focus(ee->engine.x.win); +#endif /* defined(BUILD_ECORE_X) && defined(BUILD_ECORE_EVAS_X11_16) */ + } } static void @@ -2213,56 +2316,104 @@ _ecore_evas_x_fullscreen_set(Ecore_Evas *ee, int on) static void _ecore_evas_x_avoid_damage_set(Ecore_Evas *ee, int on) { -#ifdef HAVE_ECORE_X_XCB - Evas_Engine_Info_Software_Xcb *einfo; -#else - Evas_Engine_Info_Software_X11 *einfo; -#endif /* HAVE_ECORE_X_XCB */ - if (((ee->prop.avoid_damage) && (on)) || ((!ee->prop.avoid_damage) && (!on))) return; if (!strcmp(ee->driver, "gl_x11")) return; - ee->prop.avoid_damage = on; -#ifdef HAVE_ECORE_X_XCB - einfo = (Evas_Engine_Info_Software_Xcb *)evas_engine_info_get(ee->evas); -#else - einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas); -#endif /* HAVE_ECORE_X_XCB */ - if (einfo) + + if ((!strcmp(ee->driver, "software_x11")) || (!strcmp(ee->driver, "software_xcb"))) { - if (ee->prop.avoid_damage) +#ifdef HAVE_ECORE_X_XCB + Evas_Engine_Info_Software_Xcb *einfo; +#else + Evas_Engine_Info_Software_X11 *einfo; +#endif /* HAVE_ECORE_X_XCB */ + + ee->prop.avoid_damage = on; +#ifdef HAVE_ECORE_X_XCB + einfo = (Evas_Engine_Info_Software_Xcb *)evas_engine_info_get(ee->evas); +#else + einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas); +#endif /* HAVE_ECORE_X_XCB */ + if (einfo) { - ee->engine.x.pmap = ecore_x_pixmap_new(ee->engine.x.win, ee->w, ee->h, einfo->info.depth); - ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap); - einfo->info.drawable = ee->engine.x.pmap; - evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); - if ((ee->rotation == 90) || (ee->rotation == 270)) - evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w); + if (ee->prop.avoid_damage) + { + ee->engine.x.pmap = ecore_x_pixmap_new(ee->engine.x.win, ee->w, ee->h, einfo->info.depth); + ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap); + einfo->info.drawable = ee->engine.x.pmap; + evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); + if ((ee->rotation == 90) || (ee->rotation == 270)) + evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w); + else + evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); + if (ee->engine.x.direct_resize) + { + /* Turn this off for now + ee->engine.x.using_bg_pixmap = 1; + ecore_x_window_pixmap_set(ee->engine.x.win, ee->engine.x.pmap); + */ + } + } else - evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); - if (ee->engine.x.direct_resize) { -/* Turn this off for now - ee->engine.x.using_bg_pixmap = 1; - ecore_x_window_pixmap_set(ee->engine.x.win, ee->engine.x.pmap); - */ + if (ee->engine.x.pmap) ecore_x_pixmap_del(ee->engine.x.pmap); + if (ee->engine.x.gc) ecore_x_gc_del(ee->engine.x.gc); + if (ee->engine.x.using_bg_pixmap) + { + ecore_x_window_pixmap_set(ee->engine.x.win, 0); + ee->engine.x.using_bg_pixmap = 0; + } + ee->engine.x.pmap = 0; + ee->engine.x.gc = 0; + einfo->info.drawable = ee->engine.x.win; + evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); } } - else + } + else if (!strcmp(ee->driver, "software_16_x11")) + { +#if defined(BUILD_ECORE_X) && defined(BUILD_ECORE_EVAS_X11_16) + Evas_Engine_Info_Software_16_X11 *einfo; + ee->prop.avoid_damage = on; + + einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas); + if (einfo) { - if (ee->engine.x.pmap) ecore_x_pixmap_del(ee->engine.x.pmap); - if (ee->engine.x.gc) ecore_x_gc_del(ee->engine.x.gc); - if (ee->engine.x.using_bg_pixmap) + if (ee->prop.avoid_damage) { - ecore_x_window_pixmap_set(ee->engine.x.win, 0); - ee->engine.x.using_bg_pixmap = 0; + ee->engine.x.pmap = ecore_x_pixmap_new(ee->engine.x.win, ee->w, ee->h, 16); + ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap); + einfo->info.drawable = ee->engine.x.pmap; + evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); + if ((ee->rotation == 90) || (ee->rotation == 270)) + evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w); + else + evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); + if (ee->engine.x.direct_resize) + { + /* Turn this off for now + ee->engine.x.using_bg_pixmap = 1; + ecore_x_window_pixmap_set(ee->engine.x.win, ee->engine.x.pmap); + */ + } + } + else + { + if (ee->engine.x.pmap) ecore_x_pixmap_del(ee->engine.x.pmap); + if (ee->engine.x.gc) ecore_x_gc_del(ee->engine.x.gc); + if (ee->engine.x.using_bg_pixmap) + { + ecore_x_window_pixmap_set(ee->engine.x.win, 0); + ee->engine.x.using_bg_pixmap = 0; + } + ee->engine.x.pmap = 0; + ee->engine.x.gc = 0; + einfo->info.drawable = ee->engine.x.win; + evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); } - ee->engine.x.pmap = 0; - ee->engine.x.gc = 0; - einfo->info.drawable = ee->engine.x.win; - evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); } +#endif /* defined(BUILD_ECORE_X) && defined(BUILD_ECORE_EVAS_X11_16) */ } } @@ -3110,3 +3261,240 @@ ecore_evas_xrender_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win { ecore_evas_software_x11_extra_event_window_add(ee, win); } + +/** + * To be documented. + * + * FIXME: To be fixed. + */ +EAPI Ecore_Evas * +ecore_evas_software_x11_16_new(const char *disp_name, Ecore_X_Window parent, + int x, int y, int w, int h) +{ +#if defined(BUILD_ECORE_X) && defined(BUILD_ECORE_EVAS_X11_16) + Evas_Engine_Info_Software_16_X11 *einfo; + Ecore_Evas *ee; + int argb = 0; + int rmethod; + static int redraw_debug = -1; + + rmethod = evas_render_method_lookup("software_16_x11"); + if (!rmethod) return NULL; + if (!ecore_x_init(disp_name)) return NULL; + ee = calloc(1, sizeof(Ecore_Evas)); + if (!ee) return NULL; + + ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS); + + _ecore_evas_x_init(); + + ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func; + + ee->driver = "software_16_x11"; + if (disp_name) ee->name = strdup(disp_name); + + if (w < 1) w = 1; + if (h < 1) h = 1; + ee->x = x; + ee->y = y; + ee->w = w; + ee->h = h; + + ee->prop.max.w = 32767; + ee->prop.max.h = 32767; + ee->prop.layer = 4; + ee->prop.request_pos = 0; + ee->prop.sticky = 0; + ee->engine.x.state.sticky = 0; + + /* init evas here */ + ee->evas = evas_new(); + evas_data_attach_set(ee->evas, ee); + evas_output_method_set(ee->evas, rmethod); + evas_output_size_set(ee->evas, w, h); + evas_output_viewport_set(ee->evas, 0, 0, w, h); + + ee->engine.x.win_root = parent; + if (parent != 0) + { + /* FIXME: round trip in ecore_x_window_argb_get */ + if (ecore_x_window_argb_get(parent)) + { + ee->engine.x.win = ecore_x_window_argb_new(parent, x, y, w, h); + argb = 1; + } + else + ee->engine.x.win = ecore_x_window_new(parent, x, y, w, h); + } + else + ee->engine.x.win = ecore_x_window_new(parent, x, y, w, h); + if (getenv("DESKTOP_STARTUP_ID")) + { + ecore_x_netwm_startup_id_set(ee->engine.x.win, + getenv("DESKTOP_STARTUP_ID")); + /* NB: on linux this may simply empty the env as opposed to completely + * unset it to being empty - unsure as solartis libc crashes looking + * for the '=' char */ + putenv((char*)"DESKTOP_STARTUP_ID="); + } + einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas); + + if (einfo) + { + int screen; + + screen = DefaultScreen(ecore_x_display_get()); + if (ScreenCount(ecore_x_display_get()) > 1) + { + Ecore_X_Window *roots; + int num, i; + + num = 0; + roots = ecore_x_window_root_list(&num); + if (roots) + { + XWindowAttributes at; + + if (XGetWindowAttributes(ecore_x_display_get(), + parent, &at)) + { + for (i = 0; i < num; i++) + { + if (at.root == roots[i]) + { + screen = i; + break; + } + } + } + free(roots); + } + } + + if (redraw_debug < 0) + { + if (getenv("REDRAW_DEBUG")) + redraw_debug = atoi(getenv("REDRAW_DEBUG")); + else + redraw_debug = 0; + } + einfo->info.display = ecore_x_display_get(); + einfo->info.drawable = ee->engine.x.win; + + evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); + } + evas_key_modifier_add(ee->evas, "Shift"); + evas_key_modifier_add(ee->evas, "Control"); + evas_key_modifier_add(ee->evas, "Alt"); + evas_key_modifier_add(ee->evas, "Meta"); + evas_key_modifier_add(ee->evas, "Hyper"); + evas_key_modifier_add(ee->evas, "Super"); + evas_key_lock_add(ee->evas, "Caps_Lock"); + evas_key_lock_add(ee->evas, "Num_Lock"); + evas_key_lock_add(ee->evas, "Scroll_Lock"); + + ecore_evases = _ecore_list2_prepend(ecore_evases, ee); + ecore_evases_hash = evas_hash_add(ecore_evases_hash, _ecore_evas_x_winid_str_get(ee->engine.x.win), ee); + return ee; +#else + return NULL; +#endif /* BUILD_ECORE_X */ +} + +/** + * To be documented. + * + * FIXME: To be fixed. + */ +EAPI Ecore_X_Window +ecore_evas_software_x11_16_window_get(Ecore_Evas *ee) +{ +#if defined(BUILD_ECORE_X) && defined(BUILD_ECORE_EVAS_X11_16) + return ee->engine.x.win; +#else + return 0; +#endif +} + +/** + * To be documented. + * + * FIXME: To be fixed. + */ +EAPI Ecore_X_Window +ecore_evas_software_x11_16_subwindow_get(Ecore_Evas *ee) +{ +#if defined(BUILD_ECORE_X) && defined(BUILD_ECORE_EVAS_X11_16) + return ee->engine.x.win; +#else + return 0; +#endif +} + +/** + * To be documented. + * + * FIXME: To be fixed. + */ +EAPI void +ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee, int on) +{ +#if defined(BUILD_ECORE_X) && defined(BUILD_ECORE_EVAS_X11_16) + ee->engine.x.direct_resize = on; + if (ee->prop.avoid_damage) + { + if (ee->engine.x.direct_resize) + { +/* turn this off for now + ee->engine.x.using_bg_pixmap = 1; + ecore_x_window_pixmap_set(ee->engine.x.win, ee->engine.x.pmap); + */ + } + else + { + ee->engine.x.using_bg_pixmap = 0; + ecore_x_window_pixmap_set(ee->engine.x.win, 0); + ecore_x_window_area_expose(ee->engine.x.win, 0, 0, ee->w, ee->h); + } + } +#else + return; +#endif +} + +/** + * To be documented. + * + * FIXME: To be fixed. + */ +EAPI int +ecore_evas_software_x11_16_direct_resize_get(Ecore_Evas *ee) +{ +#if defined(BUILD_ECORE_X) && defined(BUILD_ECORE_EVAS_X11_16) + return ee->engine.x.direct_resize; +#else + return 0; +#endif +} + +/** + * To be documented. + * + * FIXME: To be fixed. + */ +EAPI void +ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win) +{ +#if defined(BUILD_ECORE_X) && defined(BUILD_ECORE_EVAS_X11_16) + Ecore_X_Window *winp; + + winp = malloc(sizeof(Ecore_X_Window)); + if (winp) + { + *winp = win; + ee->engine.x.win_extra = evas_list_append(ee->engine.x.win_extra, winp); + ecore_evases_hash = evas_hash_add(ecore_evases_hash, _ecore_evas_x_winid_str_get(win), ee); + } +#else +#endif +}