elm_win: support trapping ecore_evas calls (aka: e17 support)

Allows setting a trap in elm_win that intercepts calls to
ecore_evas. If there is a trap and the trap returns EINA_FALSE, then
the corresponding call is NOT issued. If it does not exist or returns
EINA_TRUE, then the call is executed.

Enlightenment window manager will set these traps and will call
e_border directly, allowing E17 to use Elementary! A major feature
given e_widgets painful usage.

This should also help integrating into Wayland or even debug.





SVN revision: 74156
This commit is contained in:
Gustavo Sverzut Barbieri 2012-07-19 04:35:50 +00:00
parent bc3dd23c35
commit 3506c20374
2 changed files with 259 additions and 84 deletions

View File

@ -3,6 +3,18 @@
static const char WIN_SMART_NAME[] = "elm_win";
static const Elm_Win_Trap *trap = NULL;
#define TRAP(sd, name, ...) \
do \
{ \
if ((!trap) || (!trap->name) || \
((trap->name) && \
(trap->name(sd->trap_data, sd->base.obj, ## __VA_ARGS__)))) \
ecore_evas_##name(sd->ee, ##__VA_ARGS__); \
} \
while (0)
#define ELM_WIN_DATA_GET(o, sd) \
Elm_Win_Smart_Data * sd = evas_object_smart_data_get(o)
@ -113,6 +125,8 @@ struct _Elm_Win_Smart_Data
const char *icon_name;
const char *role;
void *trap_data;
double aspect;
int size_base_w, size_base_h;
int size_step_w, size_step_h;
@ -356,20 +370,80 @@ _shot_handle(Elm_Win_Smart_Data *sd)
sd->shot.timer = ecore_timer_add(_shot_delay_get(sd), _shot_delay, sd);
}
/* elm-win specific associate, does the trap while ecore_evas_object_associate()
* does not.
*/
static Elm_Win_Smart_Data *
_elm_win_associate_get(const Ecore_Evas *ee)
{
return ecore_evas_data_get(ee, "elm_win");
}
/* Interceptors Callbacks */
static void
_elm_win_obj_intercept_raise(void *data, Evas_Object *obj __UNUSED__)
{
Elm_Win_Smart_Data *sd = data;
TRAP(sd, raise);
}
static void
_elm_win_obj_intercept_lower(void *data, Evas_Object *obj __UNUSED__)
{
Elm_Win_Smart_Data *sd = data;
TRAP(sd, lower);
}
static void
_elm_win_obj_intercept_stack_above(void *data __UNUSED__, Evas_Object *obj __UNUSED__, Evas_Object *above __UNUSED__)
{
INF("TODO: %s", __FUNCTION__);
}
static void
_elm_win_obj_intercept_stack_below(void *data __UNUSED__, Evas_Object *obj __UNUSED__, Evas_Object *below __UNUSED__)
{
INF("TODO: %s", __FUNCTION__);
}
static void
_elm_win_obj_intercept_layer_set(void *data, Evas_Object *obj __UNUSED__, int l)
{
Elm_Win_Smart_Data *sd = data;
TRAP(sd, layer_set, l);
}
/* Event Callbacks */
static void
_elm_win_obj_callback_changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
{
Elm_Win_Smart_Data *sd = data;
Evas_Coord w, h;
evas_object_size_hint_min_get(obj, &w, &h);
TRAP(sd, size_min_set, w, h);
evas_object_size_hint_max_get(obj, &w, &h);
if (w < 1) w = -1;
if (h < 1) h = -1;
TRAP(sd, size_max_set, w, h);
}
/* end of elm-win specific associate */
static void
_elm_win_move(Ecore_Evas *ee)
{
Evas_Object *obj = ecore_evas_object_associate_get(ee);
Elm_Win_Smart_Data *sd = _elm_win_associate_get(ee);
int x, y;
if (!obj) return;
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
EINA_SAFETY_ON_NULL_RETURN(sd);
ecore_evas_geometry_get(ee, &x, &y, NULL, NULL);
sd->screen.x = x;
sd->screen.y = y;
evas_object_smart_callback_call(obj, SIG_MOVED, NULL);
evas_object_smart_callback_call(ELM_WIDGET_DATA(sd)->obj, SIG_MOVED, NULL);
}
static void
@ -407,10 +481,8 @@ _elm_win_resize_job(void *data)
static void
_elm_win_resize(Ecore_Evas *ee)
{
Evas_Object *obj = ecore_evas_object_associate_get(ee);
if (!obj) return;
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
Elm_Win_Smart_Data *sd = _elm_win_associate_get(ee);
EINA_SAFETY_ON_NULL_RETURN(sd);
if (sd->deferred_resize_job) ecore_job_del(sd->deferred_resize_job);
sd->deferred_resize_job = ecore_job_add(_elm_win_resize_job, sd);
@ -419,10 +491,8 @@ _elm_win_resize(Ecore_Evas *ee)
static void
_elm_win_mouse_in(Ecore_Evas *ee)
{
Evas_Object *obj;
if (!(obj = ecore_evas_object_associate_get(ee))) return;
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
Elm_Win_Smart_Data *sd = _elm_win_associate_get(ee);
EINA_SAFETY_ON_NULL_RETURN(sd);
if (sd->resizing) sd->resizing = EINA_FALSE;
}
@ -594,11 +664,12 @@ _elm_win_focus_highlight_reconfigure_job_start(Elm_Win_Smart_Data *sd)
static void
_elm_win_focus_in(Ecore_Evas *ee)
{
Evas_Object *obj = ecore_evas_object_associate_get(ee);
Elm_Win_Smart_Data *sd = _elm_win_associate_get(ee);
Evas_Object *obj;
if (!obj) return;
EINA_SAFETY_ON_NULL_RETURN(sd);
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
obj = ELM_WIDGET_DATA(sd)->obj;
_elm_widget_top_win_focused_set(obj, EINA_TRUE);
if (!elm_widget_focus_order_get(obj))
@ -624,11 +695,12 @@ _elm_win_focus_in(Ecore_Evas *ee)
static void
_elm_win_focus_out(Ecore_Evas *ee)
{
Evas_Object *obj = ecore_evas_object_associate_get(ee);
Elm_Win_Smart_Data *sd = _elm_win_associate_get(ee);
Evas_Object *obj;
if (!obj) return;
EINA_SAFETY_ON_NULL_RETURN(sd);
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
obj = ELM_WIDGET_DATA(sd)->obj;
elm_object_focus_set(obj, EINA_FALSE);
_elm_widget_top_win_focused_set(obj, EINA_FALSE);
@ -648,6 +720,7 @@ _elm_win_focus_out(Ecore_Evas *ee)
static void
_elm_win_state_change(Ecore_Evas *ee)
{
Elm_Win_Smart_Data *sd = _elm_win_associate_get(ee);
Evas_Object *obj;
Eina_Bool ch_withdrawn = EINA_FALSE;
Eina_Bool ch_sticky = EINA_FALSE;
@ -655,9 +728,9 @@ _elm_win_state_change(Ecore_Evas *ee)
Eina_Bool ch_fullscreen = EINA_FALSE;
Eina_Bool ch_maximized = EINA_FALSE;
if (!(obj = ecore_evas_object_associate_get(ee))) return;
EINA_SAFETY_ON_NULL_RETURN(sd);
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
obj = ELM_WIDGET_DATA(sd)->obj;
if (sd->withdrawn != ecore_evas_withdrawn_get(sd->ee))
{
@ -872,6 +945,8 @@ _elm_win_smart_show(Evas_Object *obj)
_elm_win_parent_sc->base.show(obj);
TRAP(sd, show);
if (!sd->show_count) sd->show_count++;
if (sd->shot.info) _shot_handle(sd);
}
@ -883,6 +958,8 @@ _elm_win_smart_hide(Evas_Object *obj)
_elm_win_parent_sc->base.hide(obj);
TRAP(sd, hide);
if (sd->frame_obj)
{
evas_object_hide(sd->frame_obj);
@ -1069,6 +1146,9 @@ _elm_win_smart_del(Evas_Object *obj)
/* NB: child deletion handled by parent's smart del */
if ((trap) && (trap->del))
trap->del(sd->trap_data, obj);
if (sd->parent)
{
evas_object_event_callback_del_full
@ -1145,29 +1225,6 @@ _elm_win_on_img_obj_del(void *data,
evas_object_del(sd->img_obj);
}
static void
_elm_win_obj_intercept_move(void *data,
Evas_Object *obj,
Evas_Coord x,
Evas_Coord y)
{
Elm_Win_Smart_Data *sd = data;
if (sd->img_obj)
{
if ((x != sd->screen.x) || (y != sd->screen.y))
{
sd->screen.x = x;
sd->screen.y = y;
evas_object_smart_callback_call(obj, SIG_MOVED, NULL);
}
}
else
{
evas_object_move(obj, x, y);
}
}
static void
_elm_win_obj_intercept_show(void *data,
Evas_Object *obj)
@ -1201,6 +1258,22 @@ _elm_win_smart_move(Evas_Object *obj,
{
ELM_WIN_DATA_GET(obj, sd);
if (sd->img_obj)
{
if ((x != sd->screen.x) || (y != sd->screen.y))
{
sd->screen.x = x;
sd->screen.y = y;
evas_object_smart_callback_call(obj, SIG_MOVED, NULL);
}
return;
}
else
{
TRAP(sd, move, x, y);
if (!ecore_evas_override_get(sd->ee)) return;
}
_elm_win_parent_sc->base.move(obj, x, y);
if (ecore_evas_override_get(sd->ee))
@ -1228,6 +1301,7 @@ _elm_win_smart_resize(Evas_Object *obj,
Evas_Coord h)
{
ELM_WIN_DATA_GET(obj, sd);
Evas_Coord ow, oh, fw, fh;
_elm_win_parent_sc->base.resize(obj, w, h);
@ -1246,15 +1320,22 @@ _elm_win_smart_resize(Evas_Object *obj,
evas_object_image_size_set(sd->img_obj, w, h);
}
evas_output_framespace_get(sd->evas, NULL, NULL, &fw, &fh);
ow = w + fw;
oh = h + fh;
TRAP(sd, resize, ow, oh);
}
static void
_elm_win_delete_request(Ecore_Evas *ee)
{
Evas_Object *obj = ecore_evas_object_associate_get(ee);
Elm_Win_Smart_Data *sd = _elm_win_associate_get(ee);
Evas_Object *obj;
ELM_WIN_CHECK(obj);
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
EINA_SAFETY_ON_NULL_RETURN(sd);
obj = ELM_WIDGET_DATA(sd)->obj;
int autodel = sd->autodel;
sd->autodel_clear = &autodel;
@ -1763,7 +1844,7 @@ _elm_win_frame_cb_minimize(void *data,
if (!(sd = data)) return;
sd->iconified = EINA_TRUE;
ecore_evas_iconified_set(sd->ee, EINA_TRUE);
TRAP(sd, iconified_set, EINA_TRUE);
}
static void
@ -1777,7 +1858,7 @@ _elm_win_frame_cb_maximize(void *data,
if (!(sd = data)) return;
if (sd->maximized) sd->maximized = EINA_FALSE;
else sd->maximized = EINA_TRUE;
ecore_evas_maximized_set(sd->ee, sd->maximized);
TRAP(sd, maximized_set, sd->maximized);
}
static void
@ -2216,6 +2297,9 @@ elm_win_add(Evas_Object *parent,
SD_CPY(shot.info);
#undef SD_CPY
if ((trap) && (trap->add))
sd->trap_data = trap->add(obj);
/* complementary actions, which depend on final smart data
* pointer */
if (type == ELM_WIN_INLINED_IMAGE)
@ -2252,10 +2336,10 @@ elm_win_add(Evas_Object *parent,
#endif
if ((_elm_config->bgpixmap) && (!_elm_config->compositing))
ecore_evas_avoid_damage_set(sd->ee, ECORE_EVAS_AVOID_DAMAGE_EXPOSE);
TRAP(sd, avoid_damage_set, ECORE_EVAS_AVOID_DAMAGE_EXPOSE);
// bg pixmap done by x - has other issues like can be redrawn by x before it
// is filled/ready by app
// ecore_evas_avoid_damage_set(sd->ee, ECORE_EVAS_AVOID_DAMAGE_BUILT_IN);
// TRAP(sd, avoid_damage_set, ECORE_EVAS_AVOID_DAMAGE_BUILT_IN);
sd->type = type;
sd->parent = parent;
@ -2281,18 +2365,27 @@ elm_win_add(Evas_Object *parent,
if (type == ELM_WIN_INLINED_IMAGE)
elm_widget_parent2_set(obj, parent);
ecore_evas_object_associate
(sd->ee, obj, ECORE_EVAS_OBJECT_ASSOCIATE_BASE |
ECORE_EVAS_OBJECT_ASSOCIATE_STACK | ECORE_EVAS_OBJECT_ASSOCIATE_LAYER);
/* use own version of ecore_evas_object_associate() that does TRAP() */
ecore_evas_data_set(sd->ee, "elm_win", sd);
if (sd->img_obj)
evas_object_intercept_move_callback_add
(obj, _elm_win_obj_intercept_move, sd);
evas_object_event_callback_add
(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
_elm_win_obj_callback_changed_size_hints, sd);
evas_object_intercept_raise_callback_add
(obj, _elm_win_obj_intercept_raise, sd);
evas_object_intercept_lower_callback_add
(obj, _elm_win_obj_intercept_lower, sd);
evas_object_intercept_stack_above_callback_add
(obj, _elm_win_obj_intercept_stack_above, sd);
evas_object_intercept_stack_below_callback_add
(obj, _elm_win_obj_intercept_stack_below, sd);
evas_object_intercept_layer_set_callback_add
(obj, _elm_win_obj_intercept_layer_set, sd);
evas_object_intercept_show_callback_add
(obj, _elm_win_obj_intercept_show, sd);
ecore_evas_name_class_set(sd->ee, name, _elm_appname);
TRAP(sd, name_class_set, name, _elm_appname);
ecore_evas_callback_delete_request_set(sd->ee, _elm_win_delete_request);
ecore_evas_callback_resize_set(sd->ee, _elm_win_resize);
ecore_evas_callback_mouse_in_set(sd->ee, _elm_win_mouse_in);
@ -2322,7 +2415,7 @@ elm_win_add(Evas_Object *parent,
if (ENGINE_COMPARE(ELM_SOFTWARE_FB))
{
ecore_evas_fullscreen_set(sd->ee, 1);
TRAP(sd, fullscreen_set, 1);
}
else if (ENGINE_COMPARE(ELM_WAYLAND_SHM))
_elm_win_frame_add(sd, "default");
@ -2452,7 +2545,7 @@ elm_win_title_set(Evas_Object *obj,
if (!title) return;
eina_stringshare_replace(&(sd->title), title);
ecore_evas_title_set(sd->ee, sd->title);
TRAP(sd, title_set, sd->title);
if (sd->frame_obj)
edje_object_part_text_escaped_set
(sd->frame_obj, "elm.text.title", sd->title);
@ -2565,7 +2658,7 @@ elm_win_activate(Evas_Object *obj)
ELM_WIN_CHECK(obj);
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
ecore_evas_activate(sd->ee);
TRAP(sd, activate);
}
EAPI void
@ -2574,7 +2667,7 @@ elm_win_lower(Evas_Object *obj)
ELM_WIN_CHECK(obj);
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
ecore_evas_lower(sd->ee);
TRAP(sd, lower);
}
EAPI void
@ -2583,7 +2676,7 @@ elm_win_raise(Evas_Object *obj)
ELM_WIN_CHECK(obj);
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
ecore_evas_raise(sd->ee);
TRAP(sd, raise);
}
EAPI void
@ -2596,6 +2689,9 @@ elm_win_center(Evas_Object *obj,
ELM_WIN_CHECK(obj);
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
if ((trap) && (trap->center) && (!trap->center(sd->trap_data, obj)))
return;
ecore_evas_screen_geometry_get(sd->ee, NULL, NULL, &screen_w, &screen_h);
if ((!screen_w) || (!screen_h)) return;
@ -2619,7 +2715,7 @@ elm_win_borderless_set(Evas_Object *obj,
ELM_WIN_CHECK(obj);
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
ecore_evas_borderless_set(sd->ee, borderless);
TRAP(sd, borderless_set, borderless);
#ifdef HAVE_ELEMENTARY_X
_elm_win_xwin_update(sd);
#endif
@ -2641,7 +2737,7 @@ elm_win_shaped_set(Evas_Object *obj,
ELM_WIN_CHECK(obj);
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
ecore_evas_shaped_set(sd->ee, shaped);
TRAP(sd, shaped_set, shaped);
#ifdef HAVE_ELEMENTARY_X
_elm_win_xwin_update(sd);
#endif
@ -2678,15 +2774,15 @@ elm_win_alpha_set(Evas_Object *obj,
if (!_elm_config->compositing)
elm_win_shaped_set(obj, alpha);
else
ecore_evas_alpha_set(sd->ee, alpha);
TRAP(sd, alpha_set, alpha);
}
else
ecore_evas_alpha_set(sd->ee, alpha);
TRAP(sd, alpha_set, alpha);
_elm_win_xwin_update(sd);
}
else
#endif
ecore_evas_alpha_set(sd->ee, alpha);
TRAP(sd, alpha_set, alpha);
}
}
@ -2711,7 +2807,7 @@ elm_win_override_set(Evas_Object *obj,
ELM_WIN_CHECK(obj);
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
ecore_evas_override_set(sd->ee, override);
TRAP(sd, override_set, override);
#ifdef HAVE_ELEMENTARY_X
_elm_win_xwin_update(sd);
#endif
@ -2742,7 +2838,7 @@ elm_win_fullscreen_set(Evas_Object *obj,
else
{
sd->fullscreen = fullscreen;
ecore_evas_fullscreen_set(sd->ee, fullscreen);
TRAP(sd, fullscreen_set, fullscreen);
#ifdef HAVE_ELEMENTARY_X
_elm_win_xwin_update(sd);
#endif
@ -2776,7 +2872,7 @@ elm_win_maximized_set(Evas_Object *obj,
sd->maximized = maximized;
// YYY: handle if sd->img_obj
ecore_evas_maximized_set(sd->ee, maximized);
TRAP(sd, maximized_set, maximized);
#ifdef HAVE_ELEMENTARY_X
_elm_win_xwin_update(sd);
#endif
@ -2799,7 +2895,7 @@ elm_win_iconified_set(Evas_Object *obj,
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
sd->iconified = iconified;
ecore_evas_iconified_set(sd->ee, iconified);
TRAP(sd, iconified_set, iconified);
#ifdef HAVE_ELEMENTARY_X
_elm_win_xwin_update(sd);
#endif
@ -2822,7 +2918,7 @@ elm_win_withdrawn_set(Evas_Object *obj,
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
sd->withdrawn = withdrawn;
ecore_evas_withdrawn_set(sd->ee, withdrawn);
TRAP(sd, withdrawn_set, withdrawn);
#ifdef HAVE_ELEMENTARY_X
_elm_win_xwin_update(sd);
#endif
@ -2845,7 +2941,7 @@ elm_win_urgent_set(Evas_Object *obj,
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
sd->urgent = urgent;
ecore_evas_urgent_set(sd->ee, urgent);
TRAP(sd, urgent_set, urgent);
#ifdef HAVE_ELEMENTARY_X
_elm_win_xwin_update(sd);
#endif
@ -2868,7 +2964,7 @@ elm_win_demand_attention_set(Evas_Object *obj,
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
sd->demand_attention = demand_attention;
ecore_evas_demand_attention_set(sd->ee, demand_attention);
TRAP(sd, demand_attention_set, demand_attention);
#ifdef HAVE_ELEMENTARY_X
_elm_win_xwin_update(sd);
#endif
@ -2891,7 +2987,7 @@ elm_win_modal_set(Evas_Object *obj,
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
sd->modal = modal;
ecore_evas_modal_set(sd->ee, modal);
TRAP(sd, modal_set, modal);
#ifdef HAVE_ELEMENTARY_X
_elm_win_xwin_update(sd);
#endif
@ -2914,7 +3010,7 @@ elm_win_aspect_set(Evas_Object *obj,
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
sd->aspect = aspect;
ecore_evas_aspect_set(sd->ee, aspect);
TRAP(sd, aspect_set, aspect);
#ifdef HAVE_ELEMENTARY_X
_elm_win_xwin_update(sd);
#endif
@ -2936,7 +3032,7 @@ elm_win_size_base_set(Evas_Object *obj, int w, int h)
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
sd->size_base_w = w;
sd->size_base_h = h;
ecore_evas_size_base_set(sd->ee, w, h);
TRAP(sd, size_base_set, w, h);
#ifdef HAVE_ELEMENTARY_X
_elm_win_xwin_update(sd);
#endif
@ -2958,7 +3054,7 @@ elm_win_size_step_set(Evas_Object *obj, int w, int h)
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
sd->size_step_w = w;
sd->size_step_h = h;
ecore_evas_size_step_set(sd->ee, w, h);
TRAP(sd, size_step_set, w, h);
#ifdef HAVE_ELEMENTARY_X
_elm_win_xwin_update(sd);
#endif
@ -2980,7 +3076,7 @@ elm_win_layer_set(Evas_Object *obj,
ELM_WIN_CHECK(obj);
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
ecore_evas_layer_set(sd->ee, layer);
TRAP(sd, layer_set, layer);
#ifdef HAVE_ELEMENTARY_X
_elm_win_xwin_update(sd);
#endif
@ -3004,7 +3100,7 @@ elm_win_rotation_set(Evas_Object *obj,
if (sd->rot == rotation) return;
sd->rot = rotation;
ecore_evas_rotation_set(sd->ee, rotation);
TRAP(sd, rotation_set, rotation);
evas_object_size_hint_min_set(obj, -1, -1);
evas_object_size_hint_max_set(obj, -1, -1);
_elm_win_resize_objects_eval(obj);
@ -3022,7 +3118,7 @@ elm_win_rotation_with_resize_set(Evas_Object *obj,
if (sd->rot == rotation) return;
sd->rot = rotation;
ecore_evas_rotation_with_resize_set(sd->ee, rotation);
TRAP(sd, rotation_with_resize_set, rotation);
evas_object_size_hint_min_set(obj, -1, -1);
evas_object_size_hint_max_set(obj, -1, -1);
_elm_win_resize_objects_eval(obj);
@ -3049,7 +3145,7 @@ elm_win_sticky_set(Evas_Object *obj,
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
sd->sticky = sticky;
ecore_evas_sticky_set(sd->ee, sticky);
TRAP(sd, sticky_set, sticky);
#ifdef HAVE_ELEMENTARY_X
_elm_win_xwin_update(sd);
#endif
@ -3423,7 +3519,7 @@ elm_win_prop_focus_skip_set(Evas_Object *obj,
ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
sd->skip_focus = skip;
ecore_evas_focus_skip_set(sd->ee, skip);
TRAP(sd, focus_skip_set, skip);
}
EAPI void
@ -3582,3 +3678,19 @@ elm_win_wl_window_get(const Evas_Object *obj)
#endif
return NULL;
}
EAPI Eina_Bool
elm_win_trap_set(const Elm_Win_Trap *t)
{
DBG("old %p, new %p", trap, t);
if ((t) && (t->version != ELM_WIN_TRAP_VERSION))
{
CRITICAL("trying to set a trap version %lu while %lu was expected!",
t->version, ELM_WIN_TRAP_VERSION);
return EINA_FALSE;
}
trap = t;
return EINA_TRUE;
}

View File

@ -1338,6 +1338,69 @@ EAPI Ecore_X_Window elm_win_xwindow_get(const Evas_Object *obj);
*/
EAPI Ecore_Wl_Window *elm_win_wl_window_get(const Evas_Object *obj);
/**
* @typedef Elm_Win_Trap
*
* Trap can be set with elm_win_trap_set() and will intercept the
* calls to internal ecore_evas with the same name and parameters. If
* there is a trap and it returns @c EINA_TRUE then the call will be
* allowed, otherwise it will be ignored.
*/
typedef struct _Elm_Win_Trap Elm_Win_Trap;
struct _Elm_Win_Trap
{
#define ELM_WIN_TRAP_VERSION (1UL)
unsigned long version;
void *(*add)(Evas_Object *o); /**< object was just added. The returned pointer will be handled to every other trap call. */
void (*del)(void *data, Evas_Object *o); /**< object will be deleted. */
Eina_Bool (*hide)(void *data, Evas_Object *o);
Eina_Bool (*show)(void *data, Evas_Object *o);
Eina_Bool (*move)(void *data, Evas_Object *o, int x, int y);
Eina_Bool (*resize)(void *data, Evas_Object *o, int w, int h);
Eina_Bool (*center)(void *data, Evas_Object *o); /* not in ecore_evas, but nice to trap */
Eina_Bool (*lower)(void *data, Evas_Object *o);
Eina_Bool (*raise)(void *data, Evas_Object *o);
Eina_Bool (*activate)(void *data, Evas_Object *o);
Eina_Bool (*alpha_set)(void *data, Evas_Object *o, Eina_Bool alpha);
Eina_Bool (*aspect_set)(void *data, Evas_Object *o, double aspect);
Eina_Bool (*avoid_damage_set)(void *data, Evas_Object *o, Ecore_Evas_Avoid_Damage_Type on);
Eina_Bool (*borderless_set)(void *data, Evas_Object *o, Eina_Bool on);
Eina_Bool (*demand_attention_set)(void *data, Evas_Object *o, Eina_Bool on);
Eina_Bool (*focus_skip_set)(void *data, Evas_Object *o, Eina_Bool skip);
Eina_Bool (*fullscreen_set)(void *data, Evas_Object *o, Eina_Bool on);
Eina_Bool (*iconified_set)(void *data, Evas_Object *o, Eina_Bool on);
Eina_Bool (*layer_set)(void *data, Evas_Object *o, int layer);
Eina_Bool (*manual_render_set)(void *data, Evas_Object *o, Eina_Bool manual_render);
Eina_Bool (*maximized_set)(void *data, Evas_Object *o, Eina_Bool on);
Eina_Bool (*modal_set)(void *data, Evas_Object *o, Eina_Bool on);
Eina_Bool (*name_class_set)(void *data, Evas_Object *o, const char *n, const char *c);
Eina_Bool (*object_cursor_set)(void *data, Evas_Object *o, Evas_Object *obj, int layer, int hot_x, int hot_y);
Eina_Bool (*override_set)(void *data, Evas_Object *o, Eina_Bool on);
Eina_Bool (*rotation_set)(void *data, Evas_Object *o, int rot);
Eina_Bool (*rotation_with_resize_set)(void *data, Evas_Object *o, int rot);
Eina_Bool (*shaped_set)(void *data, Evas_Object *o, Eina_Bool shaped);
Eina_Bool (*size_base_set)(void *data, Evas_Object *o, int w, int h);
Eina_Bool (*size_step_set)(void *data, Evas_Object *o, int w, int h);
Eina_Bool (*size_min_set)(void *data, Evas_Object *o, int w, int h);
Eina_Bool (*size_max_set)(void *data, Evas_Object *o, int w, int h);
Eina_Bool (*sticky_set)(void *data, Evas_Object *o, Eina_Bool sticky);
Eina_Bool (*title_set)(void *data, Evas_Object *o, const char *t);
Eina_Bool (*urgent_set)(void *data, Evas_Object *o, Eina_Bool urgent);
Eina_Bool (*withdrawn_set)(void *data, Evas_Object *o, Eina_Bool withdrawn);
};
/**
* Sets the trap to be used for internal @c Ecore_Evas management.
*
* @param trap the trap to be used or @c NULL to remove traps. Pointer
* is not modified or copied, keep it alive.
* @return @c EINA_TRUE on success, @c EINA_FALSE if there was a
* problem, such as invalid version number.
*
* @warning this is an advanced feature that you should avoid using.
*/
EAPI Eina_Bool elm_win_trap_set(const Elm_Win_Trap *trap);
/**
* @}
*/