enlightenment welcomes elementary.

Now it's possible to do elm_win_add() from your e_modules and use all
elementary features instead of painful e_widgets.

We should consider this experimental, but after e17 is out we should
start to convert dialogs and such to elementary, eventually
deprecating e_widgets and the theme duplication.

NOTE: requires r74156 with elementary patch.

I'll send an email to the list with a simple patch to skel module to
demo this.



SVN revision: 74157
This commit is contained in:
Gustavo Sverzut Barbieri 2012-07-19 04:39:25 +00:00
parent c232ceb5b0
commit d4a047f967
4 changed files with 212 additions and 1 deletions

View File

@ -562,6 +562,26 @@ $udisks_mount \
$eeze_mount \
$device_backend"
want_elementary=auto
have_elementary=no
AC_ARG_ENABLE(elementary,
AC_HELP_STRING([--enable-elementary], [enable Elementary support @<:@default=detect@:>@]),
[want_elementary=$enableval],
[want_elementary=auto]
)
if test "x$want_elementary" != "xno"; then
PKG_CHECK_MODULES(ELM, [elementary >= 1.6.9.0],
[have_elementary=yes], [have_elementary=no])
if test "x$want_elementary" = "xyes" -a "x$have_elementary" = "xno"; then
AC_MSG_ERROR([Elementary support requested but it was not found])
fi
if test "x$have_elementary" = "xyes"; then
AC_DEFINE([HAVE_ELEMENTARY], 1, "Have Elementary support")
requirements_e="${requirements_e} elementary > 1.6.9.0"
fi
fi
PKG_CHECK_MODULES(E_OPEN, [
ecore >= 1.2.0
efreet >= 1.2.0

View File

@ -12,6 +12,7 @@ INCLUDES = \
@cf_cflags@ \
@VALGRIND_CFLAGS@ \
@EDJE_DEF@ \
@ELM_CFLAGS@ \
-DPACKAGE_BIN_DIR=\"@PACKAGE_BIN_DIR@\" \
-DPACKAGE_LIB_DIR=\"@PACKAGE_LIB_DIR@\" \
-DPACKAGE_DATA_DIR=\"@PACKAGE_DATA_DIR@\" \
@ -356,7 +357,7 @@ e_main.c \
$(enlightenment_src)
enlightenment_LDFLAGS = -export-dynamic
enlightenment_LDADD = @e_libs@ @dlopen_libs@ @cf_libs@ @VALGRIND_LIBS@ -lm
enlightenment_LDADD = @e_libs@ @ELM_LIBS@ @dlopen_libs@ @cf_libs@ @VALGRIND_LIBS@ -lm
enlightenment_imc_SOURCES = \
e.h \

View File

@ -18,6 +18,10 @@ static double t0, t1, t2;
# define TS(x)
#endif
#ifdef HAVE_ELEMENTARY
#include <Elementary.h>
#endif
/*
* i need to make more use of these when i'm baffled as to when something is
* up. other hooks:
@ -442,6 +446,17 @@ main(int argc, char **argv)
TS("Ecore_Evas Init Done");
// _e_main_shutdown_push(ecore_evas_shutdown);
#ifdef HAVE_ELEMENTARY
TS("Elementary Init");
if (!elm_init(argc, argv))
{
e_error_message_show(_("Enlightenment cannot initialize Elementary!\n"));
_e_main_shutdown(-1);
}
TS("Elementary Init Done");
_e_main_shutdown_push(elm_shutdown);
#endif
/* e doesn't sync to compositor - it should be one */
ecore_evas_app_comp_sync_set(0);

View File

@ -12,10 +12,185 @@ static void _e_win_cb_delete(Ecore_Evas *ee);
/* local subsystem globals */
static Eina_List *wins = NULL;
#ifdef HAVE_ELEMENTARY
/* intercept elm_win operations so we talk directly to e_border */
#include <Elementary.h>
typedef struct _Elm_Win_Trap_Ctx
{
E_Border *border;
Ecore_X_Window xwin;
Eina_Bool centered:1;
Eina_Bool placed:1;
} Elm_Win_Trap_Ctx;
static void *
_elm_win_trap_add(Evas_Object *o __UNUSED__)
{
Elm_Win_Trap_Ctx *ctx = calloc(1, sizeof(Elm_Win_Trap_Ctx));
EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, NULL);
return ctx;
}
static void
_elm_win_trap_del(void *data, Evas_Object *o __UNUSED__)
{
Elm_Win_Trap_Ctx *ctx = data;
EINA_SAFETY_ON_NULL_RETURN(ctx);
if (ctx->border)
{
e_border_hide(ctx->border, 1);
e_object_del(E_OBJECT(ctx->border));
}
free(ctx);
}
static Eina_Bool
_elm_win_trap_hide(void *data, Evas_Object *o __UNUSED__)
{
Elm_Win_Trap_Ctx *ctx = data;
EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, EINA_TRUE);
if (!ctx->border) return EINA_TRUE;
e_border_hide(ctx->border, 1);
return EINA_FALSE;
}
static Eina_Bool
_elm_win_trap_show(void *data, Evas_Object *o)
{
Elm_Win_Trap_Ctx *ctx = data;
EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, EINA_TRUE);
if (!ctx->border)
{
Ecore_X_Window xwin = elm_win_xwindow_get(o);
E_Container *con = e_util_container_window_find(xwin);
Evas *e = evas_object_evas_get(o);
Ecore_Evas *ee = ecore_evas_ecore_evas_get(e);
if (!con)
{
E_Manager *man = e_manager_current_get();
EINA_SAFETY_ON_NULL_RETURN_VAL(man, EINA_TRUE);
con = e_container_current_get(man);
if (!con) con = e_container_number_get(man, 0);
EINA_SAFETY_ON_NULL_RETURN_VAL(con, EINA_TRUE);
}
ctx->xwin = xwin;
ctx->border = e_border_new(con, xwin, 0, 1);
EINA_SAFETY_ON_NULL_RETURN_VAL(ctx->border, EINA_TRUE);
ctx->border->placed = ctx->placed;
ctx->border->internal = 1;
ctx->border->internal_ecore_evas = ee;
}
if (ctx->centered) e_border_center(ctx->border);
e_border_show(ctx->border);
return EINA_FALSE;
}
static Eina_Bool
_elm_win_trap_move(void *data, Evas_Object *o __UNUSED__, int x, int y)
{
Elm_Win_Trap_Ctx *ctx = data;
EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, EINA_TRUE);
ctx->centered = EINA_FALSE;
ctx->placed = EINA_TRUE;
if (!ctx->border) return EINA_TRUE;
e_border_move_without_border(ctx->border, x, y);
return EINA_FALSE;
}
static Eina_Bool
_elm_win_trap_resize(void *data, Evas_Object *o __UNUSED__, int w, int h)
{
Elm_Win_Trap_Ctx *ctx = data;
EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, EINA_TRUE);
ctx->centered = EINA_FALSE;
if (!ctx->border) return EINA_TRUE;
e_border_resize_without_border(ctx->border, w, h);
return EINA_FALSE;
}
static Eina_Bool
_elm_win_trap_center(void *data, Evas_Object *o __UNUSED__)
{
Elm_Win_Trap_Ctx *ctx = data;
EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, EINA_TRUE);
ctx->centered = EINA_TRUE;
if (!ctx->border) return EINA_TRUE;
if (ctx->centered) e_border_center(ctx->border);
return EINA_FALSE;
}
static Eina_Bool
_elm_win_trap_lower(void *data, Evas_Object *o __UNUSED__)
{
Elm_Win_Trap_Ctx *ctx = data;
EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, EINA_TRUE);
if (!ctx->border) return EINA_TRUE;
e_border_lower(ctx->border);
return EINA_FALSE;
}
static Eina_Bool
_elm_win_trap_raise(void *data, Evas_Object *o __UNUSED__)
{
Elm_Win_Trap_Ctx *ctx = data;
EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, EINA_TRUE);
if (!ctx->border) return EINA_TRUE;
e_border_raise(ctx->border);
return EINA_FALSE;
}
static const Elm_Win_Trap _elm_win_trap = {
ELM_WIN_TRAP_VERSION,
_elm_win_trap_add,
_elm_win_trap_del,
_elm_win_trap_hide,
_elm_win_trap_show,
_elm_win_trap_move,
_elm_win_trap_resize,
_elm_win_trap_center,
_elm_win_trap_lower,
_elm_win_trap_raise,
/* activate */ NULL,
/* alpha_set */ NULL,
/* aspect_set */ NULL,
/* avoid_damage_set */ NULL,
/* borderless_set */ NULL,
/* demand_attention_set */ NULL,
/* focus_skip_set */ NULL,
/* fullscreen_set */ NULL,
/* iconified_set */ NULL,
/* layer_set */ NULL,
/* manual_render_set */ NULL,
/* maximized_set */ NULL,
/* modal_set */ NULL,
/* name_class_set */ NULL,
/* object_cursor_set */ NULL,
/* override_set */ NULL,
/* rotation_set */ NULL,
/* rotation_with_resize_set */ NULL,
/* shaped_set */ NULL,
/* size_base_set */ NULL,
/* size_step_set */ NULL,
/* size_min_set */ NULL,
/* size_max_set */ NULL,
/* sticky_set */ NULL,
/* title_set */ NULL,
/* urgent_set */ NULL,
/* withdrawn_set */ NULL
};
#endif
/* externally accessible functions */
EINTERN int
e_win_init(void)
{
#ifdef HAVE_ELEMENTARY
if (!elm_win_trap_set(&_elm_win_trap)) return 0;
#endif
return 1;
}