"resource is NULL");
/*
- EOM_DBG(" wl_buff:%dx%d type:%d",
+ EOM_DBG("wl_buff:%dx%d type:%d",
external_wl_buffer->w,
external_wl_buffer->h,
external_wl_buffer->type);
if (resource == NULL || output_id <= 0 || surface == NULL)
return;
- EOM_DBG(" 11111111 output id:%d resource:%p surface:%p",
+ EOM_DBG("set xdg output id:%d resource:%p surface:%p",
output_id, resource, surface);
if (!(ec = wl_resource_get_user_data(surface)))
if (resource == NULL || output_id <= 0 || surface == NULL)
return;
- EOM_DBG("output id:%d resource:%p surface:%p",
+ EOM_DBG("set shell output id:%d resource:%p surface:%p",
output_id, resource, surface);
if (!(ec = wl_resource_get_user_data(surface)))
}
}
+static Eina_Bool
+_e_eom_cb_comp_object_redirected(void *data, E_Client *ec)
+{
+ E_EomCompObjectInterceptHookData *hook_data;
+
+ EOM_DBG("_e_eom_cb_comp_object_redirected");
+
+ RETURNVALIFTRUE(data == NULL, EINA_TRUE, "data is NULL");
+
+ hook_data = (E_EomCompObjectInterceptHookData* )data;
+
+ RETURNVALIFTRUE(hook_data->ec == NULL, EINA_TRUE, "hook_data->ec is NULL");
+ RETURNVALIFTRUE(hook_data->hook == NULL, EINA_TRUE, "hook_data->hook is NULL");
+ RETURNVALIFTRUE(hook_data->ec != ec, EINA_TRUE, "hook_data->ec != ec");
+
+ /* Hide the window from Enlightenment main screen */
+ e_comp_object_redirected_set(ec->frame, EINA_FALSE);
+
+ e_comp_object_intercept_hook_del(hook_data->hook);
+
+ g_eom->comp_object_intercept_hooks = eina_list_remove(g_eom->comp_object_intercept_hooks,
+ hook_data);
+
+ free(hook_data);
+
+ return EINA_TRUE;
+}
+
static Eina_Bool
_e_eom_output_init(tdm_display *dpy)
{
E_EomOutputPtr eom_output = NULL;
E_EomClientPtr eom_client = NULL;
E_Comp_Client_Data *cdata = NULL;
+ Eina_Bool ret = EINA_FALSE;
if (resource == NULL || output_id <= 0 || ec == NULL)
return;
cdata = ec->comp_data;
RETURNIFTRUE(cdata == NULL, "cdata is NULL");
- RETURNIFTRUE(cdata->shell.configure_send == NULL, " cdata->shell.configure_send is NULL");
+ RETURNIFTRUE(cdata->shell.configure_send == NULL, "cdata->shell.configure_send is NULL");
eom_client = _e_eom_client_get_by_resource(resource);
RETURNIFTRUE(eom_client == NULL, "eom_client is NULL");
- RETURNIFTRUE(eom_client->current == EINA_FALSE, " not current client is going to set its window");
+ RETURNIFTRUE(eom_client->current == EINA_FALSE, "not current client is going to set its window");
eom_output = _e_eom_output_get_by_id(output_id);
RETURNIFTRUE(eom_output == NULL, "eom_output is NULL");
- cdata->shell.configure_send(ec->comp_data->shell.surface, 0, eom_output->width, eom_output->height);
+ ret = _e_eom_util_add_comp_object_redirected_hook(ec);
+ RETURNIFTRUE(ret != EINA_TRUE, "Set redirect comp hook failed");
- /* Hide the window from e compositing
- * TODO: It is not work find other solution
- */
- e_comp_object_redirected_set(ec->frame, 0);
+ EOM_DBG("e_comp_object_redirected_set (ec->frame:%p)\n", ec->frame);
+
+ /* Send reconfigure event to a client which will resize its window to
+ * external output resolution in respond */
+ cdata->shell.configure_send(ec->comp_data->shell.surface, 0, eom_output->width, eom_output->height);
/* ec is used in buffer_change callback for distinguishing external ec and its buffers */
eom_client->ec = ec;
&buffer_info) != TBM_SURFACE_ERROR_NONE)
{
EOM_ERR("map buffer");
+ tbm_surface_destroy(buffer);
return NULL;
}
}
}
+static Eina_Bool
+_e_eom_util_add_comp_object_redirected_hook(E_Client *ec)
+{
+ E_EomCompObjectInterceptHookData *hook_data = NULL;
+ E_Comp_Object_Intercept_Hook *hook = NULL;
+
+ hook_data = E_NEW(E_EomCompObjectInterceptHookData, 1);
+ GOTOIFTRUE(hook_data == NULL, err, "hook_data = NULL");
+
+ hook_data->ec = ec;
+
+ hook = e_comp_object_intercept_hook_add(E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER,
+ _e_eom_cb_comp_object_redirected,
+ hook_data);
+ GOTOIFTRUE(hook == NULL, err, "hook = NULL");
+
+ hook_data->hook = hook;
+
+ g_eom->comp_object_intercept_hooks = eina_list_append(g_eom->comp_object_intercept_hooks,
+ hook_data);
+
+ EOM_DBG("_e_eom_redirected_hook have been added");
+ return EINA_TRUE;
+
+err:
+ if (hook_data)
+ free(hook_data);
+ return EINA_FALSE;
+}
+
static int
_e_eom_util_get_stamp()
{
typedef struct _E_Eom_Output E_EomOutput, *E_EomOutputPtr;
typedef struct _E_Eom_Client_Buffer E_EomClientBuffer, *E_EomClientBufferPtr;
typedef struct _E_Eom_Client E_EomClient, *E_EomClientPtr;
+typedef struct _E_Eom_Comp_Object_Intercept_Hook_Data E_EomCompObjectInterceptHookData;
typedef enum
{
int width;
int height;
+ unsigned int output_count;
+ Eina_List *outputs;
Eina_List *clients;
Eina_List *handlers;
- Eina_List *outputs;
- unsigned int output_count;
+ Eina_List *comp_object_intercept_hooks;
};
struct _E_Eom_Client
unsigned long stamp;
};
+struct _E_Eom_Comp_Object_Intercept_Hook_Data
+{
+ E_Client *ec;
+ E_Comp_Object_Intercept_Hook *hook;
+};
+
static Eina_Bool _e_eom_init();
static Eina_Bool _e_eom_init_internal();
static void _e_eom_deinit();
void *user_data);
static void _e_eom_cb_tdm_output_status_change(tdm_output *output, tdm_output_change_type type,
tdm_value value, void *user_data);
+static Eina_Bool _e_eom_cb_comp_object_redirected(void *data, E_Client *ec);
static Eina_Bool _e_eom_output_init(tdm_display *dpy);
static const tdm_output_mode *_e_eom_output_get_best_mode(tdm_output *output);
static void _e_eom_util_calculate_fullsize(int src_h, int src_v, int dst_size_h, int dst_size_v,
int *dst_x, int *dst_y, int *dst_w, int *dst_h);
static tbm_surface_h _e_eom_util_get_output_surface(const char *name);
+static Eina_Bool _e_eom_util_add_comp_object_redirected_hook(E_Client *ec);
static int _e_eom_util_get_stamp();
#if 0
static void _e_eom_util_draw(tbm_surface_h surface);