|
|
|
#include "ecore_evas_extn_engine.h"
|
|
|
|
|
|
|
|
#ifdef EAPI
|
|
|
|
# undef EAPI
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
# ifdef DLL_EXPORT
|
|
|
|
# define EAPI __declspec(dllexport)
|
|
|
|
# else
|
|
|
|
# define EAPI
|
|
|
|
# endif /* ! DLL_EXPORT */
|
|
|
|
#else
|
|
|
|
# ifdef __GNUC__
|
|
|
|
# if __GNUC__ >= 4
|
|
|
|
# define EAPI __attribute__ ((visibility("default")))
|
|
|
|
# else
|
|
|
|
# define EAPI
|
|
|
|
# endif
|
|
|
|
# else
|
|
|
|
# define EAPI
|
|
|
|
# endif
|
|
|
|
#endif /* ! _WIN32 */
|
|
|
|
|
|
|
|
#define NBUF 2
|
|
|
|
|
|
|
|
static int blank = 0x00000000;
|
|
|
|
static const char *interface_extn_name = "extn";
|
|
|
|
static const int interface_extn_version = 1;
|
|
|
|
static Ecore_Evas_Interface_Extn *_ecore_evas_extn_interface_new(void);
|
|
|
|
static void *_ecore_evas_socket_switch(void *data, void *dest_buf);
|
|
|
|
|
|
|
|
typedef struct _Extn Extn;
|
|
|
|
|
|
|
|
struct _Extn
|
|
|
|
{
|
|
|
|
struct {
|
|
|
|
Ecore_Ipc_Server *server;
|
|
|
|
Eina_List *clients;
|
|
|
|
Eina_List *visible_clients;
|
|
|
|
Eina_List *handlers;
|
|
|
|
} ipc;
|
|
|
|
struct {
|
|
|
|
const char *name;
|
|
|
|
int num;
|
|
|
|
Eina_Bool sys : 1;
|
|
|
|
} svc;
|
|
|
|
struct {
|
|
|
|
Eina_List *updates;
|
|
|
|
} file;
|
|
|
|
struct {
|
|
|
|
Extnbuf *buf, *obuf; // current buffer and if needed an "old" buffer
|
|
|
|
const char *base, *lock;
|
|
|
|
int id, num, w, h;
|
|
|
|
Eina_Bool sys : 1;
|
|
|
|
Eina_Bool alpha : 1;
|
|
|
|
} b[NBUF];
|
|
|
|
int cur_b; // current buffer (b) being displayed or rendered to
|
|
|
|
int prev_b; // the last buffer (b) that was rendered
|
|
|
|
struct {
|
|
|
|
Eina_Bool done : 1; /* need to send change done event to the client(plug) */
|
|
|
|
} profile;
|
|
|
|
};
|
|
|
|
|
|
|
|
static Eina_List *extn_ee_list = NULL;
|
|
|
|
|
|
|
|
static Eina_Bool
|
|
|
|
_ecore_evas_extn_module_init(void)
|
|
|
|
{
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_extn_module_shutdown(void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_extn_event_free(void *data, void *ev EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Ecore_Evas *ee = data;
|
|
|
|
_ecore_evas_unref(ee);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_extn_event(Ecore_Evas *ee, int event)
|
|
|
|
{
|
|
|
|
_ecore_evas_ref(ee);
|
|
|
|
ecore_event_add(event, ee, _ecore_evas_extn_event_free, ee);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_extn_plug_render_pre(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Ecore_Evas *ee = data;
|
|
|
|
Ecore_Evas_Engine_Buffer_Data *bdata;
|
|
|
|
Extn *extn;
|
|
|
|
|
|
|
|
if (!ee) return;
|
|
|
|
bdata = ee->engine.data;
|
|
|
|
if (!bdata) return;
|
|
|
|
extn = bdata->data;
|
|
|
|
if (!extn) return;
|
|
|
|
bdata->pixels = _extnbuf_lock(extn->b[extn->cur_b].buf, NULL, NULL, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_extn_plug_render_post(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Ecore_Evas *ee = data;
|
|
|
|
Ecore_Evas_Engine_Buffer_Data *bdata;
|
|
|
|
Extn *extn;
|
|
|
|
|
|
|
|
if (!ee) return;
|
|
|
|
bdata = ee->engine.data;
|
|
|
|
if (!bdata) return;
|
|
|
|
extn = bdata->data;
|
|
|
|
if (!extn) return;
|
|
|
|
_extnbuf_unlock(extn->b[extn->cur_b].buf);
|
|
|
|
if (extn->b[extn->cur_b].obuf)
|
|
|
|
{
|
|
|
|
_extnbuf_unlock(extn->b[extn->cur_b].obuf);
|
|
|
|
_extnbuf_free(extn->b[extn->cur_b].obuf);
|
|
|
|
extn->b[extn->cur_b].obuf = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_extn_plug_image_obj_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Ecore_Evas *ee = data;
|
|
|
|
ecore_evas_free(ee);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_extn_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
|
|
|
|
{
|
|
|
|
Evas_Coord xx, yy, ww, hh, fx, fy, fw, fh;
|
|
|
|
Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
|
|
|
|
|
|
|
|
evas_object_geometry_get(bdata->image, &xx, &yy, &ww, &hh);
|
|
|
|
evas_object_image_fill_get(bdata->image, &fx, &fy, &fw, &fh);
|
|
|
|
|
|
|
|
if (fw < 1) fw = 1;
|
|
|
|
if (fh < 1) fh = 1;
|
|
|
|
|
|
|
|
if (evas_object_map_get(bdata->image) &&
|
|
|
|
evas_object_map_enable_get(bdata->image))
|
|
|
|
{
|
|
|
|
fx = 0; fy = 0;
|
|
|
|
fw = ee->w; fh = ee->h;
|
|
|
|
ww = ee->w; hh = ee->h;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((fx == 0) && (fy == 0) && (fw == ww) && (fh == hh))
|
|
|
|
{
|
|
|
|
*x = (ee->w * (*x - xx)) / fw;
|
|
|
|
*y = (ee->h * (*y - yy)) / fh;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
xx = (*x - xx) - fx;
|
|
|
|
while (xx < 0) xx += fw;
|
|
|
|
while (xx > fw) xx -= fw;
|
|
|
|
*x = (ee->w * xx) / fw;
|
|
|
|
|
|
|
|
yy = (*y - yy) - fy;
|
|
|
|
while (yy < 0) yy += fh;
|
|
|
|
while (yy > fh) yy -= fh;
|
|
|
|
*y = (ee->h * yy) / fh;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_extn_free(Ecore_Evas *ee)
|
|
|
|
{
|
|
|
|
Extn *extn;
|
|
|
|
Ecore_Ipc_Client *client;
|
|
|
|
Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
|
|
|
|
if (!bdata) return;
|
|
|
|
|
|
|
|
extn = bdata->data;
|
|
|
|
if (extn)
|
|
|
|
{
|
|
|
|
Ecore_Event_Handler *hdl;
|
|
|
|
Ipc_Data_Update *ipc;
|
|
|
|
int i;
|
|
|
|
if (bdata->image)
|
|
|
|
{
|
|
|
|
evas_object_image_data_set(bdata->image, NULL);
|
|
|
|
evas_object_image_pixels_dirty_set(bdata->image, EINA_TRUE);
|
|
|
|
}
|
|
|
|
bdata->pixels = NULL;
|
|
|
|
for (i = 0; i < NBUF; i++)
|
|
|
|
{
|
|
|
|
if (extn->b[i].buf) _extnbuf_free(extn->b[i].buf);
|
|
|
|
if (extn->b[i].obuf) _extnbuf_free(extn->b[i].obuf);
|
|
|
|
if (extn->b[i].base) eina_stringshare_del(extn->b[i].base);
|
|
|
|
if (extn->b[i].lock) eina_stringshare_del(extn->b[i].lock);
|
|
|
|
extn->b[i].buf = NULL;
|
|
|
|
extn->b[i].obuf = NULL;
|
|
|
|
extn->b[i].base = NULL;
|
|
|
|
extn->b[i].lock = NULL;
|
|
|
|
}
|
|
|
|
if (extn->svc.name) eina_stringshare_del(extn->svc.name);
|
|
|
|
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.visible_clients) eina_list_free(extn->ipc.visible_clients);
|
|
|
|
|
|
|
|
EINA_LIST_FREE(extn->file.updates, ipc)
|
|
|
|
free(ipc);
|
|
|
|
|
|
|
|
EINA_LIST_FREE(extn->ipc.handlers, hdl)
|
|
|
|
ecore_event_handler_del(hdl);
|
|
|
|
free(extn);
|
|
|
|
ecore_ipc_shutdown();
|
|
|
|
bdata->data = NULL;
|
|
|
|
}
|
|
|
|
if (bdata->image)
|
|
|
|
{
|
|
|
|
Ecore_Evas *ee2;
|
|
|
|
|
|
|
|
evas_object_event_callback_del_full(bdata->image,
|
|
|
|
EVAS_CALLBACK_DEL,
|
|
|
|
_ecore_evas_extn_plug_image_obj_del,
|
|
|
|
ee);
|
|
|
|
evas_event_callback_del_full(evas_object_evas_get(bdata->image),
|
|
|
|
EVAS_CALLBACK_RENDER_PRE,
|
|
|
|
_ecore_evas_extn_plug_render_pre,
|
|
|
|
ee);
|
|
|
|
evas_event_callback_del_full(evas_object_evas_get(bdata->image),
|
|
|
|
EVAS_CALLBACK_RENDER_POST,
|
|
|
|
_ecore_evas_extn_plug_render_post,
|
|
|
|
ee);
|
|
|
|
ee2 = evas_object_data_get(bdata->image, "Ecore_Evas_Parent");
|
|
|
|
if (ee2)
|
|
|
|
{
|
|
|
|
ee2->sub_ecore_evas = eina_list_remove(ee2->sub_ecore_evas, ee);
|
|
|
|
}
|
|
|
|
evas_object_del(bdata->image);
|
|
|
|
bdata->image = NULL;
|
|
|
|
}
|
|
|
|
free(bdata);
|
|
|
|
ee->engine.data = NULL;
|
|
|
|
extn_ee_list = eina_list_remove(extn_ee_list, ee);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_resize(Ecore_Evas *ee, int w, int h)
|
|
|
|
{
|
|
|
|
Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
|
|
|
|
|
|
|
|
if (w < 1) w = 1;
|
|
|
|
if (h < 1) h = 1;
|
|
|
|
ee->req.w = w;
|
|
|
|
ee->req.h = h;
|
|
|
|
if ((w == ee->w) && (h == ee->h)) return;
|
|
|
|
ee->w = w;
|
|
|
|
ee->h = h;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* No need for it if not used later.
|
|
|
|
Extn *extn;
|
|
|
|
|
|
|
|
extn = bdata->data;
|
|
|
|
*/
|
|
|
|
if (bdata->image)
|
|
|
|
evas_object_image_size_set(bdata->image, ee->w, ee->h);
|
|
|
|
/* 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);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_move_resize(Ecore_Evas *ee, int x EINA_UNUSED, int y EINA_UNUSED, int w, int h)
|
|
|
|
{
|
|
|
|
_ecore_evas_resize(ee, w, h);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_ecore_evas_modifiers_locks_mask_get(Evas *e)
|
|
|
|
{
|
|
|
|
int mask = 0;
|
|
|
|
|
|
|
|
if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
|
|
|
|
mask |= MOD_SHIFT;
|
|
|
|
if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
|
|
|
|
mask |= MOD_CTRL;
|
|
|
|
if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
|
|
|
|
mask |= MOD_ALT;
|
|
|
|
if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
|
|
|
|
mask |= MOD_META;
|
|
|
|
if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
|
|
|
|
mask |= MOD_HYPER;
|
|
|
|
if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
|
|
|
|
mask |= MOD_SUPER;
|
|
|
|
if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
|
|
|
|
mask |= MOD_SCROLL;
|
|
|
|
if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
|
|
|
|
mask |= MOD_NUM;
|
|
|
|
if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
|
|
|
|
mask |= MOD_CAPS;
|
|
|
|
return mask;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_modifiers_locks_mask_set(Evas *e, int mask)
|
|
|
|
{
|
|
|
|
if (mask & MOD_SHIFT) evas_key_modifier_on (e, "Shift");
|
|
|
|
else evas_key_modifier_off(e, "Shift");
|
|
|
|
if (mask & MOD_CTRL) evas_key_modifier_on (e, "Control");
|
|
|
|
else evas_key_modifier_off(e, "Control");
|
|
|
|
if (mask & MOD_ALT) evas_key_modifier_on (e, "Alt");
|
|
|
|
else evas_key_modifier_off(e, "Alt");
|
|
|
|
if (mask & MOD_META) evas_key_modifier_on (e, "Meta");
|
|
|
|
else evas_key_modifier_off(e, "Meta");
|
|
|
|
if (mask & MOD_HYPER) evas_key_modifier_on (e, "Hyper");
|
|
|
|
else evas_key_modifier_off(e, "Hyper");
|
|
|
|
if (mask & MOD_SUPER) evas_key_modifier_on (e, "Super");
|
|
|
|
else evas_key_modifier_off(e, "Super");
|
|
|
|
if (mask & MOD_SCROLL) evas_key_lock_on (e, "Scroll_Lock");
|
|
|
|
else evas_key_lock_off(e, "Scroll_Lock");
|
|
|
|
if (mask & MOD_NUM) evas_key_lock_on (e, "Num_Lock");
|
|
|
|
else evas_key_lock_off(e, "Num_Lock");
|
|
|
|
if (mask & MOD_CAPS) evas_key_lock_on (e, "Caps_Lock");
|
|
|
|
else evas_key_lock_off(e, "Caps_Lock");
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_extn_cb_mouse_in(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Ecore_Evas *ee = data;
|
|
|
|
Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
|
|
|
|
Evas_Event_Mouse_In *ev = event_info;
|
|
|
|
Extn *extn;
|
|
|
|
|
|
|
|
extn = bdata->data;
|
|
|
|
if (!extn) return;
|
|
|
|
if (extn->ipc.server)
|
|
|
|
{
|
|
|
|
Ipc_Data_Ev_Mouse_In ipc;
|
|
|
|
memset(&ipc, 0, sizeof(ipc));
|
|
|
|
|
|
|
|
ipc.timestamp = ev->timestamp;
|
|
|
|
ipc.mask = _ecore_evas_modifiers_locks_mask_get(e);
|
|
|
|
ipc.event_flags = ev->event_flags;
|
|
|
|
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_IN, 0, 0, 0, &ipc, sizeof(ipc));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_extn_cb_mouse_out(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Ecore_Evas *ee = data;
|
|
|
|
Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
|
|
|
|
Evas_Event_Mouse_Out *ev = event_info;
|
|
|
|
Extn *extn;
|
|
|
|
|
|
|
|
extn = bdata->data;
|
|
|
|
if (!extn) return;
|
|
|
|
if (extn->ipc.server)
|
|
|
|
{
|
|
|
|
Ipc_Data_Ev_Mouse_Out ipc;
|
|
|
|
memset(&ipc, 0, sizeof(ipc));
|
|
|
|
|
|
|
|
ipc.timestamp = ev->timestamp;
|
|
|
|
ipc.mask = _ecore_evas_modifiers_locks_mask_get(e);
|
|
|
|
ipc.event_flags = ev->event_flags;
|
|
|
|
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_OUT, 0, 0, 0, &ipc, sizeof(ipc));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_extn_cb_mouse_down(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
|
|
|
|
{
|
|
|
|
Ecore_Evas *ee = data;
|
|
|
|
Evas_Event_Mouse_Down *ev = event_info;
|
|
|
|
Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
|
|
|
|
Extn *extn;
|
|
|
|
|
|
|
|
extn = bdata->data;
|
|
|
|
if (!extn) return;
|
|
|
|
if (extn->ipc.server)
|
|
|
|
{
|
|
|
|
/* We have send mouse move event before mouse down event */
|
|
|
|
{
|
|
|
|
Ipc_Data_Ev_Mouse_Move ipc_move;
|
|
|
|
memset(&ipc_move, 0, sizeof(ipc_move));
|
|
|
|
Evas_Coord x, y;
|
|
|
|
|
|
|
|
x = ev->canvas.x;
|
|
|
|
y = ev->canvas.y;
|
|
|
|
_ecore_evas_extn_coord_translate(ee, &x, &y);
|
|
|
|
ipc_move.x = x;
|
|
|
|
ipc_move.y = y;
|
|
|
|
ipc_move.timestamp = ev->timestamp;
|
|
|
|
ipc_move.mask = _ecore_evas_modifiers_locks_mask_get(e);
|
|
|
|
ipc_move.event_flags = ev->event_flags;
|
|
|
|
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_MOVE, 0, 0, 0, &ipc_move, sizeof(ipc_move));
|
|
|
|
}
|
|
|
|
{
|
|
|
|
Ipc_Data_Ev_Mouse_Down ipc;
|
|
|
|
memset(&ipc, 0, sizeof(ipc));
|
|
|
|
ipc.b = ev->button;
|
|
|
|
ipc.flags = ev->flags;
|
|
|
|
ipc.timestamp = ev->timestamp;
|
|
|
|
ipc.mask = _ecore_evas_modifiers_locks_mask_get(e);
|
|
|
|
ipc.event_flags = ev->event_flags;
|
|
|
|
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_DOWN, 0, 0, 0, &ipc, sizeof(ipc));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_extn_cb_mouse_up(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
|
|
|
|
{
|
|
|
|
Ecore_Evas *ee = data;
|
|
|
|
Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
|
|
|
|
Evas_Event_Mouse_Up *ev = event_info;
|
|
|
|
Extn *extn;
|
|
|
|
|
|
|
|
extn = bdata->data;
|
|
|
|
if (!extn) return;
|
|
|
|
if (extn->ipc.server)
|
|
|
|
{
|
|
|
|
Ipc_Data_Ev_Mouse_Up ipc;
|
|
|
|
memset(&ipc, 0, sizeof(ipc));
|
|
|
|
|
|
|
|
ipc.b = ev->button;
|
|
|
|
ipc.flags = ev->flags;
|
|
|
|
ipc.timestamp = ev->timestamp;
|
|
|
|
ipc.mask = _ecore_evas_modifiers_locks_mask_get(e);
|
|
|
|
ipc.event_flags = ev->event_flags;
|
|
|
|
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_UP, 0, 0, 0, &ipc, sizeof(ipc));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_extn_cb_mouse_move(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
|
|
|
|
{
|
|
|
|
Ecore_Evas *ee = data;
|
|
|
|
Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
|
|
|
|
Evas_Event_Mouse_Move *ev = event_info;
|
|
|
|
Extn *extn;
|
|
|
|
|
|
|
|
extn = bdata->data;
|
|
|
|
if (!extn) return;
|
|
|
|
if (extn->ipc.server)
|
|
|
|
{
|
|
|
|
Ipc_Data_Ev_Mouse_Move ipc;
|
|
|
|
memset(&ipc, 0, sizeof(ipc));
|
|
|
|
Evas_Coord x, y;
|
|
|
|
|
|
|
|
x = ev->cur.canvas.x;
|
|
|
|
y = ev->cur.canvas.y;
|
|
|
|
_ecore_evas_extn_coord_translate(ee, &x, &y);
|
|
|
|
ipc.x = x;
|
|
|
|
ipc.y = y;
|
|
|
|
ipc.timestamp = ev->timestamp;
|
|
|
|
ipc.mask = _ecore_evas_modifiers_locks_mask_get(e);
|
|
|
|
ipc.event_flags = ev->event_flags;
|
|
|
|
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_MOVE, 0, 0, 0, &ipc, sizeof(ipc));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_extn_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
|
|
|
|
{
|
|
|
|
Ecore_Evas *ee = data;
|
|
|
|
Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
|
|
|
|
Evas_Event_Mouse_Wheel *ev = event_info;
|
|
|
|
Extn *extn;
|
|
|
|
|
|
|
|
extn = bdata->data;
|
|
|
|
if (!extn) return;
|
|
|
|
if (extn->ipc.server)
|
|
|
|
{
|
|
|
|
Ipc_Data_Ev_Mouse_Wheel ipc;
|
|
|
|
memset(&ipc, 0, sizeof(ipc));
|
|
|
|
|
|
|
|
ipc.direction = ev->direction;
|
|
|
|
ipc.z = ev->z;
|
|
|
|
ipc.timestamp = ev->timestamp;
|
|
|
|
ipc.mask = _ecore_evas_modifiers_locks_mask_get(e);
|
|
|
|
ipc.event_flags = ev->event_flags;
|
|
|
|
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_WHEEL, 0, 0, 0, &ipc, sizeof(ipc));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_extn_cb_multi_down(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
|
|
|
|
{
|
|
|
|
Ecore_Evas *ee = data;
|
|
|
|
Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
|
|
|
|
Evas_Event_Multi_Down *ev = event_info;
|
|
|
|
Extn *extn;
|
|
|
|
|
|
|
|
extn = bdata->data;
|
|
|
|
if (!extn) return;
|
|
|
|
if (extn->ipc.server)
|
|
|
|
{
|
|
|
|
Ipc_Data_Ev_Multi_Down ipc;
|
|
|
|
memset(&ipc, 0, sizeof(ipc));
|
|
|
|
Evas_Coord x, y;
|
|
|
|
|
|
|
|
ipc.d = ev->device;
|
|
|
|
x = ev->canvas.x;
|
|
|
|
y = ev->canvas.y;
|
|
|
|
_ecore_evas_extn_coord_translate(ee, &x, &y);
|
|
|
|
ipc.x = x;
|
|
|
|
ipc.y = y;
|
|
|
|
ipc.rad = ev->radius;
|
|
|
|
ipc.radx = ev->radius_x;
|
|
|
|
ipc.rady = ev->radius_y;
|
|
|
|
ipc.pres = ev->pressure;
|
|
|
|
ipc.ang = ev->angle;
|
|
|
|
ipc.fx = ev->canvas.xsub;
|
|
|
|
ipc.fy = ev->canvas.ysub;
|
|
|
|
ipc.flags = ev->flags;
|
|
|
|
ipc.timestamp = ev->timestamp;
|
|
|
|
ipc.mask = _ecore_evas_modifiers_locks_mask_get(e);
|
|
|
|
ipc.event_flags = ev->event_flags;
|
|
|
|
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MULTI_DOWN, 0, 0, 0, &ipc, sizeof(ipc));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_extn_cb_multi_up(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
|
|
|
|
{
|
|
|
|
Ecore_Evas *ee = data;
|
|
|
|
Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
|
|
|
|
Evas_Event_Multi_Up *ev = event_info;
|
|
|
|
Extn *extn;
|
|
|
|
|
|
|
|
extn = bdata->data;
|
|
|
|
if (!extn) return;
|
|
|
|
if (extn->ipc.server)
|
|
|
|
{
|
|
|
|
Ipc_Data_Ev_Multi_Up ipc;
|
|
|
|
memset(&ipc, 0, sizeof(ipc));
|
|
|
|
Evas_Coord x, y;
|
|
|
|
|
|
|
|
ipc.d = ev->device;
|
|
|
|
x = ev->canvas.x;
|
|
|
|
y = ev->canvas.y;
|
|
|
|
_ecore_evas_extn_coord_translate(ee, &x, &y);
|
|
|
|
ipc.x = x;
|
|
|
|
ipc.y = y;
|
|
|
|
ipc.rad = ev->radius;
|
|
|
|
ipc.radx = ev->radius_x;
|
|
|
|
ipc.rady = ev->radius_y;
|
|
|
|
ipc.pres = ev->pressure;
|
|
|
|
ipc.ang = ev->angle;
|
|
|
|
ipc.fx = ev->canvas.xsub;
|
|
|
|
ipc.fy = ev->canvas.ysub;
|
|
|
|
ipc.flags = ev->flags;
|
|
|
|
ipc.timestamp = ev->timestamp;
|
|
|
|
ipc.mask = _ecore_evas_modifiers_locks_mask_get(e);
|
|
|
|
ipc.event_flags = ev->event_flags;
|
|
|
|
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MULTI_UP, 0, 0, 0, &ipc, sizeof(ipc));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_extn_cb_multi_move(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
|
|
|
|
{
|
|
|
|
Ecore_Evas *ee = data;
|
|
|
|
Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
|
|
|
|
Evas_Event_Multi_Move *ev = event_info;
|
|
|
|
Extn *extn;
|
|
|
|
|
|
|
|
extn = bdata->data;
|
|
|
|
if (!extn) return;
|
|
|
|
if (extn->ipc.server)
|
|
|
|
{
|
|
|
|
Ipc_Data_Ev_Multi_Move ipc;
|
|
|
|
memset(&ipc, 0, sizeof(ipc));
|
|
|
|
Evas_Coord x, y;
|
|
|
|
|
|
|
|
ipc.d = ev->device;
|
|
|
|
x = ev->cur.canvas.x;
|
|
|
|
y = ev->cur.canvas.y;
|
|
|
|
_ecore_evas_extn_coord_translate(ee, &x, &y);
|
|
|
|
ipc.x = x;
|
|
|
|
ipc.y = y;
|
|
|
|
ipc.rad = ev->radius;
|
|
|
|
ipc.radx = ev->radius_x;
|
|
|
|
ipc.rady = ev->radius_y;
|
|
|
|
ipc.pres = ev->pressure;
|
|
|
|
ipc.ang = ev->angle;
|
|
|
|
ipc.fx = ev->cur.canvas.xsub;
|
|
|
|
ipc.fy = ev->cur.canvas.ysub;
|
|
|
|
ipc.timestamp = ev->timestamp;
|
|
|
|
ipc.mask = _ecore_evas_modifiers_locks_mask_get(e);
|
|
|
|
ipc.event_flags = ev->event_flags;
|
|
|
|
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MULTI_MOVE, 0, 0, 0, &ipc, sizeof(ipc));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_extn_cb_key_down(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
|
|
|
|
{
|
|
|
|
Ecore_Evas *ee = data;
|
|
|
|
Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
|
|
|
|
Evas_Event_Key_Down *ev = event_info;
|
|
|
|
Extn *extn;
|
|
|
|
|
|
|
|
extn = bdata->data;
|
|
|
|
if (!extn) return;
|
|
|
|
if (extn->ipc.server)
|
|
|
|
{
|
|
|
|
Ipc_Data_Ev_Key_Down *ipc;
|
|
|
|
char *st, *p;
|
|
|
|
int len = 0;
|
|
|
|
|
|
|
|
len = sizeof(Ipc_Data_Ev_Key_Down);
|
|
|
|
if (ev->key) len += strlen(ev->key) + 1;
|
|
|
|
if (ev->keyname) len += strlen(ev->keyname) + 1;
|
|
|
|
if (ev->string) len += strlen(ev->string) + 1;
|
|
|
|
if (ev->compose) len += strlen(ev->compose) + 1;
|
|
|
|
len += 1;
|
|
|
|
st = alloca(len);
|
|
|
|
ipc = (Ipc_Data_Ev_Key_Down *)st;
|
|
|
|
memset(st, 0, len);
|
|
|
|
p = st + sizeof(Ipc_Data_Ev_Key_Down);
|
|
|
|
if (ev->key)
|
|
|
|
{
|
|
|
|
strcpy(p, ev->key);
|
|
|
|
ipc->key = p - (long)st;
|
|
|
|
p += strlen(p) + 1;
|
|
|
|
}
|
|
|
|
if (ev->keyname)
|
|
|
|
{
|
|
|
|
strcpy(p, ev->keyname);
|
|
|
|
ipc->keyname = p - (long)st;
|
|
|
|
p += strlen(p) + 1;
|
|
|
|
}
|
|
|
|
if (ev->string)
|
|
|
|
{
|
|
|
|
strcpy(p, ev->string);
|
|
|
|
ipc->string = p - (long)st;
|
|
|
|
p += strlen(p) + 1;
|
|
|
|
}
|
|
|
|
if (ev->compose)
|
|
|
|
{
|
|
|
|
strcpy(p, ev->compose);
|
|
|
|
ipc->compose = p - (long)st;
|
|
|
|
p += strlen(p) + 1;
|
|
|
|
}
|
|
|
|
ipc->timestamp = ev->timestamp;
|
|
|
|
ipc->mask = _ecore_evas_modifiers_locks_mask_get(e);
|
|
|
|
ipc->event_flags = ev->event_flags;
|
|
|
|
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_KEY_DOWN, 0, 0, 0, ipc, len);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_evas_extn_cb_key_up(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
|
|
|
|
{
|
|
|
|
Ecore_Evas *ee = data;
|
|
|
|
Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
|
|
|
|
Evas_Event_Key_Up *ev = event_info;
|
|
|
|
Extn *extn;
|
|
|
|
|
|
|
|
extn = bdata->data;
|
|
|
|
if (!extn) return;
|
|
|
|
if (extn->ipc.server)
|
|
|
|
{
|
|
|
|
Ipc_Data_Ev_Key_Up *ipc;
|
|
|
|
char *st, *p;
|
|
|
|
int len = 0;
|
|
|
|
|
|
|
|
len = sizeof(Ipc_Data_Ev_Key_Up);
|
|
|
|
if (ev->key) len += strlen(ev->key) + 1;
|
|
|
|
if (ev->< |