forked from enlightenment/efl
Ecore_Evas now supports software_16_x11 engine.
SVN revision: 30424
This commit is contained in:
parent
ac04de0ffd
commit
59d7929e73
|
@ -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 <Evas.h>
|
||||
]
|
||||
)
|
||||
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"
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -46,6 +46,9 @@
|
|||
# ifdef BUILD_ECORE_EVAS_XRENDER
|
||||
# include <Evas_Engine_XRender_X11.h>
|
||||
# endif
|
||||
# ifdef BUILD_ECORE_EVAS_X11_16
|
||||
# include <Evas_Engine_Software_16_X11.h>
|
||||
# endif
|
||||
# endif /* HAVE_ECORE_X_XCB */
|
||||
#endif
|
||||
#ifdef BUILD_ECORE_EVAS_FB
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue