forked from enlightenment/efl
Fix Ecore evas extn for multi client model.
It is possible that several process want to show same canvas. For support this, I changed Ecore buffer canvas to server(socket) If some application want to show this canvas, it create plug image object. SVN revision: 66892
This commit is contained in:
parent
6bdf286cdb
commit
6eb708fb1d
|
@ -458,3 +458,10 @@
|
||||||
|
|
||||||
* Add HEX, TERMINAL and PASSWORD layouts to ecore-imf
|
* Add HEX, TERMINAL and PASSWORD layouts to ecore-imf
|
||||||
|
|
||||||
|
2011-01-05 Jiyoun Park (Jypark)
|
||||||
|
|
||||||
|
* Fix Ecore-evas extn (external) for multi client model.
|
||||||
|
"Socket" creates canvas and other process can show that canvas
|
||||||
|
using "Plug" image object. Before only one to one communication
|
||||||
|
is possible, but now many "plug"s can show socket's canvas.
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ Additions:
|
||||||
- ecore_x_randr_output_backlight_available()
|
- ecore_x_randr_output_backlight_available()
|
||||||
* ecore_evas:
|
* ecore_evas:
|
||||||
- Add Shm and Egl engines for ecore_evas to draw in Wayland.
|
- Add Shm and Egl engines for ecore_evas to draw in Wayland.
|
||||||
|
- Add Socket and Plug to draw other process area.
|
||||||
* ecore_wayland
|
* ecore_wayland
|
||||||
- Add Ecore_Wayland (backend to support Wayland).
|
- Add Ecore_Wayland (backend to support Wayland).
|
||||||
|
|
||||||
|
|
|
@ -1665,11 +1665,12 @@ EAPI extern int ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE; /**< some other window prope
|
||||||
/**
|
/**
|
||||||
* @defgroup Ecore_Evas_Extn External plug/socket infrastructure to remote canvases
|
* @defgroup Ecore_Evas_Extn External plug/socket infrastructure to remote canvases
|
||||||
*
|
*
|
||||||
* These functions allow 1 process to create a "socket" into which another
|
* These functions allow 1 process to create a "socket" was pluged into which another
|
||||||
* process can create a "plug" remotely to plug into and provide content
|
* process can create a "plug" remotely to plug into.
|
||||||
* for that socket. This is best for small sized objects (about the size range
|
* Socket can provides content for several plugs.
|
||||||
* of a small icon up to a few large icons). Sine the socket is actually an
|
* This is best for small sized objects (about the size range
|
||||||
* image object, you cvan fetch the pixel data
|
* 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
|
* @since 1.2
|
||||||
* @{
|
* @{
|
||||||
|
@ -1681,31 +1682,23 @@ EAPI extern int ECORE_EVAS_EXTN_CLIENT_DEL; /**< this event is received when a p
|
||||||
/**
|
/**
|
||||||
* Create a new external ecore evas socket
|
* 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 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 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.
|
* @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
|
* This creates an Ecore_evas canvas wrapper and creates
|
||||||
* processes plug canvas when it connects. All input will be sent back to
|
* socket specified by @p svcname, @p svcnum and @p svcsys. If creation
|
||||||
* this process as well, effectively swallowing or placing the plug process
|
* is successful, an Ecore_Evas handle is returned or NULL if creation
|
||||||
* in the canvas of the socket process in place of the image object. The image
|
* fails. Also focus, show, hide etc. callbacks
|
||||||
* object by default is created to be filled (equivalent of
|
* will also be called if the plug object is shown, or already visible on
|
||||||
* evas_object_image_filled_add() on creation) so image content will scale
|
* connect, or if it is hidden later, focused or unfocused.
|
||||||
* 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
|
* The server create ecore buffer canvas.
|
||||||
* 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.
|
|
||||||
* When a client connects, you will get the ECORE_EVAS_EXTN_CLIENT_ADD event
|
* 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
|
* 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
|
* passed as a void pointer. When a client disconnects you will get the
|
||||||
* ECORE_EVAS_EXTN_CLIENT_DEL event, and the image object will become blank.
|
* 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:
|
* You can set up event handles for these events as follows:
|
||||||
*
|
*
|
||||||
|
@ -1736,20 +1729,25 @@ EAPI extern int ECORE_EVAS_EXTN_CLIENT_DEL; /**< this event is received when a p
|
||||||
* Note that events come in later after the event happened. You may want to be
|
* 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
|
* careful as data structures you had associated with the image object
|
||||||
* may have been freed after deleting, but the object may still be around
|
* 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()
|
* @code
|
||||||
* @see ecore_evas_extn_socket_object_data_unlock()
|
* 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_new()
|
||||||
|
* @see ecore_evas_extn_plug_object_data_lock()
|
||||||
|
* @see ecore_evas_extn_plug_object_data_unlock()
|
||||||
*
|
*
|
||||||
* @since 1.2
|
* @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()
|
* 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
|
* from the image object, but need to ensure that it does not change while
|
||||||
|
@ -1758,54 +1756,63 @@ EAPI Evas_Object *ecore_evas_extn_socket_new(Ecore_Evas *ee_target, const char *
|
||||||
*
|
*
|
||||||
* You should only hold the lock for just as long as you need to read out the
|
* 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
|
* 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
|
* 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.
|
* odd behavior.
|
||||||
*
|
*
|
||||||
* @see ecore_evas_extn_socket_new()
|
* @see ecore_evas_extn_plug_new()
|
||||||
* @see ecore_evas_extn_socket_object_data_unlock()
|
* @see ecore_evas_extn_plug_object_data_unlock()
|
||||||
*
|
*
|
||||||
* @since 1.2
|
* @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
|
* 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_plug_new()
|
||||||
* @see ecore_evas_extn_socket_object_data_lock()
|
* @see ecore_evas_extn_plug_object_data_lock()
|
||||||
*
|
*
|
||||||
* @since 1.2
|
* @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
|
* 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 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 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).
|
* @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()
|
* @see ecore_evas_extn_socket_new()
|
||||||
*
|
*
|
||||||
* @since 1.2
|
* @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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
|
|
|
@ -321,24 +321,24 @@ typedef struct _Extn Extn;
|
||||||
struct _Extn
|
struct _Extn
|
||||||
{
|
{
|
||||||
struct {
|
struct {
|
||||||
Ecore_Ipc_Server *server;
|
Ecore_Ipc_Server *server;
|
||||||
Ecore_Ipc_Client *client;
|
Eina_List *clients;
|
||||||
Eina_List *handlers;
|
Eina_List *handlers;
|
||||||
Eina_Bool am_server : 1;
|
Eina_Bool am_server : 1;
|
||||||
} ipc;
|
} ipc;
|
||||||
struct {
|
struct {
|
||||||
const char *name;
|
const char *name;
|
||||||
int num;
|
int num;
|
||||||
Eina_Bool sys : 1;
|
Eina_Bool sys : 1;
|
||||||
} svc;
|
} svc;
|
||||||
struct {
|
struct {
|
||||||
const char *lock;
|
const char *lock;
|
||||||
int lockfd;
|
int lockfd;
|
||||||
const char *shm;
|
const char *shm;
|
||||||
int w, h;
|
int w, h;
|
||||||
Shmfile *shmfile;
|
Shmfile *shmfile;
|
||||||
Eina_List *updates;
|
Eina_List *updates;
|
||||||
Eina_Bool have_lock : 1;
|
Eina_Bool have_lock : 1;
|
||||||
} file;
|
} file;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -406,21 +406,21 @@ _ecore_evas_socket_unlock(Ecore_Evas *ee)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
Ecore_Evas *ee = data;
|
||||||
if (ee) _ecore_evas_socket_lock(ee);
|
if (ee) _ecore_evas_socket_lock(ee);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
Ecore_Evas *ee = data;
|
||||||
if (ee) _ecore_evas_socket_unlock(ee);
|
if (ee) _ecore_evas_socket_unlock(ee);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
Ecore_Evas *ee = data;
|
||||||
if (ee) ecore_evas_free(ee);
|
if (ee) ecore_evas_free(ee);
|
||||||
|
@ -468,6 +468,7 @@ static void
|
||||||
_ecore_evas_extn_free(Ecore_Evas *ee)
|
_ecore_evas_extn_free(Ecore_Evas *ee)
|
||||||
{
|
{
|
||||||
Extn *extn;
|
Extn *extn;
|
||||||
|
Ecore_Ipc_Client *client;
|
||||||
|
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (extn)
|
if (extn)
|
||||||
|
@ -485,19 +486,24 @@ _ecore_evas_extn_free(Ecore_Evas *ee)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (extn->svc.name) eina_stringshare_del(extn->svc.name);
|
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->ipc.server) ecore_ipc_server_del(extn->ipc.server);
|
||||||
if (extn->file.lock) eina_stringshare_del(extn->file.lock);
|
if (extn->file.lock) eina_stringshare_del(extn->file.lock);
|
||||||
if (extn->file.shm) eina_stringshare_del(extn->file.shm);
|
if (extn->file.shm) eina_stringshare_del(extn->file.shm);
|
||||||
if (extn->file.shmfile)
|
if (extn->file.shmfile)
|
||||||
{
|
{
|
||||||
if (extn->ipc.am_server)
|
if (extn->ipc.am_server)
|
||||||
shmfile_close(extn->file.shmfile);
|
|
||||||
else
|
|
||||||
shmfile_free(extn->file.shmfile);
|
shmfile_free(extn->file.shmfile);
|
||||||
|
else
|
||||||
|
shmfile_close(extn->file.shmfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
EINA_LIST_FREE(extn->ipc.handlers, hdl)
|
EINA_LIST_FREE(extn->ipc.handlers, hdl)
|
||||||
ecore_event_handler_del(hdl);
|
ecore_event_handler_del(hdl);
|
||||||
free(extn);
|
free(extn);
|
||||||
ecore_ipc_shutdown();
|
ecore_ipc_shutdown();
|
||||||
ee->engine.buffer.data = NULL;
|
ee->engine.buffer.data = NULL;
|
||||||
|
@ -508,15 +514,15 @@ _ecore_evas_extn_free(Ecore_Evas *ee)
|
||||||
|
|
||||||
evas_object_event_callback_del_full(ee->engine.buffer.image,
|
evas_object_event_callback_del_full(ee->engine.buffer.image,
|
||||||
EVAS_CALLBACK_DEL,
|
EVAS_CALLBACK_DEL,
|
||||||
_ecore_evas_extn_socket_image_obj_del,
|
_ecore_evas_extn_plug_image_obj_del,
|
||||||
ee);
|
ee);
|
||||||
evas_event_callback_del_full(evas_object_evas_get(ee->engine.buffer.image),
|
evas_event_callback_del_full(evas_object_evas_get(ee->engine.buffer.image),
|
||||||
EVAS_CALLBACK_RENDER_PRE,
|
EVAS_CALLBACK_RENDER_PRE,
|
||||||
_ecore_evas_extn_socket_targer_render_pre,
|
_ecore_evas_extn_plug_targer_render_pre,
|
||||||
ee);
|
ee);
|
||||||
evas_event_callback_del_full(evas_object_evas_get(ee->engine.buffer.image),
|
evas_event_callback_del_full(evas_object_evas_get(ee->engine.buffer.image),
|
||||||
EVAS_CALLBACK_RENDER_POST,
|
EVAS_CALLBACK_RENDER_POST,
|
||||||
_ecore_evas_extn_socket_targer_render_post,
|
_ecore_evas_extn_plug_targer_render_post,
|
||||||
ee);
|
ee);
|
||||||
evas_object_del(ee->engine.buffer.image);
|
evas_object_del(ee->engine.buffer.image);
|
||||||
ee2 = evas_object_data_get(ee->engine.buffer.image, "Ecore_Evas_Parent");
|
ee2 = evas_object_data_get(ee->engine.buffer.image, "Ecore_Evas_Parent");
|
||||||
|
@ -532,6 +538,8 @@ static void
|
||||||
_ecore_evas_resize(Ecore_Evas *ee, int w, int h)
|
_ecore_evas_resize(Ecore_Evas *ee, int w, int h)
|
||||||
{
|
{
|
||||||
Extn *extn;
|
Extn *extn;
|
||||||
|
Eina_List *l;
|
||||||
|
Ecore_Ipc_Client *client;
|
||||||
|
|
||||||
if (w < 1) w = 1;
|
if (w < 1) w = 1;
|
||||||
if (h < 1) h = 1;
|
if (h < 1) h = 1;
|
||||||
|
@ -544,14 +552,15 @@ _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (ee->engine.buffer.image)
|
if (ee->engine.buffer.image)
|
||||||
evas_object_image_size_set(ee->engine.buffer.image, ee->w, ee->h);
|
evas_object_image_size_set(ee->engine.buffer.image, ee->w, ee->h);
|
||||||
if ((extn) && (extn->ipc.client))
|
/* Server can have many plugs, so I block resize comand from client to server *
|
||||||
{
|
if ((extn) && (extn->ipc.server))
|
||||||
Ipc_Data_Resize ipc;
|
{
|
||||||
|
Ipc_Data_Resize ipc;
|
||||||
|
|
||||||
ipc.w = ee->w;
|
ipc.w = ee->w;
|
||||||
ipc.h = ee->h;
|
ipc.h = ee->h;
|
||||||
ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_RESIZE, 0, 0, 0, &ipc, sizeof(ipc));
|
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);
|
if (ee->func.fn_resize) ee->func.fn_resize(ee);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -619,14 +628,14 @@ _ecore_evas_extn_cb_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __
|
||||||
|
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return;
|
if (!extn) return;
|
||||||
if (extn->ipc.client)
|
if (extn->ipc.server)
|
||||||
{
|
{
|
||||||
Ipc_Data_Ev_Mouse_In ipc;
|
Ipc_Data_Ev_Mouse_In ipc;
|
||||||
|
|
||||||
ipc.timestamp = ev->timestamp;
|
ipc.timestamp = ev->timestamp;
|
||||||
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
||||||
ipc.event_flags = ev->event_flags;
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -639,14 +648,14 @@ _ecore_evas_extn_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj _
|
||||||
|
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return;
|
if (!extn) return;
|
||||||
if (extn->ipc.client)
|
if (extn->ipc.server)
|
||||||
{
|
{
|
||||||
Ipc_Data_Ev_Mouse_Out ipc;
|
Ipc_Data_Ev_Mouse_Out ipc;
|
||||||
|
|
||||||
ipc.timestamp = ev->timestamp;
|
ipc.timestamp = ev->timestamp;
|
||||||
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
||||||
ipc.event_flags = ev->event_flags;
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -659,7 +668,7 @@ _ecore_evas_extn_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj
|
||||||
|
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return;
|
if (!extn) return;
|
||||||
if (extn->ipc.client)
|
if (extn->ipc.server)
|
||||||
{
|
{
|
||||||
Ipc_Data_Ev_Mouse_Down ipc;
|
Ipc_Data_Ev_Mouse_Down ipc;
|
||||||
|
|
||||||
|
@ -668,7 +677,7 @@ _ecore_evas_extn_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj
|
||||||
ipc.timestamp = ev->timestamp;
|
ipc.timestamp = ev->timestamp;
|
||||||
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
||||||
ipc.event_flags = ev->event_flags;
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -681,7 +690,7 @@ _ecore_evas_extn_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __
|
||||||
|
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return;
|
if (!extn) return;
|
||||||
if (extn->ipc.client)
|
if (extn->ipc.server)
|
||||||
{
|
{
|
||||||
Ipc_Data_Ev_Mouse_Up ipc;
|
Ipc_Data_Ev_Mouse_Up ipc;
|
||||||
|
|
||||||
|
@ -690,7 +699,7 @@ _ecore_evas_extn_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __
|
||||||
ipc.timestamp = ev->timestamp;
|
ipc.timestamp = ev->timestamp;
|
||||||
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
||||||
ipc.event_flags = ev->event_flags;
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -703,7 +712,7 @@ _ecore_evas_extn_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj
|
||||||
|
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return;
|
if (!extn) return;
|
||||||
if (extn->ipc.client)
|
if (extn->ipc.server)
|
||||||
{
|
{
|
||||||
Ipc_Data_Ev_Mouse_Move ipc;
|
Ipc_Data_Ev_Mouse_Move ipc;
|
||||||
Evas_Coord x, y;
|
Evas_Coord x, y;
|
||||||
|
@ -716,7 +725,7 @@ _ecore_evas_extn_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj
|
||||||
ipc.timestamp = ev->timestamp;
|
ipc.timestamp = ev->timestamp;
|
||||||
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
||||||
ipc.event_flags = ev->event_flags;
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -729,7 +738,7 @@ _ecore_evas_extn_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj
|
||||||
|
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return;
|
if (!extn) return;
|
||||||
if (extn->ipc.client)
|
if (extn->ipc.server)
|
||||||
{
|
{
|
||||||
Ipc_Data_Ev_Mouse_Wheel ipc;
|
Ipc_Data_Ev_Mouse_Wheel ipc;
|
||||||
|
|
||||||
|
@ -738,7 +747,7 @@ _ecore_evas_extn_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj
|
||||||
ipc.timestamp = ev->timestamp;
|
ipc.timestamp = ev->timestamp;
|
||||||
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
||||||
ipc.event_flags = ev->event_flags;
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -751,7 +760,7 @@ _ecore_evas_extn_cb_multi_down(void *data, Evas *e __UNUSED__, Evas_Object *obj
|
||||||
|
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return;
|
if (!extn) return;
|
||||||
if (extn->ipc.client)
|
if (extn->ipc.server)
|
||||||
{
|
{
|
||||||
Ipc_Data_Ev_Multi_Down ipc;
|
Ipc_Data_Ev_Multi_Down ipc;
|
||||||
Evas_Coord x, y;
|
Evas_Coord x, y;
|
||||||
|
@ -773,7 +782,7 @@ _ecore_evas_extn_cb_multi_down(void *data, Evas *e __UNUSED__, Evas_Object *obj
|
||||||
ipc.timestamp = ev->timestamp;
|
ipc.timestamp = ev->timestamp;
|
||||||
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
||||||
ipc.event_flags = ev->event_flags;
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -787,7 +796,7 @@ _ecore_evas_extn_cb_multi_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __
|
||||||
|
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return;
|
if (!extn) return;
|
||||||
if (extn->ipc.client)
|
if (extn->ipc.server)
|
||||||
{
|
{
|
||||||
Ipc_Data_Ev_Multi_Up ipc;
|
Ipc_Data_Ev_Multi_Up ipc;
|
||||||
Evas_Coord x, y;
|
Evas_Coord x, y;
|
||||||
|
@ -809,7 +818,7 @@ _ecore_evas_extn_cb_multi_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __
|
||||||
ipc.timestamp = ev->timestamp;
|
ipc.timestamp = ev->timestamp;
|
||||||
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
||||||
ipc.event_flags = ev->event_flags;
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -822,7 +831,7 @@ _ecore_evas_extn_cb_multi_move(void *data, Evas *e __UNUSED__, Evas_Object *obj
|
||||||
|
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return;
|
if (!extn) return;
|
||||||
if (extn->ipc.client)
|
if (extn->ipc.server)
|
||||||
{
|
{
|
||||||
Ipc_Data_Ev_Multi_Move ipc;
|
Ipc_Data_Ev_Multi_Move ipc;
|
||||||
Evas_Coord x, y;
|
Evas_Coord x, y;
|
||||||
|
@ -843,7 +852,7 @@ _ecore_evas_extn_cb_multi_move(void *data, Evas *e __UNUSED__, Evas_Object *obj
|
||||||
ipc.timestamp = ev->timestamp;
|
ipc.timestamp = ev->timestamp;
|
||||||
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
||||||
ipc.event_flags = ev->event_flags;
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -865,7 +874,7 @@ _ecore_evas_extn_cb_key_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __
|
||||||
|
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return;
|
if (!extn) return;
|
||||||
if (extn->ipc.client)
|
if (extn->ipc.server)
|
||||||
{
|
{
|
||||||
Ipc_Data_Ev_Key_Down *ipc;
|
Ipc_Data_Ev_Key_Down *ipc;
|
||||||
char *st, *p;
|
char *st, *p;
|
||||||
|
@ -908,7 +917,7 @@ _ecore_evas_extn_cb_key_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __
|
||||||
ipc->timestamp = ev->timestamp;
|
ipc->timestamp = ev->timestamp;
|
||||||
ipc->mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
ipc->mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
||||||
ipc->event_flags = ev->event_flags;
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -921,7 +930,7 @@ _ecore_evas_extn_cb_key_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UN
|
||||||
|
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return;
|
if (!extn) return;
|
||||||
if (extn->ipc.client)
|
if (extn->ipc.server)
|
||||||
{
|
{
|
||||||
Ipc_Data_Ev_Key_Up *ipc;
|
Ipc_Data_Ev_Key_Up *ipc;
|
||||||
char *st, *p;
|
char *st, *p;
|
||||||
|
@ -964,7 +973,7 @@ _ecore_evas_extn_cb_key_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UN
|
||||||
ipc->timestamp = ev->timestamp;
|
ipc->timestamp = ev->timestamp;
|
||||||
ipc->mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
ipc->mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
|
||||||
ipc->event_flags = ev->event_flags;
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -977,14 +986,14 @@ _ecore_evas_extn_cb_hold(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUS
|
||||||
|
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return;
|
if (!extn) return;
|
||||||
if (extn->ipc.client)
|
if (extn->ipc.server)
|
||||||
{
|
{
|
||||||
Ipc_Data_Ev_Hold ipc;
|
Ipc_Data_Ev_Hold ipc;
|
||||||
|
|
||||||
ipc.hold = ev->hold;
|
ipc.hold = ev->hold;
|
||||||
ipc.timestamp = ev->timestamp;
|
ipc.timestamp = ev->timestamp;
|
||||||
ipc.event_flags = ev->event_flags;
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -998,8 +1007,8 @@ _ecore_evas_extn_cb_focus_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __
|
||||||
ee->prop.focused = 1;
|
ee->prop.focused = 1;
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return;
|
if (!extn) return;
|
||||||
if (!extn->ipc.client) return;
|
if (!extn->ipc.server) return;
|
||||||
ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_FOCUS, 0, 0, 0, NULL, 0);
|
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_FOCUS, 0, 0, 0, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1012,8 +1021,8 @@ _ecore_evas_extn_cb_focus_out(void *data, Evas *e __UNUSED__, Evas_Object *obj _
|
||||||
ee->prop.focused = 0;
|
ee->prop.focused = 0;
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return;
|
if (!extn) return;
|
||||||
if (!extn->ipc.client) return;
|
if (!extn->ipc.server) return;
|
||||||
ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_UNFOCUS, 0, 0, 0, NULL, 0);
|
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_UNFOCUS, 0, 0, 0, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1026,8 +1035,8 @@ _ecore_evas_extn_cb_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUS
|
||||||
ee->visible = 1;
|
ee->visible = 1;
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return;
|
if (!extn) return;
|
||||||
if (!extn->ipc.client) return;
|
if (!extn->ipc.server) return;
|
||||||
ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_SHOW, 0, 0, 0, NULL, 0);
|
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_SHOW, 0, 0, 0, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1040,11 +1049,11 @@ _ecore_evas_extn_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUS
|
||||||
ee->visible = 0;
|
ee->visible = 0;
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return;
|
if (!extn) return;
|
||||||
if (!extn->ipc.client) return;
|
if (!extn->ipc.server) return;
|
||||||
ecore_ipc_client_send(extn->ipc.client, MAJOR, OP_HIDE, 0, 0, 0, NULL, 0);
|
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,
|
_ecore_evas_extn_free,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -1098,79 +1107,57 @@ static const Ecore_Evas_Engine_Func _ecore_extn_socket_engine_func =
|
||||||
};
|
};
|
||||||
|
|
||||||
static Eina_Bool
|
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;
|
Ecore_Evas *ee = data;
|
||||||
Extn *extn;
|
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;
|
return ECORE_CALLBACK_PASS_ON;
|
||||||
if (!eina_list_data_find(extn_ee_list, ee))
|
if (!eina_list_data_find(extn_ee_list, ee))
|
||||||
return ECORE_CALLBACK_PASS_ON;
|
return ECORE_CALLBACK_PASS_ON;
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return ECORE_CALLBACK_PASS_ON;
|
if (!extn) return ECORE_CALLBACK_PASS_ON;
|
||||||
if (extn->ipc.client)
|
//FIXME: find a way to let app know server there
|
||||||
{
|
|
||||||
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);
|
|
||||||
return ECORE_CALLBACK_PASS_ON;
|
return ECORE_CALLBACK_PASS_ON;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
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;
|
Ecore_Evas *ee = data;
|
||||||
Extn *extn;
|
Extn *extn;
|
||||||
|
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return ECORE_CALLBACK_PASS_ON;
|
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);
|
shmfile_close(extn->file.shmfile);
|
||||||
ee->engine.buffer.pixels = NULL;
|
extn->file.shmfile = 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;
|
|
||||||
}
|
}
|
||||||
_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;
|
return ECORE_CALLBACK_PASS_ON;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
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;
|
Ecore_Evas *ee = data;
|
||||||
Extn *extn;
|
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;
|
return ECORE_CALLBACK_PASS_ON;
|
||||||
if (!eina_list_data_find(extn_ee_list, ee))
|
if (!eina_list_data_find(extn_ee_list, ee))
|
||||||
return ECORE_CALLBACK_PASS_ON;
|
return ECORE_CALLBACK_PASS_ON;
|
||||||
|
@ -1206,6 +1193,16 @@ _ipc_client_data(void *data, int type __UNUSED__, void *event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
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:
|
case OP_SHM_REF:
|
||||||
// e->ref == w
|
// e->ref == w
|
||||||
// e->ref_to == h
|
// e->ref_to == h
|
||||||
|
@ -1267,6 +1264,13 @@ _ipc_client_data(void *data, int type __UNUSED__, void *event)
|
||||||
evas_object_image_data_set(ee->engine.buffer.image, NULL);
|
evas_object_image_data_set(ee->engine.buffer.image, NULL);
|
||||||
}
|
}
|
||||||
break;
|
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:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1285,7 +1289,7 @@ _ecore_evas_extn_shutdown(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
EAPI Evas_Object *
|
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
|
#ifdef EXTN_ENABLED
|
||||||
Extn *extn;
|
Extn *extn;
|
||||||
|
@ -1305,9 +1309,9 @@ ecore_evas_extn_socket_new(Ecore_Evas *ee_target, const char *svcname, int svcnu
|
||||||
|
|
||||||
ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
|
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->rotation = 0;
|
||||||
ee->visible = 0;
|
ee->visible = 0;
|
||||||
|
@ -1384,7 +1388,7 @@ ecore_evas_extn_socket_new(Ecore_Evas *ee_target, const char *svcname, int svcnu
|
||||||
|
|
||||||
evas_object_event_callback_add(ee->engine.buffer.image,
|
evas_object_event_callback_add(ee->engine.buffer.image,
|
||||||
EVAS_CALLBACK_DEL,
|
EVAS_CALLBACK_DEL,
|
||||||
_ecore_evas_extn_socket_image_obj_del, ee);
|
_ecore_evas_extn_plug_image_obj_del, ee);
|
||||||
|
|
||||||
extn = calloc(1, sizeof(Extn));
|
extn = calloc(1, sizeof(Extn));
|
||||||
if (!extn)
|
if (!extn)
|
||||||
|
@ -1395,44 +1399,18 @@ ecore_evas_extn_socket_new(Ecore_Evas *ee_target, const char *svcname, int svcnu
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Ecore_Ipc_Type ipctype = ECORE_IPC_LOCAL_USER;
|
Ecore_Ipc_Type ipctype = ECORE_IPC_LOCAL_USER;
|
||||||
char buf[PATH_MAX];
|
|
||||||
|
|
||||||
ecore_ipc_init();
|
ecore_ipc_init();
|
||||||
extn->svc.name = eina_stringshare_add(svcname);
|
extn->svc.name = eina_stringshare_add(svcname);
|
||||||
extn->svc.num = svcnum;
|
extn->svc.num = svcnum;
|
||||||
extn->svc.sys = svcsys;
|
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;
|
if (extn->svc.sys) ipctype = ECORE_IPC_LOCAL_SYSTEM;
|
||||||
extn->ipc.am_server = EINA_TRUE;
|
extn->ipc.server = ecore_ipc_server_connect(ipctype, (char *)extn->svc.name,
|
||||||
extn->ipc.server = ecore_ipc_server_add(ipctype, extn->svc.name,
|
extn->svc.num, ee);
|
||||||
extn->svc.num, ee);
|
|
||||||
if (!extn->ipc.server)
|
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->svc.name);
|
||||||
eina_stringshare_del(extn->file.lock);
|
|
||||||
free(extn);
|
free(extn);
|
||||||
ecore_ipc_shutdown();
|
ecore_ipc_shutdown();
|
||||||
ecore_evas_free(ee);
|
ecore_evas_free(ee);
|
||||||
|
@ -1441,25 +1419,25 @@ ecore_evas_extn_socket_new(Ecore_Evas *ee_target, const char *svcname, int svcnu
|
||||||
ee->engine.buffer.data = extn;
|
ee->engine.buffer.data = extn;
|
||||||
extn->ipc.handlers = eina_list_append
|
extn->ipc.handlers = eina_list_append
|
||||||
(extn->ipc.handlers,
|
(extn->ipc.handlers,
|
||||||
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD,
|
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD,
|
||||||
_ipc_client_add, ee));
|
_ipc_server_add, ee));
|
||||||
extn->ipc.handlers = eina_list_append
|
extn->ipc.handlers = eina_list_append
|
||||||
(extn->ipc.handlers,
|
(extn->ipc.handlers,
|
||||||
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL,
|
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL,
|
||||||
_ipc_client_del, ee));
|
_ipc_server_del, ee));
|
||||||
extn->ipc.handlers = eina_list_append
|
extn->ipc.handlers = eina_list_append
|
||||||
(extn->ipc.handlers,
|
(extn->ipc.handlers,
|
||||||
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA,
|
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DATA,
|
||||||
_ipc_client_data, ee));
|
_ipc_server_data, ee));
|
||||||
}
|
}
|
||||||
|
|
||||||
extn_ee_list = eina_list_append(extn_ee_list, 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);
|
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,
|
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,
|
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;
|
return o;
|
||||||
#else
|
#else
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1467,7 +1445,7 @@ ecore_evas_extn_socket_new(Ecore_Evas *ee_target, const char *svcname, int svcnu
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI void
|
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
|
#ifdef EXTN_ENABLED
|
||||||
Ecore_Evas *ee;
|
Ecore_Evas *ee;
|
||||||
|
@ -1479,7 +1457,7 @@ ecore_evas_extn_socket_object_data_lock(Evas_Object *obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI void
|
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
|
#ifdef EXTN_ENABLED
|
||||||
Ecore_Evas *ee;
|
Ecore_Evas *ee;
|
||||||
|
@ -1492,7 +1470,7 @@ ecore_evas_extn_socket_object_data_unlock(Evas_Object *obj)
|
||||||
|
|
||||||
#ifdef EXTN_ENABLED
|
#ifdef EXTN_ENABLED
|
||||||
static void
|
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;
|
Extn *extn;
|
||||||
Evas_Engine_Info_Buffer *einfo;
|
Evas_Engine_Info_Buffer *einfo;
|
||||||
|
@ -1508,7 +1486,6 @@ _ecore_evas_plug_resize(Ecore_Evas *ee, int w, int h)
|
||||||
evas_output_size_set(ee->evas, ee->w, ee->h);
|
evas_output_size_set(ee->evas, ee->w, ee->h);
|
||||||
evas_output_viewport_set(ee->evas, 0, 0, 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);
|
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
|
||||||
|
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (extn)
|
if (extn)
|
||||||
{
|
{
|
||||||
|
@ -1519,6 +1496,7 @@ _ecore_evas_plug_resize(Ecore_Evas *ee, int w, int h)
|
||||||
ee->w * ee->h * 4, extn->svc.sys);
|
ee->w * ee->h * 4, extn->svc.sys);
|
||||||
if (extn->file.shmfile)
|
if (extn->file.shmfile)
|
||||||
ee->engine.buffer.pixels = extn->file.shmfile->addr;
|
ee->engine.buffer.pixels = extn->file.shmfile->addr;
|
||||||
|
|
||||||
stride = ee->w * 4;
|
stride = ee->w * 4;
|
||||||
einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
|
einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
|
||||||
if (einfo)
|
if (einfo)
|
||||||
|
@ -1539,37 +1517,42 @@ _ecore_evas_plug_resize(Ecore_Evas *ee, int w, int h)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (extn->ipc.server && extn->file.shmfile)
|
if (extn->ipc.clients && extn->file.shmfile)
|
||||||
{
|
{
|
||||||
Ipc_Data_Resize ipc;
|
Ipc_Data_Resize ipc;
|
||||||
|
Eina_List *l;
|
||||||
|
Ecore_Ipc_Client *client;
|
||||||
|
|
||||||
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_SHM_REF,
|
EINA_LIST_FOREACH(extn->ipc.clients, l, client)
|
||||||
ee->w, ee->h, ee->alpha,
|
ecore_ipc_client_send(client, MAJOR, OP_SHM_REF,
|
||||||
extn->file.shmfile->file,
|
ee->w, ee->h, ee->alpha,
|
||||||
strlen(extn->file.shmfile->file) + 1);
|
extn->file.shmfile->file,
|
||||||
|
strlen(extn->file.shmfile->file) + 1);
|
||||||
ipc.w = ee->w;
|
ipc.w = ee->w;
|
||||||
ipc.h = ee->h;
|
ipc.h = ee->h;
|
||||||
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_RESIZE,
|
EINA_LIST_FOREACH(extn->ipc.clients, l, client)
|
||||||
0, 0, 0, &ipc, sizeof(ipc));
|
ecore_ipc_client_send(client, MAJOR, OP_RESIZE,
|
||||||
|
0, 0, 0, &ipc, sizeof(ipc));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ee->func.fn_resize) ee->func.fn_resize(ee);
|
if (ee->func.fn_resize) ee->func.fn_resize(ee);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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
|
int
|
||||||
_ecore_evas_extn_plug_render(Ecore_Evas *ee)
|
_ecore_evas_extn_socket_render(Ecore_Evas *ee)
|
||||||
{
|
{
|
||||||
Eina_List *updates = NULL, *l, *ll;
|
Eina_List *updates = NULL, *l, *ll;
|
||||||
Ecore_Evas *ee2;
|
Ecore_Evas *ee2;
|
||||||
int rend = 0;
|
int rend = 0;
|
||||||
Eina_Rectangle *r;
|
Eina_Rectangle *r;
|
||||||
Extn *extn;
|
Extn *extn;
|
||||||
|
Ecore_Ipc_Client *client;
|
||||||
|
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
|
EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
|
||||||
|
@ -1589,62 +1572,84 @@ _ecore_evas_extn_plug_render(Ecore_Evas *ee)
|
||||||
{
|
{
|
||||||
Ipc_Data_Update ipc;
|
Ipc_Data_Update ipc;
|
||||||
|
|
||||||
|
|
||||||
ipc.x = r->x;
|
ipc.x = r->x;
|
||||||
ipc.y = r->y;
|
ipc.y = r->y;
|
||||||
ipc.w = r->w;
|
ipc.w = r->w;
|
||||||
ipc.h = r->h;
|
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)
|
if (updates)
|
||||||
{
|
{
|
||||||
evas_render_updates_free(updates);
|
evas_render_updates_free(updates);
|
||||||
_ecore_evas_idle_timeout_update(ee);
|
_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;
|
return updates ? 1 : rend;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
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;
|
Ecore_Evas *ee = data;
|
||||||
Extn *extn;
|
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;
|
return ECORE_CALLBACK_PASS_ON;
|
||||||
if (!eina_list_data_find(extn_ee_list, ee))
|
if (!eina_list_data_find(extn_ee_list, ee))
|
||||||
return ECORE_CALLBACK_PASS_ON;
|
return ECORE_CALLBACK_PASS_ON;
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return ECORE_CALLBACK_PASS_ON;
|
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;
|
return ECORE_CALLBACK_PASS_ON;
|
||||||
// FIXME: find a way to let app know server there
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
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;
|
Ecore_Evas *ee = data;
|
||||||
Extn *extn;
|
Extn *extn;
|
||||||
|
|
||||||
extn = ee->engine.buffer.data;
|
extn = ee->engine.buffer.data;
|
||||||
if (!extn) return ECORE_CALLBACK_PASS_ON;
|
if (!extn) return ECORE_CALLBACK_PASS_ON;
|
||||||
if (extn->ipc.server != e->server) return ECORE_CALLBACK_PASS_ON;
|
if (!eina_list_data_find(extn->ipc.clients, e->client)) return ECORE_CALLBACK_PASS_ON;
|
||||||
extn->ipc.server = NULL;
|
|
||||||
if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
|
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;
|
return ECORE_CALLBACK_PASS_ON;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
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;
|
Ecore_Evas *ee = data;
|
||||||
Extn *extn;
|
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;
|
return ECORE_CALLBACK_PASS_ON;
|
||||||
if (!eina_list_data_find(extn_ee_list, ee))
|
if (!eina_list_data_find(extn_ee_list, ee))
|
||||||
return ECORE_CALLBACK_PASS_ON;
|
return ECORE_CALLBACK_PASS_ON;
|
||||||
|
@ -1657,9 +1662,10 @@ _ipc_server_data(void *data, int type __UNUSED__, void *event)
|
||||||
case OP_RESIZE:
|
case OP_RESIZE:
|
||||||
if ((e->data) && (e->size >= (int)sizeof(Ipc_Data_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;
|
break;
|
||||||
case OP_SHOW:
|
case OP_SHOW:
|
||||||
|
@ -1692,16 +1698,6 @@ _ipc_server_data(void *data, int type __UNUSED__, void *event)
|
||||||
if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
|
if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
|
||||||
}
|
}
|
||||||
break;
|
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:
|
case OP_EV_MOUSE_IN:
|
||||||
if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_In))
|
if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_In))
|
||||||
{
|
{
|
||||||
|
@ -1889,9 +1885,11 @@ _ipc_server_data(void *data, int type __UNUSED__, void *event)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
Extn *extn;
|
||||||
|
Eina_List *l;
|
||||||
|
Ecore_Ipc_Client *client;
|
||||||
|
|
||||||
if (((ee->alpha) && (alpha)) || ((!ee->alpha) && (!alpha))) return;
|
if (((ee->alpha) && (alpha)) || ((!ee->alpha) && (!alpha))) return;
|
||||||
ee->alpha = alpha;
|
ee->alpha = alpha;
|
||||||
|
@ -1911,14 +1909,15 @@ _ecore_evas_extn_plug_alpha_set(Ecore_Evas *ee, int alpha)
|
||||||
evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
|
evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
|
||||||
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
|
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
|
||||||
}
|
}
|
||||||
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_SHM_REF,
|
EINA_LIST_FOREACH(extn->ipc.clients, l, client)
|
||||||
ee->w, ee->h, ee->alpha,
|
ecore_ipc_client_send(client, MAJOR, OP_SHM_REF,
|
||||||
extn->file.shmfile->file,
|
ee->w, ee->h, ee->alpha,
|
||||||
strlen(extn->file.shmfile->file) + 1);
|
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,
|
_ecore_evas_extn_free,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -1937,8 +1936,8 @@ static const Ecore_Evas_Engine_Func _ecore_extn_plug_engine_func =
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
_ecore_evas_plug_resize,
|
_ecore_evas_socket_resize,
|
||||||
_ecore_evas_plug_move_resize,
|
_ecore_evas_socket_move_resize,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -1964,17 +1963,17 @@ static const Ecore_Evas_Engine_Func _ecore_extn_plug_engine_func =
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
_ecore_evas_extn_plug_alpha_set,
|
_ecore_evas_extn_socket_alpha_set,
|
||||||
NULL, //transparent
|
NULL, //transparent
|
||||||
|
|
||||||
_ecore_evas_extn_plug_render, // render
|
_ecore_evas_extn_socket_render, // render
|
||||||
NULL // screen_geometry_get
|
NULL // screen_geometry_get
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
EAPI Ecore_Evas *
|
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
|
#ifdef EXTN_ENABLED
|
||||||
Extn *extn;
|
Extn *extn;
|
||||||
|
@ -1990,9 +1989,9 @@ ecore_evas_extn_plug_new(const char *svcname, int svcnum, Eina_Bool svcsys)
|
||||||
|
|
||||||
ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
|
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->rotation = 0;
|
||||||
ee->visible = 0;
|
ee->visible = 0;
|
||||||
|
@ -2064,19 +2063,46 @@ ecore_evas_extn_plug_new(const char *svcname, int svcnum, Eina_Bool svcsys)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Ecore_Ipc_Type ipctype = ECORE_IPC_LOCAL_USER;
|
Ecore_Ipc_Type ipctype = ECORE_IPC_LOCAL_USER;
|
||||||
|
char buf[PATH_MAX];
|
||||||
|
|
||||||
ecore_ipc_init();
|
ecore_ipc_init();
|
||||||
extn->svc.name = eina_stringshare_add(svcname);
|
extn->svc.name = eina_stringshare_add(svcname);
|
||||||
extn->svc.num = svcnum;
|
extn->svc.num = svcnum;
|
||||||
extn->svc.sys = svcsys;
|
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;
|
if (extn->svc.sys) ipctype = ECORE_IPC_LOCAL_SYSTEM;
|
||||||
extn->ipc.server = ecore_ipc_server_connect(ipctype,
|
extn->ipc.am_server = EINA_TRUE;
|
||||||
(char *)extn->svc.name,
|
extn->ipc.server = ecore_ipc_server_add(ipctype,
|
||||||
extn->svc.num, ee);
|
(char *)extn->svc.name,
|
||||||
|
extn->svc.num, ee);
|
||||||
if (!extn->ipc.server)
|
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->svc.name);
|
||||||
|
eina_stringshare_del(extn->file.lock);
|
||||||
free(extn);
|
free(extn);
|
||||||
ecore_ipc_shutdown();
|
ecore_ipc_shutdown();
|
||||||
ecore_evas_free(ee);
|
ecore_evas_free(ee);
|
||||||
|
@ -2085,17 +2111,18 @@ ecore_evas_extn_plug_new(const char *svcname, int svcnum, Eina_Bool svcsys)
|
||||||
ee->engine.buffer.data = extn;
|
ee->engine.buffer.data = extn;
|
||||||
extn->ipc.handlers = eina_list_append
|
extn->ipc.handlers = eina_list_append
|
||||||
(extn->ipc.handlers,
|
(extn->ipc.handlers,
|
||||||
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD,
|
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD,
|
||||||
_ipc_server_add, ee));
|
_ipc_client_add, ee));
|
||||||
extn->ipc.handlers = eina_list_append
|
extn->ipc.handlers = eina_list_append
|
||||||
(extn->ipc.handlers,
|
(extn->ipc.handlers,
|
||||||
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL,
|
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL,
|
||||||
_ipc_server_del, ee));
|
_ipc_client_del, ee));
|
||||||
extn->ipc.handlers = eina_list_append
|
extn->ipc.handlers = eina_list_append
|
||||||
(extn->ipc.handlers,
|
(extn->ipc.handlers,
|
||||||
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DATA,
|
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA,
|
||||||
_ipc_server_data, ee));
|
_ipc_client_data, ee));
|
||||||
}
|
}
|
||||||
|
|
||||||
extn_ee_list = eina_list_append(extn_ee_list, ee);
|
extn_ee_list = eina_list_append(extn_ee_list, ee);
|
||||||
|
|
||||||
_ecore_evas_register(ee);
|
_ecore_evas_register(ee);
|
||||||
|
|
Loading…
Reference in New Issue