/**
* @defgroup Ecore_Evas_Extn External plug/socket infrastructure to remote canvases
*
- * These functions allow 1 process to create a "socket" into which another
- * process can create a "plug" remotely to plug into and provide content
- * for that socket. This is best for small sized objects (about the size range
- * of a small icon up to a few large icons). Sine the socket is actually an
- * image object, you cvan fetch the pixel data
+ * These functions allow 1 process to create a "socket" was pluged into which another
+ * process can create a "plug" remotely to plug into.
+ * Socket can provides content for several plugs.
+ * This is best for small sized objects (about the size range
+ * of a small icon up to a few large icons). Sine the plug is actually an
+ * image object, you can fetch the pixel data
*
* @since 1.2
* @{
/**
* Create a new external ecore evas socket
*
- * @param ee_target The Ecore_Evas containing the canvas in which the new image object will live.
* @param svcname The name of the service to be advertised. ensure that it is unique (when combined with @p svcnum) otherwise creation may fail.
* @param svcnum A number (any value, 0 beig the common default) to differentiate multiple instances of services with the same name.
* @param svcsys A boolean that if true, specifies to create a system-wide service all users can connect to, otherwise the service is private to the user ide that created the service.
- * @return An evas image object that will contain the image output of a plug when it plugs in
- *
- * This creates an image object that will contain the output of another
- * processes plug canvas when it connects. All input will be sent back to
- * this process as well, effectively swallowing or placing the plug process
- * in the canvas of the socket process in place of the image object. The image
- * object by default is created to be filled (equivalent of
- * evas_object_image_filled_add() on creation) so image content will scale
- * toi fill the image unless otherwise reconfigured. The Ecore_Evas size
- * of the socket is the master size and determines size in pixels of the
- * plug canvas. You can change the size with something like:
- *
- * @code
- * ecore_evas_resize(ecore_evas_object_ecore_evas_get(obj), 240, 400);
- * @endcode
*
- * The image object begins as a blank object until a plug client connects.
+ * This creates an Ecore_evas canvas wrapper and creates
+ * socket specified by @p svcname, @p svcnum and @p svcsys. If creation
+ * is successful, an Ecore_Evas handle is returned or NULL if creation
+ * fails. Also focus, show, hide etc. callbacks
+ * will also be called if the plug object is shown, or already visible on
+ * connect, or if it is hidden later, focused or unfocused.
+ *
+ * The server create ecore buffer canvas.
* When a client connects, you will get the ECORE_EVAS_EXTN_CLIENT_ADD event
* in the ecore event queue, with event_info being the image object pointer
- * passed as a void pointer. When a cllient disconnects you will get the
- * ECORE_EVAS_EXTN_CLIENT_DEL event, and the image object will become blank.
+ * passed as a void pointer. When a client disconnects you will get the
+ * ECORE_EVAS_EXTN_CLIENT_DEL event.
+ * When a server disconnects, the image object will become blank.
*
* You can set up event handles for these events as follows:
*
* Note that events come in later after the event happened. You may want to be
* careful as data structures you had associated with the image object
* may have been freed after deleting, but the object may still be around
- * awating cleanup and thus still be valid.
+ * awating cleanup and thus still be valid.You can change the size with something like:
*
- * @see ecore_evas_extn_socket_object_data_lock()
- * @see ecore_evas_extn_socket_object_data_unlock()
+ * @code
+ * Ecore_Evas *ee = ecore_evas_extn_socket_new("svcname", 1, EINA_FALSE);
+ * ecore_evas_resize(ee, 240, 400);
+ * @endcode
+
* @see ecore_evas_extn_plug_new()
+ * @see ecore_evas_extn_plug_object_data_lock()
+ * @see ecore_evas_extn_plug_object_data_unlock()
*
* @since 1.2
*/
-EAPI Evas_Object *ecore_evas_extn_socket_new(Ecore_Evas *ee_target, const char *svcname, int svcnum, Eina_Bool svcsys);
+EAPI Ecore_Evas *ecore_evas_extn_socket_new(const char *svcname, int svcnum, Eina_Bool svcsys);
/**
- * Lock the pixel data so the plug cannot change it
+ * Lock the pixel data so the socket cannot change it
*
- * @param obj The image object returned by ecore_evas_extn_socket_new() to lock
+ * @param obj The image object returned by ecore_evas_extn_plug_new() to lock
*
* You may need to get the image pixel data with evas_object_image_data_get()
* from the image object, but need to ensure that it does not change while
*
* You should only hold the lock for just as long as you need to read out the
* image data or otherwise deal with it, and then unlokc it with
- * ecore_evas_extn_socket_object_data_unlock(). Keeping a lock over more than
+ * ecore_evas_extn_plug_object_data_unlock(). Keeping a lock over more than
* 1 iteration of the main ecore loop will be problematic, so avoid it. Also
- * forgetting to unlock may cause the plug process to freeze and thus create
+ * forgetting to unlock may cause the socket process to freeze and thus create
* odd behavior.
*
- * @see ecore_evas_extn_socket_new()
- * @see ecore_evas_extn_socket_object_data_unlock()
+ * @see ecore_evas_extn_plug_new()
+ * @see ecore_evas_extn_plug_object_data_unlock()
*
* @since 1.2
*/
-EAPI void ecore_evas_extn_socket_object_data_lock(Evas_Object *obj);
+EAPI void ecore_evas_extn_plug_object_data_lock(Evas_Object *obj);
/**
- * Unlock the pixel data so the plug can change it again.
+ * Unlock the pixel data so the socket can change it again.
*
- * @param obj The image object returned by ecore_evas_extn_socket_new() to unlock
+ * @param obj The image object returned by ecore_evas_extn_plug_new() to unlock
*
* This unlocks after an advisor lock has been taken by
- * ecore_evas_extn_socket_object_data_lock().
+ * ecore_evas_extn_plug_object_data_lock().
*
- * @see ecore_evas_extn_socket_new()
- * @see ecore_evas_extn_socket_object_data_lock()
+ * @see ecore_evas_extn_plug_new()
+ * @see ecore_evas_extn_plug_object_data_lock()
*
* @since 1.2
*/
-EAPI void ecore_evas_extn_socket_object_data_unlock(Evas_Object *obj);
+EAPI void ecore_evas_extn_plug_object_data_unlock(Evas_Object *obj);
/**
* Create a new external ecore evas plug
*
+ * @param ee_target The Ecore_Evas containing the canvas in which the new image object will live.
* @param svcname The service name to connect to set up by the socket.
* @param svcnum The service number to connect to (set up by socket).
* @param svcsys Booleain to set if the service is a system one or not (set up by socket).
+ * @return An evas image object that will contain the image output of a socket.
+ *
+ * This creates an image object that will contain the output of another
+ * processes socket canvas when it connects. All input will be sent back to
+ * this process as well, effectively swallowing or placing the socket process
+ * in the canvas of the plug process in place of the image object. The image
+ * object by default is created to be filled (equivalent of
+ * evas_object_image_filled_add() on creation) so image content will scale
+ * toi fill the image unless otherwise reconfigured. The Ecore_Evas size
+ * of the plug is the master size and determines size in pixels of the
+ * plug canvas. You can change the size with something like:
+ *
+ * @code
+ * ecore_evas_resize(ecore_evas_object_ecore_evas_get(obj), 240, 400);
+ * @endcode
+ *
*
- * This creates an Ecore_evas canvas wrapper and connects it to the given
- * socket specified by @p svcname, @p svcnum and @p svcsys. If connection
- * is successful, an Ecore_Evas handle is returned or NULL if connection
- * fails. If the socket is deleted or disconnects you for whatever reason
- * youre Ecore_Evas will get a delete request event (the delete request
- * callback will be called, if set). Also focus, show, hide etc. callbacks
- * will also be called if the socket object is shown, or already visible on
- * connect, or if it is hidden later, focused or unfocused.
*
* @see ecore_evas_extn_socket_new()
*
* @since 1.2
*/
-EAPI Ecore_Evas *ecore_evas_extn_plug_new(const char *svcname, int svcnum, Eina_Bool svcsys);
+EAPI Evas_Object *ecore_evas_extn_plug_new(Ecore_Evas *ee_target, const char *svcname, int svcnum, Eina_Bool svcsys);
/**
* @}
struct _Extn
{
struct {
- Ecore_Ipc_Server *server;
- Ecore_Ipc_Client *client;
- Eina_List *handlers;
- Eina_Bool am_server : 1;
+ Ecore_Ipc_Server *server;
+ Eina_List *clients;
+ Eina_List *handlers;
+ Eina_Bool am_server : 1;
} ipc;
struct {
- const char *name;
- int num;
- Eina_Bool sys : 1;
+ const char *name;
+ int num;
+ Eina_Bool sys : 1;
} svc;
struct {
- const char *lock;
- int lockfd;
- const char *shm;
- int w, h;
- Shmfile *shmfile;
- Eina_List *updates;
- Eina_Bool have_lock : 1;
+ const char *lock;
+ int lockfd;
+ const char *shm;
+ int w, h;
+ Shmfile *shmfile;
+ Eina_List *updates;
+ Eina_Bool have_lock : 1;
} file;
};
}
static void
-_ecore_evas_extn_socket_targer_render_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
+_ecore_evas_extn_plug_targer_render_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
{
Ecore_Evas *ee = data;
if (ee) _ecore_evas_socket_lock(ee);
}
static void
-_ecore_evas_extn_socket_targer_render_post(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
+_ecore_evas_extn_plug_targer_render_post(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
{
Ecore_Evas *ee = data;
if (ee) _ecore_evas_socket_unlock(ee);
}
static void
-_ecore_evas_extn_socket_image_obj_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+_ecore_evas_extn_plug_image_obj_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Ecore_Evas *ee = data;
if (ee) ecore_evas_free(ee);
_ecore_evas_extn_free(Ecore_Evas *ee)
{
Extn *extn;
+ Ecore_Ipc_Client *client;
extn = ee->engine.buffer.data;
if (extn)
}
}
if (extn->svc.name) eina_stringshare_del(extn->svc.name);
- if (extn->ipc.client) ecore_ipc_client_del(extn->ipc.client);
+ if (extn->ipc.clients)
+ {
+ EINA_LIST_FREE(extn->ipc.clients, client)
+ ecore_ipc_client_del(client);
+ }
if (extn->ipc.server) ecore_ipc_server_del(extn->ipc.server);
if (extn->file.lock) eina_stringshare_del(extn->file.lock);
if (extn->file.shm) eina_stringshare_del(extn->file.shm);
if (extn->file.shmfile)
{
if (extn->ipc.am_server)
- shmfile_close(extn->file.shmfile);
- else
shmfile_free(extn->file.shmfile);
+ else
+ shmfile_close(extn->file.shmfile);
}
+
EINA_LIST_FREE(extn->ipc.handlers, hdl)
- ecore_event_handler_del(hdl);
+ ecore_event_handler_del(hdl);
free(extn);
ecore_ipc_shutdown();
ee->engine.buffer.data = NULL;
evas_object_event_callback_del_full(ee->engine.buffer.image,
EVAS_CALLBACK_DEL,
- _ecore_evas_extn_socket_image_obj_del,
+ _ecore_evas_extn_plug_image_obj_del,
ee);
evas_event_callback_del_full(evas_object_evas_get(ee->engine.buffer.image),
EVAS_CALLBACK_RENDER_PRE,
- _ecore_evas_extn_socket_targer_render_pre,
+ _ecore_evas_extn_plug_targer_render_pre,
ee);
evas_event_callback_del_full(evas_object_evas_get(ee->engine.buffer.image),
EVAS_CALLBACK_RENDER_POST,
- _ecore_evas_extn_socket_targer_render_post,
+ _ecore_evas_extn_plug_targer_render_post,
ee);
evas_object_del(ee->engine.buffer.image);
ee2 = evas_object_data_get(ee->engine.buffer.image, "Ecore_Evas_Parent");
_ecore_evas_resize(Ecore_Evas *ee, int w, int h)
{
Extn *extn;
+ Eina_List *l;
+ Ecore_Ipc_Client *client;
if (w < 1) w = 1;
if (h < 1) h = 1;
extn = ee->engine.buffer.data;
if (ee->engine.buffer.image)
evas_object_image_size_set(ee->engine.buffer.image, ee->w, ee->h);
- if ((extn) && (extn->ipc.client))
- {
- Ipc_Data_Resize ipc;
-
- ipc.w = ee->w;
- ipc.h = ee->h;
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_RESIZE, 0, 0, 0, &ipc, sizeof(ipc));
- }
+ /* Server can have many plugs, so I block resize comand from client to server *
+ if ((extn) && (extn->ipc.server))
+ {
+ Ipc_Data_Resize ipc;
+
+ ipc.w = ee->w;
+ ipc.h = ee->h;
+ ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_RESIZE, 0, 0, 0, &ipc, sizeof(ipc));
+ }*/
if (ee->func.fn_resize) ee->func.fn_resize(ee);
}
extn = ee->engine.buffer.data;
if (!extn) return;
- if (extn->ipc.client)
+ if (extn->ipc.server)
{
Ipc_Data_Ev_Mouse_In ipc;
ipc.timestamp = ev->timestamp;
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
ipc.event_flags = ev->event_flags;
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_EV_MOUSE_IN, 0, 0, 0, &ipc, sizeof(ipc));
+ ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_IN, 0, 0, 0, &ipc, sizeof(ipc));
}
}
extn = ee->engine.buffer.data;
if (!extn) return;
- if (extn->ipc.client)
+ if (extn->ipc.server)
{
Ipc_Data_Ev_Mouse_Out ipc;
ipc.timestamp = ev->timestamp;
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
ipc.event_flags = ev->event_flags;
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_EV_MOUSE_OUT, 0, 0, 0, &ipc, sizeof(ipc));
+ ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_OUT, 0, 0, 0, &ipc, sizeof(ipc));
}
}
extn = ee->engine.buffer.data;
if (!extn) return;
- if (extn->ipc.client)
+ if (extn->ipc.server)
{
Ipc_Data_Ev_Mouse_Down ipc;
ipc.timestamp = ev->timestamp;
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
ipc.event_flags = ev->event_flags;
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_EV_MOUSE_DOWN, 0, 0, 0, &ipc, sizeof(ipc));
+ ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_DOWN, 0, 0, 0, &ipc, sizeof(ipc));
}
}
extn = ee->engine.buffer.data;
if (!extn) return;
- if (extn->ipc.client)
+ if (extn->ipc.server)
{
Ipc_Data_Ev_Mouse_Up ipc;
ipc.timestamp = ev->timestamp;
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
ipc.event_flags = ev->event_flags;
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_EV_MOUSE_UP, 0, 0, 0, &ipc, sizeof(ipc));
+ ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_UP, 0, 0, 0, &ipc, sizeof(ipc));
}
}
extn = ee->engine.buffer.data;
if (!extn) return;
- if (extn->ipc.client)
+ if (extn->ipc.server)
{
Ipc_Data_Ev_Mouse_Move ipc;
Evas_Coord x, y;
ipc.timestamp = ev->timestamp;
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
ipc.event_flags = ev->event_flags;
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_EV_MOUSE_MOVE, 0, 0, 0, &ipc, sizeof(ipc));
+ ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_MOVE, 0, 0, 0, &ipc, sizeof(ipc));
}
}
extn = ee->engine.buffer.data;
if (!extn) return;
- if (extn->ipc.client)
+ if (extn->ipc.server)
{
Ipc_Data_Ev_Mouse_Wheel ipc;
ipc.timestamp = ev->timestamp;
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
ipc.event_flags = ev->event_flags;
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_EV_MOUSE_WHEEL, 0, 0, 0, &ipc, sizeof(ipc));
+ ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_WHEEL, 0, 0, 0, &ipc, sizeof(ipc));
}
}
extn = ee->engine.buffer.data;
if (!extn) return;
- if (extn->ipc.client)
+ if (extn->ipc.server)
{
Ipc_Data_Ev_Multi_Down ipc;
Evas_Coord x, y;
ipc.timestamp = ev->timestamp;
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
ipc.event_flags = ev->event_flags;
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_EV_MULTI_DOWN, 0, 0, 0, &ipc, sizeof(ipc));
+ ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MULTI_DOWN, 0, 0, 0, &ipc, sizeof(ipc));
}
}
extn = ee->engine.buffer.data;
if (!extn) return;
- if (extn->ipc.client)
+ if (extn->ipc.server)
{
Ipc_Data_Ev_Multi_Up ipc;
Evas_Coord x, y;
ipc.timestamp = ev->timestamp;
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
ipc.event_flags = ev->event_flags;
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_EV_MULTI_UP, 0, 0, 0, &ipc, sizeof(ipc));
+ ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MULTI_UP, 0, 0, 0, &ipc, sizeof(ipc));
}
}
extn = ee->engine.buffer.data;
if (!extn) return;
- if (extn->ipc.client)
+ if (extn->ipc.server)
{
Ipc_Data_Ev_Multi_Move ipc;
Evas_Coord x, y;
ipc.timestamp = ev->timestamp;
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
ipc.event_flags = ev->event_flags;
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_EV_MULTI_MOVE, 0, 0, 0, &ipc, sizeof(ipc));
+ ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MULTI_MOVE, 0, 0, 0, &ipc, sizeof(ipc));
}
}
extn = ee->engine.buffer.data;
if (!extn) return;
- if (extn->ipc.client)
+ if (extn->ipc.server)
{
Ipc_Data_Ev_Key_Down *ipc;
char *st, *p;
ipc->timestamp = ev->timestamp;
ipc->mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
ipc->event_flags = ev->event_flags;
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_EV_KEY_DOWN, 0, 0, 0, ipc, len);
+ ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_KEY_DOWN, 0, 0, 0, ipc, len);
}
}
extn = ee->engine.buffer.data;
if (!extn) return;
- if (extn->ipc.client)
+ if (extn->ipc.server)
{
Ipc_Data_Ev_Key_Up *ipc;
char *st, *p;
ipc->timestamp = ev->timestamp;
ipc->mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
ipc->event_flags = ev->event_flags;
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_EV_KEY_UP, 0, 0, 0, ipc, len);
+ ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_KEY_UP, 0, 0, 0, ipc, len);
}
}
extn = ee->engine.buffer.data;
if (!extn) return;
- if (extn->ipc.client)
+ if (extn->ipc.server)
{
Ipc_Data_Ev_Hold ipc;
ipc.hold = ev->hold;
ipc.timestamp = ev->timestamp;
ipc.event_flags = ev->event_flags;
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_EV_HOLD, 0, 0, 0, &ipc, sizeof(ipc));
+ ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_HOLD, 0, 0, 0, &ipc, sizeof(ipc));
}
}
ee->prop.focused = 1;
extn = ee->engine.buffer.data;
if (!extn) return;
- if (!extn->ipc.client) return;
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_FOCUS, 0, 0, 0, NULL, 0);
+ if (!extn->ipc.server) return;
+ ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_FOCUS, 0, 0, 0, NULL, 0);
}
static void
ee->prop.focused = 0;
extn = ee->engine.buffer.data;
if (!extn) return;
- if (!extn->ipc.client) return;
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_UNFOCUS, 0, 0, 0, NULL, 0);
+ if (!extn->ipc.server) return;
+ ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_UNFOCUS, 0, 0, 0, NULL, 0);
}
static void
ee->visible = 1;
extn = ee->engine.buffer.data;
if (!extn) return;
- if (!extn->ipc.client) return;
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_SHOW, 0, 0, 0, NULL, 0);
+ if (!extn->ipc.server) return;
+ ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_SHOW, 0, 0, 0, NULL, 0);
}
static void
ee->visible = 0;
extn = ee->engine.buffer.data;
if (!extn) return;
- if (!extn->ipc.client) return;
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_HIDE, 0, 0, 0, NULL, 0);
+ if (!extn->ipc.server) return;
+ ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_HIDE, 0, 0, 0, NULL, 0);
}
-static const Ecore_Evas_Engine_Func _ecore_extn_socket_engine_func =
+static const Ecore_Evas_Engine_Func _ecore_extn_plug_engine_func =
{
_ecore_evas_extn_free,
NULL,
};
static Eina_Bool
-_ipc_client_add(void *data, int type __UNUSED__, void *event)
+_ipc_server_add(void *data, int type __UNUSED__, void *event)
{
- Ecore_Ipc_Event_Client_Add *e = event;
+ Ecore_Ipc_Event_Server_Add *e = event;
Ecore_Evas *ee = data;
Extn *extn;
- if (ee != ecore_ipc_server_data_get(ecore_ipc_client_server_get(e->client)))
+ if (ee != ecore_ipc_server_data_get(e->server))
return ECORE_CALLBACK_PASS_ON;
if (!eina_list_data_find(extn_ee_list, ee))
return ECORE_CALLBACK_PASS_ON;
extn = ee->engine.buffer.data;
if (!extn) return ECORE_CALLBACK_PASS_ON;
- if (extn->ipc.client)
- {
- ecore_ipc_client_del(e->client);
- return ECORE_CALLBACK_PASS_ON;
- }
- extn->ipc.client = e->client;
-
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_LOCK_FILE, 0, 0, 0,
- extn->file.lock, strlen(extn->file.lock) + 1);
- {
- Ipc_Data_Resize ipc;
-
- ipc.w = ee->w;
- ipc.h = ee->h;
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_RESIZE, 0, 0, 0, &ipc, sizeof(ipc));
- }
- if (ee->visible)
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_SHOW, 0, 0, 0, NULL, 0);
- if (ee->prop.focused)
- ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_FOCUS, 0, 0, 0, NULL, 0);
- _ecore_evas_extn_event(ee, ECORE_EVAS_EXTN_CLIENT_ADD);
+ //FIXME: find a way to let app know server there
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
-_ipc_client_del(void *data, int type __UNUSED__, void *event)
+_ipc_server_del(void *data, int type __UNUSED__, void *event)
{
- Ecore_Ipc_Event_Client_Del *e = event;
+ Ecore_Ipc_Event_Server_Del *e = event;
Ecore_Evas *ee = data;
Extn *extn;
extn = ee->engine.buffer.data;
if (!extn) return ECORE_CALLBACK_PASS_ON;
- if (extn->ipc.client == e->client)
+ if (extn->ipc.server != e->server) return ECORE_CALLBACK_PASS_ON;
+ evas_object_image_data_set(ee->engine.buffer.image, NULL);
+ ee->engine.buffer.pixels = NULL;
+ if (extn->file.shmfile)
{
- evas_object_image_data_set(ee->engine.buffer.image, NULL);
- ee->engine.buffer.pixels = NULL;
- if (extn->file.shmfile)
- {
- shmfile_close(extn->file.shmfile);
- extn->file.shmfile = NULL;
- }
- if (extn->file.shm)
- {
- eina_stringshare_del(extn->file.shm);
- extn->file.shm = NULL;
- }
- extn->ipc.client = NULL;
+ shmfile_close(extn->file.shmfile);
+ extn->file.shmfile = NULL;
}
- _ecore_evas_extn_event(ee, ECORE_EVAS_EXTN_CLIENT_DEL);
+ if (extn->file.shm)
+ {
+ eina_stringshare_del(extn->file.shm);
+ extn->file.shm = NULL;
+ }
+ extn->ipc.server = NULL;
+ if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
-_ipc_client_data(void *data, int type __UNUSED__, void *event)
+_ipc_server_data(void *data, int type __UNUSED__, void *event)
{
- Ecore_Ipc_Event_Client_Data *e = event;
+ Ecore_Ipc_Event_Server_Data *e = event;
Ecore_Evas *ee = data;
Extn *extn;
- if (ee != ecore_ipc_server_data_get(ecore_ipc_client_server_get(e->client)))
+ if (ee != ecore_ipc_server_data_get(e->server))
return ECORE_CALLBACK_PASS_ON;
if (!eina_list_data_find(extn_ee_list, ee))
return ECORE_CALLBACK_PASS_ON;
}
}
break;
+ case OP_LOCK_FILE:
+ if ((e->data) && (e->size > 0) &&
+ (((unsigned char *)e->data)[e->size - 1] == 0))
+ {
+ if (extn->file.lockfd) close(extn->file.lockfd);
+ if (extn->file.lock) eina_stringshare_del(extn->file.lock);
+ extn->file.lock = eina_stringshare_add(e->data);
+ extn->file.lockfd = open(extn->file.lock, O_RDONLY);
+ }
+ break;
case OP_SHM_REF:
// e->ref == w
// e->ref_to == h
evas_object_image_data_set(ee->engine.buffer.image, NULL);
}
break;
+ case OP_RESIZE:
+ if ((e->data) && (e->size >= (int)sizeof(Ipc_Data_Resize)))
+ {
+ Ipc_Data_Resize *ipc = e->data;
+ _ecore_evas_resize(ee, ipc->w, ipc->h);
+ }
+ break;
default:
break;
}
#endif
EAPI Evas_Object *
-ecore_evas_extn_socket_new(Ecore_Evas *ee_target, const char *svcname, int svcnum, Eina_Bool svcsys)
+ecore_evas_extn_plug_new(Ecore_Evas *ee_target, const char *svcname, int svcnum, Eina_Bool svcsys)
{
#ifdef EXTN_ENABLED
Extn *extn;
ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
- ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_extn_socket_engine_func;
+ ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_extn_plug_engine_func;
- ee->driver = "extn_socket";
+ ee->driver = "extn_plug";
ee->rotation = 0;
ee->visible = 0;
evas_object_event_callback_add(ee->engine.buffer.image,
EVAS_CALLBACK_DEL,
- _ecore_evas_extn_socket_image_obj_del, ee);
+ _ecore_evas_extn_plug_image_obj_del, ee);
extn = calloc(1, sizeof(Extn));
if (!extn)
else
{
Ecore_Ipc_Type ipctype = ECORE_IPC_LOCAL_USER;
- char buf[PATH_MAX];
ecore_ipc_init();
extn->svc.name = eina_stringshare_add(svcname);
extn->svc.num = svcnum;
extn->svc.sys = svcsys;
- snprintf(buf, sizeof(buf), "/tmp/ee-lock-XXXXXX");
- extn->file.lockfd = mkstemp(buf);
- if (extn->file.lockfd >= 0)
- extn->file.lock = eina_stringshare_add(buf);
- if ((extn->file.lockfd < 0) || (!extn->file.lock))
- {
- if (extn->file.lockfd)
- {
- close(extn->file.lockfd);
- unlink(buf);
- }
- eina_stringshare_del(extn->svc.name);
- if (extn->file.lock) eina_stringshare_del(extn->file.lock);
- free(extn);
- ecore_ipc_shutdown();
- ecore_evas_free(ee);
- return NULL;
- }
if (extn->svc.sys) ipctype = ECORE_IPC_LOCAL_SYSTEM;
- extn->ipc.am_server = EINA_TRUE;
- extn->ipc.server = ecore_ipc_server_add(ipctype, extn->svc.name,
- extn->svc.num, ee);
+ extn->ipc.server = ecore_ipc_server_connect(ipctype, (char *)extn->svc.name,
+ extn->svc.num, ee);
if (!extn->ipc.server)
{
- if (extn->file.lockfd)
- {
- close(extn->file.lockfd);
- if (extn->file.lock) unlink(extn->file.lock);
- }
eina_stringshare_del(extn->svc.name);
- eina_stringshare_del(extn->file.lock);
free(extn);
ecore_ipc_shutdown();
ecore_evas_free(ee);
ee->engine.buffer.data = extn;
extn->ipc.handlers = eina_list_append
(extn->ipc.handlers,
- ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD,
- _ipc_client_add, ee));
+ ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD,
+ _ipc_server_add, ee));
extn->ipc.handlers = eina_list_append
(extn->ipc.handlers,
- ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL,
- _ipc_client_del, ee));
+ ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL,
+ _ipc_server_del, ee));
extn->ipc.handlers = eina_list_append
(extn->ipc.handlers,
- ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA,
- _ipc_client_data, ee));
+ ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DATA,
+ _ipc_server_data, ee));
}
extn_ee_list = eina_list_append(extn_ee_list, ee);
ee_target->sub_ecore_evas = eina_list_append(ee_target->sub_ecore_evas, ee);
evas_event_callback_add(ee_target->evas, EVAS_CALLBACK_RENDER_PRE,
- _ecore_evas_extn_socket_targer_render_pre, ee);
+ _ecore_evas_extn_plug_targer_render_pre, ee);
evas_event_callback_add(ee_target->evas, EVAS_CALLBACK_RENDER_POST,
- _ecore_evas_extn_socket_targer_render_post, ee);
+ _ecore_evas_extn_plug_targer_render_post, ee);
return o;
#else
return NULL;
}
EAPI void
-ecore_evas_extn_socket_object_data_lock(Evas_Object *obj)
+ecore_evas_extn_plug_object_data_lock(Evas_Object *obj)
{
#ifdef EXTN_ENABLED
Ecore_Evas *ee;
}
EAPI void
-ecore_evas_extn_socket_object_data_unlock(Evas_Object *obj)
+ecore_evas_extn_plug_object_data_unlock(Evas_Object *obj)
{
#ifdef EXTN_ENABLED
Ecore_Evas *ee;
#ifdef EXTN_ENABLED
static void
-_ecore_evas_plug_resize(Ecore_Evas *ee, int w, int h)
+_ecore_evas_socket_resize(Ecore_Evas *ee, int w, int h)
{
Extn *extn;
Evas_Engine_Info_Buffer *einfo;
evas_output_size_set(ee->evas, ee->w, ee->h);
evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
-
extn = ee->engine.buffer.data;
if (extn)
{
ee->w * ee->h * 4, extn->svc.sys);
if (extn->file.shmfile)
ee->engine.buffer.pixels = extn->file.shmfile->addr;
+
stride = ee->w * 4;
einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
if (einfo)
}
}
- if (extn->ipc.server && extn->file.shmfile)
+ if (extn->ipc.clients && extn->file.shmfile)
{
Ipc_Data_Resize ipc;
-
- ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_SHM_REF,
- ee->w, ee->h, ee->alpha,
- extn->file.shmfile->file,
- strlen(extn->file.shmfile->file) + 1);
+ Eina_List *l;
+ Ecore_Ipc_Client *client;
+
+ EINA_LIST_FOREACH(extn->ipc.clients, l, client)
+ ecore_ipc_client_send(client, MAJOR, OP_SHM_REF,
+ ee->w, ee->h, ee->alpha,
+ extn->file.shmfile->file,
+ strlen(extn->file.shmfile->file) + 1);
ipc.w = ee->w;
ipc.h = ee->h;
- ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_RESIZE,
- 0, 0, 0, &ipc, sizeof(ipc));
+ EINA_LIST_FOREACH(extn->ipc.clients, l, client)
+ ecore_ipc_client_send(client, MAJOR, OP_RESIZE,
+ 0, 0, 0, &ipc, sizeof(ipc));
}
}
if (ee->func.fn_resize) ee->func.fn_resize(ee);
}
static void
-_ecore_evas_plug_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int w, int h)
+_ecore_evas_socket_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int w, int h)
{
- _ecore_evas_plug_resize(ee, w, h);
+ _ecore_evas_socket_resize(ee, w, h);
}
int
-_ecore_evas_extn_plug_render(Ecore_Evas *ee)
+_ecore_evas_extn_socket_render(Ecore_Evas *ee)
{
Eina_List *updates = NULL, *l, *ll;
Ecore_Evas *ee2;
int rend = 0;
Eina_Rectangle *r;
Extn *extn;
+ Ecore_Ipc_Client *client;
extn = ee->engine.buffer.data;
EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
{
Ipc_Data_Update ipc;
+
ipc.x = r->x;
ipc.y = r->y;
ipc.w = r->w;
ipc.h = r->h;
- ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_UPDATE, 0, 0, 0, &ipc, sizeof(ipc));
+ EINA_LIST_FOREACH(extn->ipc.clients, ll, client)
+ ecore_ipc_client_send(client, MAJOR, OP_UPDATE, 0, 0, 0, &ipc, sizeof(ipc));
}
if (updates)
{
evas_render_updates_free(updates);
_ecore_evas_idle_timeout_update(ee);
- ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_UPDATE_DONE, 0, 0, 0, NULL, 0);
+ EINA_LIST_FOREACH(extn->ipc.clients, ll, client)
+ ecore_ipc_client_send(client, MAJOR, OP_UPDATE_DONE, 0, 0, 0, NULL, 0);
}
return updates ? 1 : rend;
}
static Eina_Bool
-_ipc_server_add(void *data, int type __UNUSED__, void *event)
+_ipc_client_add(void *data, int type __UNUSED__, void *event)
{
- Ecore_Ipc_Event_Server_Add *e = event;
+ Ecore_Ipc_Event_Client_Add *e = event;
Ecore_Evas *ee = data;
Extn *extn;
- if (ee != ecore_ipc_server_data_get(e->server))
+ if (ee != ecore_ipc_server_data_get(ecore_ipc_client_server_get(e->client)))
return ECORE_CALLBACK_PASS_ON;
if (!eina_list_data_find(extn_ee_list, ee))
return ECORE_CALLBACK_PASS_ON;
extn = ee->engine.buffer.data;
if (!extn) return ECORE_CALLBACK_PASS_ON;
+
+ extn->ipc.clients = eina_list_append(extn->ipc.clients, e->client);
+ ecore_ipc_client_send(e->client, MAJOR, OP_LOCK_FILE, 0, 0, 0, extn->file.lock, strlen(extn->file.lock) + 1);
+
+ if (extn->file.shmfile)
+ {
+ Ipc_Data_Resize ipc;
+
+ ecore_ipc_client_send(e->client, MAJOR, OP_SHM_REF,
+ ee->w, ee->h, ee->alpha,
+ extn->file.shmfile->file,
+ strlen(extn->file.shmfile->file) + 1);
+ ipc.w = ee->w;
+ ipc.h = ee->h;
+
+ ecore_ipc_client_send(e->client, MAJOR, OP_RESIZE,
+ 0, 0, 0, &ipc, sizeof(ipc));
+ }
+ _ecore_evas_extn_event(ee, ECORE_EVAS_EXTN_CLIENT_ADD);
return ECORE_CALLBACK_PASS_ON;
- // FIXME: find a way to let app know server there
}
static Eina_Bool
-_ipc_server_del(void *data, int type __UNUSED__, void *event)
+_ipc_client_del(void *data, int type __UNUSED__, void *event)
{
- Ecore_Ipc_Event_Server_Del *e = event;
+ Ecore_Ipc_Event_Client_Del *e = event;
Ecore_Evas *ee = data;
Extn *extn;
-
extn = ee->engine.buffer.data;
if (!extn) return ECORE_CALLBACK_PASS_ON;
- if (extn->ipc.server != e->server) return ECORE_CALLBACK_PASS_ON;
- extn->ipc.server = NULL;
- if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
+ if (!eina_list_data_find(extn->ipc.clients, e->client)) return ECORE_CALLBACK_PASS_ON;
+
+ extn->ipc.clients = eina_list_remove(extn->ipc.clients, e->client);
+
+ _ecore_evas_extn_event(ee, ECORE_EVAS_EXTN_CLIENT_DEL);
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
-_ipc_server_data(void *data, int type __UNUSED__, void *event)
+_ipc_client_data(void *data, int type __UNUSED__, void *event)
{
- Ecore_Ipc_Event_Server_Data *e = event;
+ Ecore_Ipc_Event_Client_Data *e = event;
Ecore_Evas *ee = data;
Extn *extn;
- if (ee != ecore_ipc_server_data_get(e->server))
+ if (ee != ecore_ipc_server_data_get(ecore_ipc_client_server_get(e->client)))
return ECORE_CALLBACK_PASS_ON;
if (!eina_list_data_find(extn_ee_list, ee))
return ECORE_CALLBACK_PASS_ON;
case OP_RESIZE:
if ((e->data) && (e->size >= (int)sizeof(Ipc_Data_Resize)))
{
- Ipc_Data_Resize *ipc = e->data;
- _ecore_evas_plug_resize(ee, ipc->w, ipc->h);
+ Ipc_Data_Resize *ipc = e->data;
+ /* create callbacke data size changed */
+ _ecore_evas_socket_resize(ee, ipc->w, ipc->h);
}
break;
case OP_SHOW:
if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
}
break;
- case OP_LOCK_FILE:
- if ((e->data) && (e->size > 0) &&
- (((unsigned char *)e->data)[e->size - 1] == 0))
- {
- if (extn->file.lockfd) close(extn->file.lockfd);
- if (extn->file.lock) eina_stringshare_del(extn->file.lock);
- extn->file.lock = eina_stringshare_add(e->data);
- extn->file.lockfd = open(extn->file.lock, O_RDONLY);
- }
- break;
case OP_EV_MOUSE_IN:
if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_In))
{
}
static void
-_ecore_evas_extn_plug_alpha_set(Ecore_Evas *ee, int alpha)
+_ecore_evas_extn_socket_alpha_set(Ecore_Evas *ee, int alpha)
{
Extn *extn;
+ Eina_List *l;
+ Ecore_Ipc_Client *client;
if (((ee->alpha) && (alpha)) || ((!ee->alpha) && (!alpha))) return;
ee->alpha = alpha;
evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
}
- ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_SHM_REF,
- ee->w, ee->h, ee->alpha,
- extn->file.shmfile->file,
- strlen(extn->file.shmfile->file) + 1);
+ EINA_LIST_FOREACH(extn->ipc.clients, l, client)
+ ecore_ipc_client_send(client, MAJOR, OP_SHM_REF,
+ ee->w, ee->h, ee->alpha,
+ extn->file.shmfile->file,
+ strlen(extn->file.shmfile->file) + 1);
}
}
-static const Ecore_Evas_Engine_Func _ecore_extn_plug_engine_func =
+static const Ecore_Evas_Engine_Func _ecore_extn_socket_engine_func =
{
_ecore_evas_extn_free,
NULL,
NULL,
NULL,
NULL,
- _ecore_evas_plug_resize,
- _ecore_evas_plug_move_resize,
+ _ecore_evas_socket_resize,
+ _ecore_evas_socket_move_resize,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
- _ecore_evas_extn_plug_alpha_set,
+ _ecore_evas_extn_socket_alpha_set,
NULL, //transparent
- _ecore_evas_extn_plug_render, // render
+ _ecore_evas_extn_socket_render, // render
NULL // screen_geometry_get
};
#endif
EAPI Ecore_Evas *
-ecore_evas_extn_plug_new(const char *svcname, int svcnum, Eina_Bool svcsys)
+ecore_evas_extn_socket_new(const char *svcname, int svcnum, Eina_Bool svcsys)
{
#ifdef EXTN_ENABLED
Extn *extn;
ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
- ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_extn_plug_engine_func;
+ ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_extn_socket_engine_func;
- ee->driver = "extn_plug";
+ ee->driver = "extn_socket";
ee->rotation = 0;
ee->visible = 0;
else
{
Ecore_Ipc_Type ipctype = ECORE_IPC_LOCAL_USER;
+ char buf[PATH_MAX];
ecore_ipc_init();
extn->svc.name = eina_stringshare_add(svcname);
extn->svc.num = svcnum;
extn->svc.sys = svcsys;
+ snprintf(buf, sizeof(buf), "/tmp/ee-lock-XXXXXX");
+ extn->file.lockfd = mkstemp(buf);
+ if (extn->file.lockfd >= 0)
+ extn->file.lock = eina_stringshare_add(buf);
+ if ((extn->file.lockfd < 0) || (!extn->file.lock))
+ {
+ if (extn->file.lockfd)
+ {
+ close(extn->file.lockfd);
+ unlink(buf);
+ }
+ eina_stringshare_del(extn->svc.name);
+ if (extn->file.lock) eina_stringshare_del(extn->file.lock);
+ free(extn);
+ ecore_ipc_shutdown();
+ ecore_evas_free(ee);
+ return NULL;
+ }
+
if (extn->svc.sys) ipctype = ECORE_IPC_LOCAL_SYSTEM;
- extn->ipc.server = ecore_ipc_server_connect(ipctype,
- (char *)extn->svc.name,
- extn->svc.num, ee);
+ extn->ipc.am_server = EINA_TRUE;
+ extn->ipc.server = ecore_ipc_server_add(ipctype,
+ (char *)extn->svc.name,
+ extn->svc.num, ee);
if (!extn->ipc.server)
{
+ if (extn->file.lockfd)
+ {
+ close(extn->file.lockfd);
+ if (extn->file.lock) unlink(extn->file.lock);
+ }
eina_stringshare_del(extn->svc.name);
+ eina_stringshare_del(extn->file.lock);
free(extn);
ecore_ipc_shutdown();
ecore_evas_free(ee);
ee->engine.buffer.data = extn;
extn->ipc.handlers = eina_list_append
(extn->ipc.handlers,
- ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD,
- _ipc_server_add, ee));
+ ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD,
+ _ipc_client_add, ee));
extn->ipc.handlers = eina_list_append
(extn->ipc.handlers,
- ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL,
- _ipc_server_del, ee));
+ ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL,
+ _ipc_client_del, ee));
extn->ipc.handlers = eina_list_append
(extn->ipc.handlers,
- ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DATA,
- _ipc_server_data, ee));
+ ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA,
+ _ipc_client_data, ee));
}
+
extn_ee_list = eina_list_append(extn_ee_list, ee);
_ecore_evas_register(ee);