#include "e.h"
+const char *EMBEDDED_CLIENT_DATA_KEY = "Embedded Client";
+
static int _e_client_hooks_delete = 0;
static int _e_client_hooks_walking = 0;
e_object_unref(E_OBJECT(ec->e.state.profile.wait_desk));
}
ec->e.state.profile.wait_desk = NULL;
+
+ evas_object_data_del(ec->frame, EMBEDDED_CLIENT_DATA_KEY);
E_FREE_FUNC(ec->frame, evas_object_del);
if (ec == focused)
if (!ec) return NULL;
return ec->comp_data;
-}
\ No newline at end of file
+}
+
+EINTERN Eina_Bool
+e_client_embedded_client_set(E_Client *ec, E_Client *embedded_ec)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(ec->frame, EINA_FALSE);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(embedded_ec, EINA_FALSE);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(embedded_ec->frame, EINA_FALSE);
+
+ eina_stringshare_replace(&ec->netwm.name, "Container Client");
+ eina_stringshare_replace(&embedded_ec->netwm.name, "Embedded Client");
+
+ evas_object_data_set(ec->frame, EMBEDDED_CLIENT_DATA_KEY, embedded_ec);
+ e_comp_object_embedded_comp_object_set(ec->frame, embedded_ec->frame);
+
+ return EINA_TRUE;
+}
+
+EINTERN void
+e_client_embedded_client_unset(E_Client *ec)
+{
+ E_Client *embedded_ec;
+
+ EINA_SAFETY_ON_NULL_RETURN(ec);
+ EINA_SAFETY_ON_NULL_RETURN(ec->frame);
+
+ embedded_ec = evas_object_data_get(ec->frame, EMBEDDED_CLIENT_DATA_KEY);
+ if (!embedded_ec)
+ {
+ ELOGF("E_CLIENT", "Cannot find data for embedded client", ec);
+ return;
+ }
+
+ eina_stringshare_replace(&ec->netwm.name, NULL);
+ eina_stringshare_replace(&embedded_ec->netwm.name, NULL);
+
+ e_comp_object_embedded_comp_object_unset(ec->frame);
+ evas_object_data_del(ec->frame, EMBEDDED_CLIENT_DATA_KEY);
+}
+
+EINTERN Eina_Bool
+e_client_embedded_client_check(E_Client *ec)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(ec->frame, EINA_FALSE);
+
+ return !!evas_object_data_get(ec->frame, EMBEDDED_CLIENT_DATA_KEY);
+}
Eina_Bool external_content : 1; // e.swallow.content(obj) is set by external evas object
Eina_Bool user_alpha_set : 1;
Eina_Bool user_alpha : 1;
+ Eina_Bool embedded : 1;
struct
{
{
Eina_Bool alpha = cw->ec->argb;
- if ((cw->external_content) &&
- (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
+ if (((cw->external_content) &&
+ (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE)) ||
+ (cw->embedded))
{
return;
}
(!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph))))
return;
- if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE ||
- cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE)
+ if ((cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE ||
+ cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE) ||
+ (cw->embedded))
pw = w, ph = h;
prev_w = cw->w, prev_h = cw->h;
e_comp_object_frame_wh_adjust(obj, 0, 0, &fw, &fh);
evas_object_hide(obj);
return;
}
+
+ if (cw->embedded)
+ {
+ ELOGF("COMP", "Hide container evas_object:%p", cw->ec, obj);
+ evas_object_hide(obj);
+ return;
+ }
+
/* already hidden or currently animating */
if ((!cw->visible) || (cw->animating && cw->hiding && (!cw->ec->iconic)))
{
return;
}
- if ((!cw->updates) && (!ec->input_only) && (!ec->ignored))
+ if ((!cw->updates) && (!ec->input_only) && (!ec->ignored) && (!cw->embedded))
{
int pw, ph;
ELOGF("COMP", "show_helper. return. new_client", ec);
return;
}
- if (ec->input_only)
+ if ((ec->input_only) || (cw->embedded))
{
/* who cares */
cw->real_hid = 0;
e_comp_object_map_update(obj);
+ if (cw->embedded)
+ {
+ evas_object_show(cw->effect_obj);
+ TRACE_DS_END();
+ return;
+ }
+
EINA_LIST_FOREACH(cw->ec->e.state.video_child, l, tmp)
evas_object_show(tmp->frame);
if (cw->input_obj) evas_object_move(cw->input_obj, x, y);
e_comp_object_map_update(obj);
+
+ if (cw->embedded)
+ evas_object_move(cw->obj, x, y);
}
static void
{
API_ENTRY;
- if ((cw->external_content) &&
- (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
+ if (((cw->external_content) &&
+ (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE)) ||
+ (cw->embedded))
{
WRN("Can set up alpha value to ONLY evas \"image\" object. "
"But current external content is %d object for %p.",
int tw, th;
API_ENTRY;
- if ((cw->external_content) &&
- (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
+ if (((cw->external_content) &&
+ (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE)) ||
+ (cw->embedded))
{
WRN("Can set up size to ONLY evas \"image\" object. "
"But current external content is %d object for %p.",
return EINA_TRUE;
}
+
+static void
+_e_comp_object_cb_embedded_comp_object_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ E_Comp_Object *cw;
+
+ cw = data;
+
+ evas_object_smart_member_del(cw->obj);
+ evas_object_event_callback_del(cw->obj, EVAS_CALLBACK_DEL, _e_comp_object_cb_embedded_comp_object_del);
+ cw->obj = NULL;
+}
+
+EINTERN Eina_Bool
+e_comp_object_embedded_comp_object_set(Evas_Object *obj, Evas_Object *in_obj)
+{
+ API_ENTRY EINA_FALSE;
+
+ cw->embedded = EINA_TRUE;
+ cw->external_content = EINA_TRUE;
+
+ cw->effect_obj = evas_object_rectangle_add(e_comp->evas);
+ evas_object_color_set(cw->effect_obj, 0, 0, 0, 0);
+ evas_object_smart_member_add(cw->effect_obj, cw->smart_obj);
+
+ cw->obj = in_obj;
+ evas_object_smart_member_add(cw->obj, cw->smart_obj);
+ evas_object_event_callback_add(cw->obj, EVAS_CALLBACK_DEL, _e_comp_object_cb_embedded_comp_object_del, cw);
+
+ return EINA_TRUE;
+}
+
+EINTERN void
+e_comp_object_embedded_comp_object_unset(Evas_Object *obj)
+{
+ API_ENTRY;
+
+ if (!cw->embedded)
+ return;
+
+ cw->embedded = EINA_FALSE;
+ cw->external_content = EINA_FALSE;
+
+ evas_object_del(cw->effect_obj);
+ cw->effect_obj = NULL;
+
+ if (cw->obj)
+ {
+ evas_object_event_callback_del(cw->obj, EVAS_CALLBACK_DEL, _e_comp_object_cb_embedded_comp_object_del);
+ evas_object_smart_member_del(cw->obj);
+ cw->obj = NULL;
+ }
+}
}
}
- /* map or unmap ec */
- if (!e_pixmap_usable_get(ec->pixmap))
+ if (!e_client_embedded_client_check(ec))
{
- /* unmap ec */
- if (cdata->mapped)
+ /* map or unmap ec */
+ if (!e_pixmap_usable_get(ec->pixmap))
{
- if ((cdata->shell.surface) &&
- (cdata->shell.unmap))
+ /* unmap ec */
+ if (cdata->mapped)
{
- ELOGF("COMP", "Try to unmap. Call shell.unmap.", ec);
- if (ec->show_pending.count > 0)
+ if ((cdata->shell.surface) &&
+ (cdata->shell.unmap))
{
- ELOGF("E_CLIENT", "Reset show_pending!!! (count:%d, run:%d)", ec, ec->show_pending.count, ec->show_pending.running);
- ec->show_pending.count = 0;
- if (ec->show_pending.running)
+ ELOGF("COMP", "Try to unmap. Call shell.unmap.", ec);
+ if (ec->show_pending.count > 0)
{
- // need to send visibility false;
- ec->visibility.obscured = E_VISIBILITY_UNOBSCURED;
- ELOGF("POL_VIS", "CLIENT VIS ON (fake). argb:%d, opaque:%2d", ec, ec->argb, ec->visibility.opaque);
- EC_CHANGED(ec);
+ ELOGF("E_CLIENT", "Reset show_pending!!! (count:%d, run:%d)", ec, ec->show_pending.count, ec->show_pending.running);
+ ec->show_pending.count = 0;
+ if (ec->show_pending.running)
+ {
+ // need to send visibility false;
+ ec->visibility.obscured = E_VISIBILITY_UNOBSCURED;
+ ELOGF("POL_VIS", "CLIENT VIS ON (fake). argb:%d, opaque:%2d", ec, ec->argb, ec->visibility.opaque);
+ EC_CHANGED(ec);
+ }
+ ec->show_pending.running = EINA_FALSE;
}
- ec->show_pending.running = EINA_FALSE;
+ cdata->shell.unmap(cdata->shell.surface);
+ }
+ else if ((ec->internal) ||
+ (cdata->sub.data) ||
+ (ec == e_comp_wl->drag_client))
+ {
+ ELOGF("COMP", "Try to unmap. Hide window. internal:%d, sub:%p, drag:%d",
+ ec, ec->internal, cdata->sub.data, (ec == e_comp_wl->drag_client));
+ ec->visible = EINA_FALSE;
+ evas_object_hide(ec->frame);
+ cdata->mapped = 0;
}
- cdata->shell.unmap(cdata->shell.surface);
}
- else if ((ec->internal) ||
- (cdata->sub.data) ||
- (ec == e_comp_wl->drag_client))
+
+ if ((cdata->sub.below_obj) &&
+ (evas_object_visible_get(cdata->sub.below_obj)))
{
- ELOGF("COMP", "Try to unmap. Hide window. internal:%d, sub:%p, drag:%d",
- ec, ec->internal, cdata->sub.data, (ec == e_comp_wl->drag_client));
- ec->visible = EINA_FALSE;
- evas_object_hide(ec->frame);
- cdata->mapped = 0;
+ evas_object_hide(cdata->sub.below_obj);
}
}
-
- if ((cdata->sub.below_obj) &&
- (evas_object_visible_get(cdata->sub.below_obj)))
- {
- evas_object_hide(cdata->sub.below_obj);
- }
- }
- else
- {
- /* map ec */
- if (!cdata->mapped)
+ else
{
- if ((cdata->shell.surface) &&
- (cdata->shell.map) &&
- (!ec->ignored))
+ /* map ec */
+ if (!cdata->mapped)
{
- ELOGF("COMP", "Try to map. Call shell.map.", ec);
- cdata->shell.map(cdata->shell.surface);
+ if ((cdata->shell.surface) &&
+ (cdata->shell.map) &&
+ (!ec->ignored))
+ {
+ ELOGF("COMP", "Try to map. Call shell.map.", ec);
+ cdata->shell.map(cdata->shell.surface);
+ }
+ else if ((ec->internal) ||
+ (e_comp_wl_subsurface_can_show(ec)) ||
+ (ec == e_comp_wl->drag_client))
+ {
+ ELOGF("COMP", "Try to map. Show window. internal:%d, drag:%d",
+ ec, ec->internal, (ec == e_comp_wl->drag_client));
+ ec->visible = EINA_TRUE;
+ ec->ignored = 0;
+ evas_object_show(ec->frame);
+ cdata->mapped = 1;
+ }
}
- else if ((ec->internal) ||
- (e_comp_wl_subsurface_can_show(ec)) ||
- (ec == e_comp_wl->drag_client))
+
+ if ((cdata->sub.below_obj) &&
+ (!evas_object_visible_get(cdata->sub.below_obj)) &&
+ (evas_object_visible_get(ec->frame)))
{
- ELOGF("COMP", "Try to map. Show window. internal:%d, drag:%d",
- ec, ec->internal, (ec == e_comp_wl->drag_client));
- ec->visible = EINA_TRUE;
- ec->ignored = 0;
- evas_object_show(ec->frame);
- cdata->mapped = 1;
+ evas_object_show(cdata->sub.below_obj);
}
}
-
- if ((cdata->sub.below_obj) &&
- (!evas_object_visible_get(cdata->sub.below_obj)) &&
- (evas_object_visible_get(ec->frame)))
- {
- evas_object_show(cdata->sub.below_obj);
- }
}
if ((state->new_attach) ||
e_comp_wl_subsurface_restack_bg_rectangle(topmost);
}
- if (!e_pixmap_usable_get(ec->pixmap))
+ if (!e_client_embedded_client_check(ec))
{
- if (ec->comp_data->mapped)
+ if (!e_pixmap_usable_get(ec->pixmap))
{
- if ((ec->comp_data->shell.surface) && (ec->comp_data->shell.unmap))
- {
- ELOGF("COMP", "Try to unmap2. Call shell.unmap.", ec);
- ec->comp_data->shell.unmap(ec->comp_data->shell.surface);
- }
- else if (ec->internal || ec->comp_data->sub.data ||
- (ec == e_comp_wl->drag_client))
+ if (ec->comp_data->mapped)
{
- ELOGF("COMP", "Try to unmap2. Hide window. internal:%d, sub:%p, drag:%d",
- ec, ec->internal, ec->comp_data->sub.data, (ec == e_comp_wl->drag_client));
- ec->visible = EINA_FALSE;
- evas_object_hide(ec->frame);
- ec->comp_data->mapped = 0;
+ if ((ec->comp_data->shell.surface) && (ec->comp_data->shell.unmap))
+ {
+ ELOGF("COMP", "Try to unmap2. Call shell.unmap.", ec);
+ ec->comp_data->shell.unmap(ec->comp_data->shell.surface);
+ }
+ else if (ec->internal || ec->comp_data->sub.data ||
+ (ec == e_comp_wl->drag_client))
+ {
+ ELOGF("COMP", "Try to unmap2. Hide window. internal:%d, sub:%p, drag:%d",
+ ec, ec->internal, ec->comp_data->sub.data, (ec == e_comp_wl->drag_client));
+ ec->visible = EINA_FALSE;
+ evas_object_hide(ec->frame);
+ ec->comp_data->mapped = 0;
+ }
}
- }
- if (ec->comp_data->sub.below_obj && evas_object_visible_get(ec->comp_data->sub.below_obj))
- evas_object_hide(ec->comp_data->sub.below_obj);
- }
- else
- {
- if (!ec->comp_data->mapped)
+ if (ec->comp_data->sub.below_obj && evas_object_visible_get(ec->comp_data->sub.below_obj))
+ evas_object_hide(ec->comp_data->sub.below_obj);
+ }
+ else
{
- if ((ec->comp_data->shell.surface) && (ec->comp_data->shell.map) &&
- (!ec->ignored))
- {
- ELOGF("COMP", "Try to map2. Call shell.map.", ec);
- ec->comp_data->shell.map(ec->comp_data->shell.surface);
- }
- else if (ec->internal || e_comp_wl_subsurface_can_show(ec) ||
- (ec == e_comp_wl->drag_client))
+ if (!ec->comp_data->mapped)
{
- ELOGF("COMP", "Try to map2. Show window. internal:%d, drag:%d",
- ec, ec->internal, (ec == e_comp_wl->drag_client));
- ec->visible = EINA_TRUE;
- ec->ignored = 0;
- evas_object_show(ec->frame);
- ec->comp_data->mapped = 1;
+ if ((ec->comp_data->shell.surface) && (ec->comp_data->shell.map) &&
+ (!ec->ignored))
+ {
+ ELOGF("COMP", "Try to map2. Call shell.map.", ec);
+ ec->comp_data->shell.map(ec->comp_data->shell.surface);
+ }
+ else if (ec->internal || e_comp_wl_subsurface_can_show(ec) ||
+ (ec == e_comp_wl->drag_client))
+ {
+ ELOGF("COMP", "Try to map2. Show window. internal:%d, drag:%d",
+ ec, ec->internal, (ec == e_comp_wl->drag_client));
+ ec->visible = EINA_TRUE;
+ ec->ignored = 0;
+ evas_object_show(ec->frame);
+ ec->comp_data->mapped = 1;
+ }
}
- }
- if (ec->comp_data->sub.below_obj && !evas_object_visible_get(ec->comp_data->sub.below_obj)
- && evas_object_visible_get(ec->frame))
- evas_object_show(ec->comp_data->sub.below_obj);
+ if (ec->comp_data->sub.below_obj && !evas_object_visible_get(ec->comp_data->sub.below_obj)
+ && evas_object_visible_get(ec->frame))
+ evas_object_show(ec->comp_data->sub.below_obj);
+ }
}
+
ec->ignored = ignored;
if (ec->is_cursor && ec->visible)