9 #include "ecore_private.h"
10 #include <Ecore_Input.h>
12 #ifdef BUILD_ECORE_IPC
13 # ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
14 # define EXTN_ENABLED 1
18 #include "ecore_evas_private.h"
19 #include "Ecore_Evas.h"
21 #include "Ecore_Ipc.h"
25 #include <sys/types.h>
28 #include <netinet/in.h>
36 typedef struct _Shmfile Shmfile;
46 static int blank = 0x00000000;
49 shmfile_new(const char *base, int id, int size, Eina_Bool sys)
54 sf = calloc(1, sizeof(Shmfile));
59 snprintf(file, sizeof(file), "/%s-%i-%i.%i.%i",
60 base, id, (int)time(NULL), (int)getpid(), (int)rand());
61 mode = S_IRUSR | S_IWUSR;
62 if (sys) mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
63 sf->fd = shm_open(file, O_RDWR | O_CREAT | O_EXCL, mode);
67 sf->file = eina_stringshare_add(file);
72 eina_stringshare_del(sf->file);
77 if (ftruncate(sf->fd, size) < 0)
81 eina_stringshare_del(sf->file);
85 sf->addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, sf->fd, 0);
86 if (sf->addr == MAP_FAILED)
90 eina_stringshare_del(sf->file);
98 shmfile_free(Shmfile *sf)
100 munmap(sf->addr, sf->size);
102 shm_unlink(sf->file);
103 eina_stringshare_del(sf->file);
108 shmfile_open(const char *ref, int size, Eina_Bool sys)
113 sf = calloc(1, sizeof(Shmfile));
114 mode = S_IRUSR | S_IWUSR;
115 if (sys) mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
116 sf->fd = shm_open(ref, O_RDWR, mode);
122 sf->file = eina_stringshare_add(ref);
126 eina_stringshare_del(sf->file);
131 sf->addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, sf->fd, 0);
132 if (sf->addr == MAP_FAILED)
135 eina_stringshare_del(sf->file);
143 shmfile_close(Shmfile *sf)
145 munmap(sf->addr, sf->size);
147 eina_stringshare_del(sf->file);
151 // procotol version - change this as needed
181 MOD_SHIFT = (1 << 0),
185 MOD_HYPER = (1 << 4),
186 MOD_SUPER = (1 << 5),
189 MOD_SCROLL = (1 << 8),
192 typedef struct _Ipc_Data_Resize Ipc_Data_Resize;
193 typedef struct _Ipc_Data_Update Ipc_Data_Update;
194 typedef struct _Ipc_Data_Ev_Mouse_In Ipc_Data_Ev_Mouse_In;
195 typedef struct _Ipc_Data_Ev_Mouse_Out Ipc_Data_Ev_Mouse_Out;
196 typedef struct _Ipc_Data_Ev_Mouse_Up Ipc_Data_Ev_Mouse_Up;
197 typedef struct _Ipc_Data_Ev_Mouse_Down Ipc_Data_Ev_Mouse_Down;
198 typedef struct _Ipc_Data_Ev_Mouse_Move Ipc_Data_Ev_Mouse_Move;
199 typedef struct _Ipc_Data_Ev_Mouse_Wheel Ipc_Data_Ev_Mouse_Wheel;
200 typedef struct _Ipc_Data_Ev_Hold Ipc_Data_Ev_Hold;
201 typedef struct _Ipc_Data_Ev_Multi_Up Ipc_Data_Ev_Multi_Up;
202 typedef struct _Ipc_Data_Ev_Multi_Down Ipc_Data_Ev_Multi_Down;
203 typedef struct _Ipc_Data_Ev_Multi_Move Ipc_Data_Ev_Multi_Move;
204 typedef struct _Ipc_Data_Ev_Key_Up Ipc_Data_Ev_Key_Up;
205 typedef struct _Ipc_Data_Ev_Key_Down Ipc_Data_Ev_Key_Down;
207 struct _Ipc_Data_Resize
212 struct _Ipc_Data_Update
217 struct _Ipc_Data_Ev_Mouse_In
219 unsigned int timestamp;
221 Evas_Event_Flags event_flags;
224 struct _Ipc_Data_Ev_Mouse_Out
226 unsigned int timestamp;
228 Evas_Event_Flags event_flags;
231 struct _Ipc_Data_Ev_Mouse_Up
234 Evas_Button_Flags flags;
236 unsigned int timestamp;
237 Evas_Event_Flags event_flags;
240 struct _Ipc_Data_Ev_Mouse_Down
243 Evas_Button_Flags flags;
245 unsigned int timestamp;
246 Evas_Event_Flags event_flags;
249 struct _Ipc_Data_Ev_Mouse_Move
252 Evas_Button_Flags flags;
254 unsigned int timestamp;
255 Evas_Event_Flags event_flags;
258 struct _Ipc_Data_Ev_Mouse_Wheel
261 Evas_Button_Flags flags;
263 unsigned int timestamp;
264 Evas_Event_Flags event_flags;
267 struct _Ipc_Data_Ev_Hold
270 unsigned int timestamp;
271 Evas_Event_Flags event_flags;
274 struct _Ipc_Data_Ev_Multi_Up
276 Evas_Button_Flags flags;
278 double rad, radx, rady, pres, ang, fx, fy;
280 unsigned int timestamp;
281 Evas_Event_Flags event_flags;
284 struct _Ipc_Data_Ev_Multi_Down
286 Evas_Button_Flags flags;
288 double rad, radx, rady, pres, ang, fx, fy;
290 unsigned int timestamp;
291 Evas_Event_Flags event_flags;
294 struct _Ipc_Data_Ev_Multi_Move
297 double rad, radx, rady, pres, ang, fx, fy;
299 unsigned int timestamp;
300 Evas_Event_Flags event_flags;
303 struct _Ipc_Data_Ev_Key_Up
305 const char *keyname, *key, *string, *compose;
307 unsigned int timestamp;
308 Evas_Event_Flags event_flags;
311 struct _Ipc_Data_Ev_Key_Down
313 const char *keyname, *key, *string, *compose;
315 unsigned int timestamp;
316 Evas_Event_Flags event_flags;
319 typedef struct _Extn Extn;
324 Ecore_Ipc_Server *server;
327 Eina_Bool am_server : 1;
341 Eina_Bool have_lock : 1;
345 static Eina_List *extn_ee_list = NULL;
347 EAPI int ECORE_EVAS_EXTN_CLIENT_ADD = 0;
348 EAPI int ECORE_EVAS_EXTN_CLIENT_DEL = 0;
351 _ecore_evas_extn_init(void)
353 if (ECORE_EVAS_EXTN_CLIENT_ADD) return;
354 ECORE_EVAS_EXTN_CLIENT_ADD = ecore_event_type_new();
355 ECORE_EVAS_EXTN_CLIENT_DEL = ecore_event_type_new();
359 _ecore_evas_extn_shutdown(void)
364 _ecore_evas_extn_event_free(void *data, void *ev __UNUSED__)
366 Ecore_Evas *ee = data;
367 if (ee->engine.buffer.image)
368 evas_object_unref(ee->engine.buffer.image);
369 _ecore_evas_unref(ee);
373 _ecore_evas_extn_event(Ecore_Evas *ee, int event)
376 if (ee->engine.buffer.image)
377 evas_object_ref(ee->engine.buffer.image);
378 ecore_event_add(event, ee->engine.buffer.image,
379 _ecore_evas_extn_event_free, ee);
383 _ecore_evas_socket_lock(Ecore_Evas *ee)
387 extn = ee->engine.buffer.data;
389 if (extn->file.lockfd < 0) return;
390 if (extn->file.have_lock) return;
391 flock(extn->file.lockfd, LOCK_EX);
392 extn->file.have_lock = EINA_TRUE;
396 _ecore_evas_socket_unlock(Ecore_Evas *ee)
400 extn = ee->engine.buffer.data;
402 if (extn->file.lockfd < 0) return;
403 if (!extn->file.have_lock) return;
404 flock(extn->file.lockfd, LOCK_UN);
405 extn->file.have_lock = EINA_FALSE;
409 _ecore_evas_extn_plug_targer_render_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
411 Ecore_Evas *ee = data;
412 if (ee) _ecore_evas_socket_lock(ee);
416 _ecore_evas_extn_plug_targer_render_post(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
418 Ecore_Evas *ee = data;
419 if (ee) _ecore_evas_socket_unlock(ee);
423 _ecore_evas_extn_plug_image_obj_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
425 Ecore_Evas *ee = data;
426 if (ee) ecore_evas_free(ee);
430 _ecore_evas_extn_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
432 Evas_Coord xx, yy, ww, hh, fx, fy, fw, fh;
434 evas_object_geometry_get(ee->engine.buffer.image, &xx, &yy, &ww, &hh);
435 evas_object_image_fill_get(ee->engine.buffer.image, &fx, &fy, &fw, &fh);
440 if (evas_object_map_get(ee->engine.buffer.image) &&
441 evas_object_map_enable_get(ee->engine.buffer.image))
444 fw = ee->w; fh = ee->h;
445 ww = ee->w; hh = ee->h;
448 if ((fx == 0) && (fy == 0) && (fw == ww) && (fh == hh))
450 *x = (ee->w * (*x - xx)) / fw;
451 *y = (ee->h * (*y - yy)) / fh;
456 while (xx < 0) xx += fw;
457 while (xx > fw) xx -= fw;
458 *x = (ee->w * xx) / fw;
461 while (yy < 0) yy += fh;
462 while (yy > fh) yy -= fh;
463 *y = (ee->h * yy) / fh;
468 _ecore_evas_extn_free(Ecore_Evas *ee)
471 Ecore_Ipc_Client *client;
473 extn = ee->engine.buffer.data;
476 Ecore_Event_Handler *hdl;
478 if (extn->file.have_lock)
479 _ecore_evas_socket_unlock(ee);
480 if (extn->file.lockfd)
482 close(extn->file.lockfd);
483 if (extn->ipc.am_server)
485 if (extn->file.lock) unlink(extn->file.lock);
488 if (extn->svc.name) eina_stringshare_del(extn->svc.name);
489 if (extn->ipc.clients)
491 EINA_LIST_FREE(extn->ipc.clients, client)
492 ecore_ipc_client_del(client);
494 if (extn->ipc.server) ecore_ipc_server_del(extn->ipc.server);
495 if (extn->file.lock) eina_stringshare_del(extn->file.lock);
496 if (extn->file.shm) eina_stringshare_del(extn->file.shm);
497 if (extn->file.shmfile)
499 if (extn->ipc.am_server)
500 shmfile_free(extn->file.shmfile);
502 shmfile_close(extn->file.shmfile);
505 EINA_LIST_FREE(extn->ipc.handlers, hdl)
506 ecore_event_handler_del(hdl);
508 ecore_ipc_shutdown();
509 ee->engine.buffer.data = NULL;
511 if (ee->engine.buffer.image)
515 evas_object_event_callback_del_full(ee->engine.buffer.image,
517 _ecore_evas_extn_plug_image_obj_del,
519 evas_event_callback_del_full(evas_object_evas_get(ee->engine.buffer.image),
520 EVAS_CALLBACK_RENDER_PRE,
521 _ecore_evas_extn_plug_targer_render_pre,
523 evas_event_callback_del_full(evas_object_evas_get(ee->engine.buffer.image),
524 EVAS_CALLBACK_RENDER_POST,
525 _ecore_evas_extn_plug_targer_render_post,
527 evas_object_del(ee->engine.buffer.image);
528 ee2 = evas_object_data_get(ee->engine.buffer.image, "Ecore_Evas_Parent");
531 ee2->sub_ecore_evas = eina_list_remove(ee2->sub_ecore_evas, ee);
534 extn_ee_list = eina_list_remove(extn_ee_list, ee);
538 _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
546 if ((w == ee->w) && (h == ee->h)) return;
550 extn = ee->engine.buffer.data;
551 if (ee->engine.buffer.image)
552 evas_object_image_size_set(ee->engine.buffer.image, ee->w, ee->h);
553 /* Server can have many plugs, so I block resize comand from client to server *
554 if ((extn) && (extn->ipc.server))
560 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_RESIZE, 0, 0, 0, &ipc, sizeof(ipc));
562 if (ee->func.fn_resize) ee->func.fn_resize(ee);
566 _ecore_evas_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int w, int h)
568 _ecore_evas_resize(ee, w, h);
572 _ecore_evas_modifiers_locks_mask_get(Evas *e)
576 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
578 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
580 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
582 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
584 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
586 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
588 if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
590 if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
592 if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
598 _ecore_evas_modifiers_locks_mask_set(Evas *e, int mask)
600 if (mask & MOD_SHIFT) evas_key_modifier_on (e, "Shift");
601 else evas_key_modifier_off(e, "Shift");
602 if (mask & MOD_CTRL) evas_key_modifier_on (e, "Control");
603 else evas_key_modifier_off(e, "Control");
604 if (mask & MOD_ALT) evas_key_modifier_on (e, "Alt");
605 else evas_key_modifier_off(e, "Alt");
606 if (mask & MOD_META) evas_key_modifier_on (e, "Meta");
607 else evas_key_modifier_off(e, "Meta");
608 if (mask & MOD_HYPER) evas_key_modifier_on (e, "Hyper");
609 else evas_key_modifier_off(e, "Hyper");
610 if (mask & MOD_SUPER) evas_key_modifier_on (e, "Super");
611 else evas_key_modifier_off(e, "Super");
612 if (mask & MOD_SCROLL) evas_key_lock_on (e, "Scroll_Lock");
613 else evas_key_lock_off(e, "Scroll_Lock");
614 if (mask & MOD_NUM) evas_key_lock_on (e, "Num_Lock");
615 else evas_key_lock_off(e, "Num_Lock");
616 if (mask & MOD_CAPS) evas_key_lock_on (e, "Caps_Lock");
617 else evas_key_lock_off(e, "Caps_Lock");
621 _ecore_evas_extn_cb_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
623 Ecore_Evas *ee = data;
624 Evas_Event_Mouse_In *ev = event_info;
627 extn = ee->engine.buffer.data;
629 if (extn->ipc.server)
631 Ipc_Data_Ev_Mouse_In ipc;
633 ipc.timestamp = ev->timestamp;
634 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
635 ipc.event_flags = ev->event_flags;
636 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_IN, 0, 0, 0, &ipc, sizeof(ipc));
641 _ecore_evas_extn_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
643 Ecore_Evas *ee = data;
644 Evas_Event_Mouse_Out *ev = event_info;
647 extn = ee->engine.buffer.data;
649 if (extn->ipc.server)
651 Ipc_Data_Ev_Mouse_Out ipc;
653 ipc.timestamp = ev->timestamp;
654 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
655 ipc.event_flags = ev->event_flags;
656 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_OUT, 0, 0, 0, &ipc, sizeof(ipc));
661 _ecore_evas_extn_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
663 Ecore_Evas *ee = data;
664 Evas_Event_Mouse_Down *ev = event_info;
667 extn = ee->engine.buffer.data;
669 if (extn->ipc.server)
671 Ipc_Data_Ev_Mouse_Down ipc;
674 ipc.flags = ev->flags;
675 ipc.timestamp = ev->timestamp;
676 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
677 ipc.event_flags = ev->event_flags;
678 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_DOWN, 0, 0, 0, &ipc, sizeof(ipc));
683 _ecore_evas_extn_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
685 Ecore_Evas *ee = data;
686 Evas_Event_Mouse_Up *ev = event_info;
689 extn = ee->engine.buffer.data;
691 if (extn->ipc.server)
693 Ipc_Data_Ev_Mouse_Up ipc;
696 ipc.flags = ev->flags;
697 ipc.timestamp = ev->timestamp;
698 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
699 ipc.event_flags = ev->event_flags;
700 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_UP, 0, 0, 0, &ipc, sizeof(ipc));
705 _ecore_evas_extn_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
707 Ecore_Evas *ee = data;
708 Evas_Event_Mouse_Move *ev = event_info;
711 extn = ee->engine.buffer.data;
713 if (extn->ipc.server)
715 Ipc_Data_Ev_Mouse_Move ipc;
718 x = ev->cur.canvas.x;
719 y = ev->cur.canvas.y;
720 _ecore_evas_extn_coord_translate(ee, &x, &y);
723 ipc.timestamp = ev->timestamp;
724 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
725 ipc.event_flags = ev->event_flags;
726 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_MOVE, 0, 0, 0, &ipc, sizeof(ipc));
731 _ecore_evas_extn_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
733 Ecore_Evas *ee = data;
734 Evas_Event_Mouse_Wheel *ev = event_info;
737 extn = ee->engine.buffer.data;
739 if (extn->ipc.server)
741 Ipc_Data_Ev_Mouse_Wheel ipc;
743 ipc.direction = ev->direction;
745 ipc.timestamp = ev->timestamp;
746 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
747 ipc.event_flags = ev->event_flags;
748 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_WHEEL, 0, 0, 0, &ipc, sizeof(ipc));
753 _ecore_evas_extn_cb_multi_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
755 Ecore_Evas *ee = data;
756 Evas_Event_Multi_Down *ev = event_info;
759 extn = ee->engine.buffer.data;
761 if (extn->ipc.server)
763 Ipc_Data_Ev_Multi_Down ipc;
769 _ecore_evas_extn_coord_translate(ee, &x, &y);
772 ipc.rad = ev->radius;
773 ipc.radx = ev->radius_x;
774 ipc.rady = ev->radius_y;
775 ipc.pres = ev->pressure;
777 ipc.fx = ev->canvas.xsub;
778 ipc.fy = ev->canvas.ysub;
779 ipc.flags = ev->flags;
780 ipc.timestamp = ev->timestamp;
781 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
782 ipc.event_flags = ev->event_flags;
783 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MULTI_DOWN, 0, 0, 0, &ipc, sizeof(ipc));
789 _ecore_evas_extn_cb_multi_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
791 Ecore_Evas *ee = data;
792 Evas_Event_Multi_Up *ev = event_info;
795 extn = ee->engine.buffer.data;
797 if (extn->ipc.server)
799 Ipc_Data_Ev_Multi_Up ipc;
805 _ecore_evas_extn_coord_translate(ee, &x, &y);
808 ipc.rad = ev->radius;
809 ipc.radx = ev->radius_x;
810 ipc.rady = ev->radius_y;
811 ipc.pres = ev->pressure;
813 ipc.fx = ev->canvas.xsub;
814 ipc.fy = ev->canvas.ysub;
815 ipc.flags = ev->flags;
816 ipc.timestamp = ev->timestamp;
817 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
818 ipc.event_flags = ev->event_flags;
819 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MULTI_UP, 0, 0, 0, &ipc, sizeof(ipc));
824 _ecore_evas_extn_cb_multi_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
826 Ecore_Evas *ee = data;
827 Evas_Event_Multi_Move *ev = event_info;
830 extn = ee->engine.buffer.data;
832 if (extn->ipc.server)
834 Ipc_Data_Ev_Multi_Move ipc;
838 x = ev->cur.canvas.x;
839 y = ev->cur.canvas.y;
840 _ecore_evas_extn_coord_translate(ee, &x, &y);
843 ipc.rad = ev->radius;
844 ipc.radx = ev->radius_x;
845 ipc.rady = ev->radius_y;
846 ipc.pres = ev->pressure;
848 ipc.fx = ev->cur.canvas.xsub;
849 ipc.fy = ev->cur.canvas.ysub;
850 ipc.timestamp = ev->timestamp;
851 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
852 ipc.event_flags = ev->event_flags;
853 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MULTI_MOVE, 0, 0, 0, &ipc, sizeof(ipc));
858 _ecore_evas_extn_cb_free(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
863 if (ee->driver) _ecore_evas_free(ee);
867 _ecore_evas_extn_cb_key_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
869 Ecore_Evas *ee = data;
870 Evas_Event_Key_Down *ev = event_info;
873 extn = ee->engine.buffer.data;
875 if (extn->ipc.server)
877 Ipc_Data_Ev_Key_Down *ipc;
881 len = sizeof(Ipc_Data_Ev_Key_Down);
882 if (ev->key) len += strlen(ev->key) + 1;
883 if (ev->keyname) len += strlen(ev->keyname) + 1;
884 if (ev->string) len += strlen(ev->string) + 1;
885 if (ev->compose) len += strlen(ev->compose) + 1;
888 ipc = (Ipc_Data_Ev_Key_Down *)st;
890 p = st + sizeof(Ipc_Data_Ev_Key_Down);
894 ipc->key = p - (long)st;
899 strcpy(p, ev->keyname);
900 ipc->keyname = p - (long)st;
905 strcpy(p, ev->string);
906 ipc->string = p - (long)st;
911 strcpy(p, ev->compose);
912 ipc->compose = p - (long)st;
915 ipc->timestamp = ev->timestamp;
916 ipc->mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
917 ipc->event_flags = ev->event_flags;
918 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_KEY_DOWN, 0, 0, 0, ipc, len);
923 _ecore_evas_extn_cb_key_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
925 Ecore_Evas *ee = data;
926 Evas_Event_Key_Up *ev = event_info;
929 extn = ee->engine.buffer.data;
931 if (extn->ipc.server)
933 Ipc_Data_Ev_Key_Up *ipc;
937 len = sizeof(Ipc_Data_Ev_Key_Up);
938 if (ev->key) len += strlen(ev->key) + 1;
939 if (ev->keyname) len += strlen(ev->keyname) + 1;
940 if (ev->string) len += strlen(ev->string) + 1;
941 if (ev->compose) len += strlen(ev->compose) + 1;
944 ipc = (Ipc_Data_Ev_Key_Up *)st;
946 p = st + sizeof(Ipc_Data_Ev_Key_Down);
950 ipc->key = p - (long)st;
955 strcpy(p, ev->keyname);
956 ipc->keyname = p - (long)st;
961 strcpy(p, ev->string);
962 ipc->string = p - (long)st;
967 strcpy(p, ev->compose);
968 ipc->compose = p - (long)st;
971 ipc->timestamp = ev->timestamp;
972 ipc->mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
973 ipc->event_flags = ev->event_flags;
974 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_KEY_UP, 0, 0, 0, ipc, len);
979 _ecore_evas_extn_cb_hold(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
981 Ecore_Evas *ee = data;
982 Evas_Event_Hold *ev = event_info;
985 extn = ee->engine.buffer.data;
987 if (extn->ipc.server)
989 Ipc_Data_Ev_Hold ipc;
992 ipc.timestamp = ev->timestamp;
993 ipc.event_flags = ev->event_flags;
994 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_HOLD, 0, 0, 0, &ipc, sizeof(ipc));
999 _ecore_evas_extn_cb_focus_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1005 ee->prop.focused = 1;
1006 extn = ee->engine.buffer.data;
1008 if (!extn->ipc.server) return;
1009 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_FOCUS, 0, 0, 0, NULL, 0);
1013 _ecore_evas_extn_cb_focus_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1019 ee->prop.focused = 0;
1020 extn = ee->engine.buffer.data;
1022 if (!extn->ipc.server) return;
1023 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_UNFOCUS, 0, 0, 0, NULL, 0);
1027 _ecore_evas_extn_cb_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1034 extn = ee->engine.buffer.data;
1036 if (!extn->ipc.server) return;
1037 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_SHOW, 0, 0, 0, NULL, 0);
1041 _ecore_evas_extn_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1048 extn = ee->engine.buffer.data;
1050 if (!extn->ipc.server) return;
1051 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_HIDE, 0, 0, 0, NULL, 0);
1054 static const Ecore_Evas_Engine_Func _ecore_extn_plug_engine_func =
1056 _ecore_evas_extn_free,
1074 _ecore_evas_move_resize,
1104 NULL // screen_geometry_get
1108 _ipc_server_add(void *data, int type __UNUSED__, void *event)
1110 Ecore_Ipc_Event_Server_Add *e = event;
1111 Ecore_Evas *ee = data;
1114 if (ee != ecore_ipc_server_data_get(e->server))
1115 return ECORE_CALLBACK_PASS_ON;
1116 if (!eina_list_data_find(extn_ee_list, ee))
1117 return ECORE_CALLBACK_PASS_ON;
1118 extn = ee->engine.buffer.data;
1119 if (!extn) return ECORE_CALLBACK_PASS_ON;
1120 //FIXME: find a way to let app know server there
1121 return ECORE_CALLBACK_PASS_ON;
1125 _ipc_server_del(void *data, int type __UNUSED__, void *event)
1127 Ecore_Ipc_Event_Server_Del *e = event;
1128 Ecore_Evas *ee = data;
1131 extn = ee->engine.buffer.data;
1132 if (!extn) return ECORE_CALLBACK_PASS_ON;
1133 if (extn->ipc.server != e->server) return ECORE_CALLBACK_PASS_ON;
1134 evas_object_image_data_set(ee->engine.buffer.image, NULL);
1135 ee->engine.buffer.pixels = NULL;
1136 if (extn->file.shmfile)
1138 shmfile_close(extn->file.shmfile);
1139 extn->file.shmfile = NULL;
1143 eina_stringshare_del(extn->file.shm);
1144 extn->file.shm = NULL;
1146 extn->ipc.server = NULL;
1147 if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
1148 return ECORE_CALLBACK_PASS_ON;
1152 _ipc_server_data(void *data, int type __UNUSED__, void *event)
1154 Ecore_Ipc_Event_Server_Data *e = event;
1155 Ecore_Evas *ee = data;
1158 if (ee != ecore_ipc_server_data_get(e->server))
1159 return ECORE_CALLBACK_PASS_ON;
1160 if (!eina_list_data_find(extn_ee_list, ee))
1161 return ECORE_CALLBACK_PASS_ON;
1162 extn = ee->engine.buffer.data;
1163 if (!extn) return ECORE_CALLBACK_PASS_ON;
1164 if (e->major != MAJOR)
1165 return ECORE_CALLBACK_PASS_ON;
1169 // add rect to update list
1170 if (e->size >= (int)sizeof(Ipc_Data_Update))
1172 Ipc_Data_Update *ipc = malloc(sizeof(Ipc_Data_Update));
1175 memcpy(ipc, e->data, sizeof(Ipc_Data_Update));
1176 extn->file.updates = eina_list_append(extn->file.updates, ipc);
1180 case OP_UPDATE_DONE:
1181 // updates finished being sent - done now. frame ready
1183 Ipc_Data_Update *ipc;
1185 EINA_LIST_FREE(extn->file.updates, ipc)
1187 if (ee->engine.buffer.image)
1188 evas_object_image_data_update_add(ee->engine.buffer.image,
1195 if ((e->data) && (e->size > 0) &&
1196 (((unsigned char *)e->data)[e->size - 1] == 0))
1198 if (extn->file.lockfd) close(extn->file.lockfd);
1199 if (extn->file.lock) eina_stringshare_del(extn->file.lock);
1200 extn->file.lock = eina_stringshare_add(e->data);
1201 extn->file.lockfd = open(extn->file.lock, O_RDONLY);
1207 // e->response == alpha
1208 // e->data = shm ref string + nul byte
1209 if ((e->data) && ((unsigned char *)e->data)[e->size - 1] == 0)
1211 ee->engine.buffer.pixels = NULL;
1212 if (extn->file.shmfile)
1214 shmfile_close(extn->file.shmfile);
1215 extn->file.shmfile = NULL;
1219 eina_stringshare_del(extn->file.shm);
1220 extn->file.shm = NULL;
1222 if ((e->ref > 0) && (e->ref_to > 0))
1224 extn->file.w = e->ref;
1225 extn->file.h = e->ref_to;
1226 extn->file.shm = eina_stringshare_add(e->data);
1227 extn->file.shmfile = shmfile_open(extn->file.shm,
1231 if (extn->file.shmfile)
1233 ee->engine.buffer.pixels = extn->file.shmfile->addr;
1234 if (ee->engine.buffer.image)
1237 evas_object_image_alpha_set(ee->engine.buffer.image,
1240 evas_object_image_alpha_set(ee->engine.buffer.image,
1242 evas_object_image_size_set(ee->engine.buffer.image,
1245 evas_object_image_data_set(ee->engine.buffer.image,
1246 ee->engine.buffer.pixels);
1247 evas_object_image_data_update_add(ee->engine.buffer.image,
1251 _ecore_evas_resize(ee,
1256 evas_object_image_data_set(ee->engine.buffer.image, NULL);
1259 evas_object_image_data_set(ee->engine.buffer.image, NULL);
1262 evas_object_image_data_set(ee->engine.buffer.image, NULL);
1266 if ((e->data) && (e->size >= (int)sizeof(Ipc_Data_Resize)))
1268 Ipc_Data_Resize *ipc = e->data;
1269 _ecore_evas_resize(ee, ipc->w, ipc->h);
1275 return ECORE_CALLBACK_PASS_ON;
1279 _ecore_evas_extn_init(void)
1284 _ecore_evas_extn_shutdown(void)
1290 ecore_evas_extn_plug_new(Ecore_Evas *ee_target)
1298 if (!ee_target) return NULL;
1300 ee = calloc(1, sizeof(Ecore_Evas));
1301 if (!ee) return NULL;
1303 o = evas_object_image_filled_add(ee_target->evas);
1304 evas_object_image_content_hint_set(o, EVAS_IMAGE_CONTENT_HINT_DYNAMIC);
1305 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
1306 evas_object_image_alpha_set(o, 1);
1307 evas_object_image_size_set(o, 1, 1);
1308 evas_object_image_data_set(o, &blank);
1310 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
1312 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_extn_plug_engine_func;
1314 ee->driver = "extn_plug";
1326 ee->prop.focused = 0;
1327 ee->prop.borderless = 1;
1328 ee->prop.override = 1;
1329 ee->prop.maximized = 0;
1330 ee->prop.fullscreen = 0;
1331 ee->prop.withdrawn = 0;
1332 ee->prop.sticky = 0;
1334 ee->engine.buffer.image = o;
1335 evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas", ee);
1336 evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas_Parent", ee_target);
1337 evas_object_event_callback_add(ee->engine.buffer.image,
1338 EVAS_CALLBACK_MOUSE_IN,
1339 _ecore_evas_extn_cb_mouse_in, ee);
1340 evas_object_event_callback_add(ee->engine.buffer.image,
1341 EVAS_CALLBACK_MOUSE_OUT,
1342 _ecore_evas_extn_cb_mouse_out, ee);
1343 evas_object_event_callback_add(ee->engine.buffer.image,
1344 EVAS_CALLBACK_MOUSE_DOWN,
1345 _ecore_evas_extn_cb_mouse_down, ee);
1346 evas_object_event_callback_add(ee->engine.buffer.image,
1347 EVAS_CALLBACK_MOUSE_UP,
1348 _ecore_evas_extn_cb_mouse_up, ee);
1349 evas_object_event_callback_add(ee->engine.buffer.image,
1350 EVAS_CALLBACK_MOUSE_MOVE,
1351 _ecore_evas_extn_cb_mouse_move, ee);
1352 evas_object_event_callback_add(ee->engine.buffer.image,
1353 EVAS_CALLBACK_MOUSE_WHEEL,
1354 _ecore_evas_extn_cb_mouse_wheel, ee);
1355 evas_object_event_callback_add(ee->engine.buffer.image,
1356 EVAS_CALLBACK_MULTI_DOWN,
1357 _ecore_evas_extn_cb_multi_down, ee);
1358 evas_object_event_callback_add(ee->engine.buffer.image,
1359 EVAS_CALLBACK_MULTI_UP,
1360 _ecore_evas_extn_cb_multi_up, ee);
1361 evas_object_event_callback_add(ee->engine.buffer.image,
1362 EVAS_CALLBACK_MULTI_MOVE,
1363 _ecore_evas_extn_cb_multi_move, ee);
1364 evas_object_event_callback_add(ee->engine.buffer.image,
1366 _ecore_evas_extn_cb_free, ee);
1367 evas_object_event_callback_add(ee->engine.buffer.image,
1368 EVAS_CALLBACK_KEY_DOWN,
1369 _ecore_evas_extn_cb_key_down, ee);
1370 evas_object_event_callback_add(ee->engine.buffer.image,
1371 EVAS_CALLBACK_KEY_UP,
1372 _ecore_evas_extn_cb_key_up, ee);
1373 evas_object_event_callback_add(ee->engine.buffer.image,
1375 _ecore_evas_extn_cb_hold, ee);
1376 evas_object_event_callback_add(ee->engine.buffer.image,
1377 EVAS_CALLBACK_FOCUS_IN,
1378 _ecore_evas_extn_cb_focus_in, ee);
1379 evas_object_event_callback_add(ee->engine.buffer.image,
1380 EVAS_CALLBACK_FOCUS_OUT,
1381 _ecore_evas_extn_cb_focus_out, ee);
1382 evas_object_event_callback_add(ee->engine.buffer.image,
1384 _ecore_evas_extn_cb_show, ee);
1385 evas_object_event_callback_add(ee->engine.buffer.image,
1387 _ecore_evas_extn_cb_hide, ee);
1389 evas_object_event_callback_add(ee->engine.buffer.image,
1391 _ecore_evas_extn_plug_image_obj_del, ee);
1394 extn_ee_list = eina_list_append(extn_ee_list, ee);
1395 ee_target->sub_ecore_evas = eina_list_append(ee_target->sub_ecore_evas, ee);
1397 evas_event_callback_add(ee_target->evas, EVAS_CALLBACK_RENDER_PRE,
1398 _ecore_evas_extn_plug_targer_render_pre, ee);
1399 evas_event_callback_add(ee_target->evas, EVAS_CALLBACK_RENDER_POST,
1400 _ecore_evas_extn_plug_targer_render_post, ee);
1408 ecore_evas_extn_plug_connect(Evas_Object *obj, const char *svcname, int svcnum, Eina_Bool svcsys)
1412 Ecore_Evas *ee = NULL;
1414 if (!obj) return EINA_FALSE;
1416 ee = evas_object_data_get(obj, "Ecore_Evas");
1417 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS)) return EINA_FALSE;
1419 extn = calloc(1, sizeof(Extn));
1420 if (!extn) return EINA_FALSE;
1422 Ecore_Ipc_Type ipctype = ECORE_IPC_LOCAL_USER;
1425 extn->svc.name = eina_stringshare_add(svcname);
1426 extn->svc.num = svcnum;
1427 extn->svc.sys = svcsys;
1429 if (extn->svc.sys) ipctype = ECORE_IPC_LOCAL_SYSTEM;
1430 extn->ipc.server = ecore_ipc_server_connect(ipctype, (char *)extn->svc.name,
1432 if (!extn->ipc.server)
1434 eina_stringshare_del(extn->svc.name);
1436 ecore_ipc_shutdown();
1439 ee->engine.buffer.data = extn;
1440 extn->ipc.handlers = eina_list_append
1441 (extn->ipc.handlers,
1442 ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD,
1443 _ipc_server_add, ee));
1444 extn->ipc.handlers = eina_list_append
1445 (extn->ipc.handlers,
1446 ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL,
1447 _ipc_server_del, ee));
1448 extn->ipc.handlers = eina_list_append
1449 (extn->ipc.handlers,
1450 ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DATA,
1451 _ipc_server_data, ee));
1459 ecore_evas_extn_plug_object_data_lock(Evas_Object *obj)
1464 ee = ecore_evas_object_ecore_evas_get(obj);
1466 _ecore_evas_socket_lock(ee);
1471 ecore_evas_extn_plug_object_data_unlock(Evas_Object *obj)
1476 ee = ecore_evas_object_ecore_evas_get(obj);
1478 _ecore_evas_socket_unlock(ee);
1484 _ecore_evas_socket_resize(Ecore_Evas *ee, int w, int h)
1487 Evas_Engine_Info_Buffer *einfo;
1494 if ((w == ee->w) && (h == ee->h)) return;
1497 evas_output_size_set(ee->evas, ee->w, ee->h);
1498 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1499 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1500 extn = ee->engine.buffer.data;
1503 if (extn->file.shmfile)
1504 shmfile_free(extn->file.shmfile);
1505 ee->engine.buffer.pixels = NULL;
1506 extn->file.shmfile = shmfile_new(extn->svc.name, extn->svc.num,
1507 ee->w * ee->h * 4, extn->svc.sys);
1508 if (extn->file.shmfile)
1509 ee->engine.buffer.pixels = extn->file.shmfile->addr;
1512 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
1516 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
1518 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
1519 einfo->info.dest_buffer = ee->engine.buffer.pixels;
1520 einfo->info.dest_buffer_row_bytes = stride;
1521 einfo->info.use_color_key = 0;
1522 einfo->info.alpha_threshold = 0;
1523 einfo->info.func.new_update_region = NULL;
1524 einfo->info.func.free_update_region = NULL;
1525 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1527 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1531 if (extn->ipc.clients && extn->file.shmfile)
1533 Ipc_Data_Resize ipc;
1535 Ecore_Ipc_Client *client;
1537 EINA_LIST_FOREACH(extn->ipc.clients, l, client)
1538 ecore_ipc_client_send(client, MAJOR, OP_SHM_REF,
1539 ee->w, ee->h, ee->alpha,
1540 extn->file.shmfile->file,
1541 strlen(extn->file.shmfile->file) + 1);
1544 EINA_LIST_FOREACH(extn->ipc.clients, l, client)
1545 ecore_ipc_client_send(client, MAJOR, OP_RESIZE,
1546 0, 0, 0, &ipc, sizeof(ipc));
1549 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1553 _ecore_evas_socket_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int w, int h)
1555 _ecore_evas_socket_resize(ee, w, h);
1559 _ecore_evas_extn_socket_render(Ecore_Evas *ee)
1561 Eina_List *updates = NULL, *l, *ll;
1566 Ecore_Ipc_Client *client;
1568 extn = ee->engine.buffer.data;
1569 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
1571 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
1572 if (ee2->engine.func->fn_render)
1573 rend |= ee2->engine.func->fn_render(ee2);
1574 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
1576 if (ee->engine.buffer.pixels)
1578 _ecore_evas_socket_lock(ee);
1579 updates = evas_render_updates(ee->evas);
1580 _ecore_evas_socket_unlock(ee);
1582 EINA_LIST_FOREACH(updates, l, r)
1584 Ipc_Data_Update ipc;
1591 EINA_LIST_FOREACH(extn->ipc.clients, ll, client)
1592 ecore_ipc_client_send(client, MAJOR, OP_UPDATE, 0, 0, 0, &ipc, sizeof(ipc));
1596 evas_render_updates_free(updates);
1597 _ecore_evas_idle_timeout_update(ee);
1598 EINA_LIST_FOREACH(extn->ipc.clients, ll, client)
1599 ecore_ipc_client_send(client, MAJOR, OP_UPDATE_DONE, 0, 0, 0, NULL, 0);
1602 return updates ? 1 : rend;
1606 _ipc_client_add(void *data, int type __UNUSED__, void *event)
1608 Ecore_Ipc_Event_Client_Add *e = event;
1609 Ecore_Evas *ee = data;
1612 if (ee != ecore_ipc_server_data_get(ecore_ipc_client_server_get(e->client)))
1613 return ECORE_CALLBACK_PASS_ON;
1614 if (!eina_list_data_find(extn_ee_list, ee))
1615 return ECORE_CALLBACK_PASS_ON;
1616 extn = ee->engine.buffer.data;
1617 if (!extn) return ECORE_CALLBACK_PASS_ON;
1619 extn->ipc.clients = eina_list_append(extn->ipc.clients, e->client);
1620 ecore_ipc_client_send(e->client, MAJOR, OP_LOCK_FILE, 0, 0, 0, extn->file.lock, strlen(extn->file.lock) + 1);
1622 if (extn->file.shmfile)
1624 Ipc_Data_Resize ipc;
1626 ecore_ipc_client_send(e->client, MAJOR, OP_SHM_REF,
1627 ee->w, ee->h, ee->alpha,
1628 extn->file.shmfile->file,
1629 strlen(extn->file.shmfile->file) + 1);
1633 ecore_ipc_client_send(e->client, MAJOR, OP_RESIZE,
1634 0, 0, 0, &ipc, sizeof(ipc));
1636 _ecore_evas_extn_event(ee, ECORE_EVAS_EXTN_CLIENT_ADD);
1637 return ECORE_CALLBACK_PASS_ON;
1641 _ipc_client_del(void *data, int type __UNUSED__, void *event)
1643 Ecore_Ipc_Event_Client_Del *e = event;
1644 Ecore_Evas *ee = data;
1646 extn = ee->engine.buffer.data;
1647 if (!extn) return ECORE_CALLBACK_PASS_ON;
1648 if (!eina_list_data_find(extn->ipc.clients, e->client)) return ECORE_CALLBACK_PASS_ON;
1650 extn->ipc.clients = eina_list_remove(extn->ipc.clients, e->client);
1652 _ecore_evas_extn_event(ee, ECORE_EVAS_EXTN_CLIENT_DEL);
1653 return ECORE_CALLBACK_PASS_ON;
1657 _ipc_client_data(void *data, int type __UNUSED__, void *event)
1659 Ecore_Ipc_Event_Client_Data *e = event;
1660 Ecore_Evas *ee = data;
1663 if (ee != ecore_ipc_server_data_get(ecore_ipc_client_server_get(e->client)))
1664 return ECORE_CALLBACK_PASS_ON;
1665 if (!eina_list_data_find(extn_ee_list, ee))
1666 return ECORE_CALLBACK_PASS_ON;
1667 extn = ee->engine.buffer.data;
1668 if (!extn) return ECORE_CALLBACK_PASS_ON;
1669 if (e->major != MAJOR)
1670 return ECORE_CALLBACK_PASS_ON;
1674 if ((e->data) && (e->size >= (int)sizeof(Ipc_Data_Resize)))
1677 Ipc_Data_Resize *ipc = e->data;
1678 /* create callbacke data size changed */
1679 _ecore_evas_socket_resize(ee, ipc->w, ipc->h);
1686 if (ee->func.fn_show) ee->func.fn_show(ee);
1693 if (ee->func.fn_hide) ee->func.fn_hide(ee);
1697 if (!ee->prop.focused)
1699 ee->prop.focused = 1;
1700 evas_focus_in(ee->evas);
1701 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
1705 if (ee->prop.focused)
1707 ee->prop.focused = 0;
1708 evas_focus_out(ee->evas);
1709 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
1712 case OP_EV_MOUSE_IN:
1713 if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_In))
1715 Ipc_Data_Ev_Mouse_In *ipc = e->data;
1716 Evas_Event_Flags flags;
1718 flags = evas_event_default_flags_get(ee->evas);
1719 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1720 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1721 evas_event_feed_mouse_in(ee->evas, ipc->timestamp, NULL);
1722 evas_event_default_flags_set(ee->evas, flags);
1725 case OP_EV_MOUSE_OUT:
1726 if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Out))
1728 Ipc_Data_Ev_Mouse_Out *ipc = e->data;
1729 Evas_Event_Flags flags;
1731 flags = evas_event_default_flags_get(ee->evas);
1732 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1733 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1734 evas_event_feed_mouse_out(ee->evas, ipc->timestamp, NULL);
1735 evas_event_default_flags_set(ee->evas, flags);
1738 case OP_EV_MOUSE_UP:
1739 if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Up))
1741 Ipc_Data_Ev_Mouse_Up *ipc = e->data;
1742 Evas_Event_Flags flags;
1744 flags = evas_event_default_flags_get(ee->evas);
1745 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1746 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1747 evas_event_feed_mouse_up(ee->evas, ipc->b, ipc->flags, ipc->timestamp, NULL);
1748 evas_event_default_flags_set(ee->evas, flags);
1751 case OP_EV_MOUSE_DOWN:
1752 if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Down))
1754 Ipc_Data_Ev_Mouse_Up *ipc = e->data;
1755 Evas_Event_Flags flags;
1757 flags = evas_event_default_flags_get(ee->evas);
1758 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1759 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1760 evas_event_feed_mouse_down(ee->evas, ipc->b, ipc->flags, ipc->timestamp, NULL);
1761 evas_event_default_flags_set(ee->evas, flags);
1764 case OP_EV_MOUSE_MOVE:
1765 if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Move))
1767 Ipc_Data_Ev_Mouse_Move *ipc = e->data;
1768 Evas_Event_Flags flags;
1770 flags = evas_event_default_flags_get(ee->evas);
1771 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1772 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1773 evas_event_feed_mouse_move(ee->evas, ipc->x, ipc->y, ipc->timestamp, NULL);
1774 evas_event_default_flags_set(ee->evas, flags);
1777 case OP_EV_MOUSE_WHEEL:
1778 if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Wheel))
1780 Ipc_Data_Ev_Mouse_Wheel *ipc = e->data;
1781 Evas_Event_Flags flags;
1783 flags = evas_event_default_flags_get(ee->evas);
1784 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1785 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1786 evas_event_feed_mouse_wheel(ee->evas, ipc->direction, ipc->z, ipc->timestamp, NULL);
1787 evas_event_default_flags_set(ee->evas, flags);
1790 case OP_EV_MULTI_UP:
1791 if (e->size >= (int)sizeof(Ipc_Data_Ev_Multi_Up))
1793 Ipc_Data_Ev_Multi_Up *ipc = e->data;
1794 Evas_Event_Flags flags;
1796 flags = evas_event_default_flags_get(ee->evas);
1797 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1798 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1799 evas_event_feed_multi_up(ee->evas, ipc->d, ipc->x, ipc->y, ipc->rad, ipc->radx, ipc->rady, ipc->pres, ipc->ang, ipc->fx, ipc->fy, ipc->flags, ipc->timestamp, NULL);
1800 evas_event_default_flags_set(ee->evas, flags);
1803 case OP_EV_MULTI_DOWN:
1804 if (e->size >= (int)sizeof(Ipc_Data_Ev_Multi_Down))
1806 Ipc_Data_Ev_Multi_Down *ipc = e->data;
1807 Evas_Event_Flags flags;
1809 flags = evas_event_default_flags_get(ee->evas);
1810 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1811 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1812 evas_event_feed_multi_down(ee->evas, ipc->d, ipc->x, ipc->y, ipc->rad, ipc->radx, ipc->rady, ipc->pres, ipc->ang, ipc->fx, ipc->fy, ipc->flags, ipc->timestamp, NULL);
1813 evas_event_default_flags_set(ee->evas, flags);
1816 case OP_EV_MULTI_MOVE:
1817 if (e->size >= (int)sizeof(Ipc_Data_Ev_Multi_Move))
1819 Ipc_Data_Ev_Multi_Move *ipc = e->data;
1820 Evas_Event_Flags flags;
1822 flags = evas_event_default_flags_get(ee->evas);
1823 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1824 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1825 evas_event_feed_multi_move(ee->evas, ipc->d, ipc->x, ipc->y, ipc->rad, ipc->radx, ipc->rady, ipc->pres, ipc->ang, ipc->fx, ipc->fy, ipc->timestamp, NULL);
1826 evas_event_default_flags_set(ee->evas, flags);
1830 #define STRGET(val) \
1832 if ((ipc->val) && (ipc->val < (char *)(e->size - 1))) \
1833 ipc->val = ((char *)ipc) + (long)ipc->val; \
1839 if (e->size >= (int)sizeof(Ipc_Data_Ev_Key_Up))
1841 if ((e->data) && (e->size > 0) &&
1842 (((unsigned char *)e->data)[e->size - 1] == 0))
1844 Ipc_Data_Ev_Key_Up *ipc = e->data;
1845 Evas_Event_Flags flags;
1851 flags = evas_event_default_flags_get(ee->evas);
1852 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1853 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1854 evas_event_feed_key_up(ee->evas, ipc->keyname, ipc->key, ipc->string, ipc->compose, ipc->timestamp, NULL);
1855 evas_event_default_flags_set(ee->evas, flags);
1859 case OP_EV_KEY_DOWN:
1860 if (e->size >= (int)sizeof(Ipc_Data_Ev_Key_Down))
1862 if ((e->data) && (e->size > 0) &&
1863 (((unsigned char *)e->data)[e->size - 1] == 0))
1865 Ipc_Data_Ev_Key_Down *ipc = e->data;
1866 Evas_Event_Flags flags;
1872 flags = evas_event_default_flags_get(ee->evas);
1873 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1874 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1875 evas_event_feed_key_down(ee->evas, ipc->keyname, ipc->key, ipc->string, ipc->compose, ipc->timestamp, NULL);
1876 evas_event_default_flags_set(ee->evas, flags);
1881 if (e->size >= (int)sizeof(Ipc_Data_Ev_Hold))
1883 Ipc_Data_Ev_Hold *ipc = e->data;
1884 Evas_Event_Flags flags;
1886 flags = evas_event_default_flags_get(ee->evas);
1887 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1888 evas_event_feed_hold(ee->evas, ipc->hold, ipc->timestamp, NULL);
1889 evas_event_default_flags_set(ee->evas, flags);
1895 return ECORE_CALLBACK_PASS_ON;
1899 _ecore_evas_extn_socket_alpha_set(Ecore_Evas *ee, int alpha)
1903 Ecore_Ipc_Client *client;
1905 if (((ee->alpha) && (alpha)) || ((!ee->alpha) && (!alpha))) return;
1908 extn = ee->engine.buffer.data;
1911 Evas_Engine_Info_Buffer *einfo;
1913 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
1917 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
1919 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
1920 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
1921 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1923 EINA_LIST_FOREACH(extn->ipc.clients, l, client)
1924 ecore_ipc_client_send(client, MAJOR, OP_SHM_REF,
1925 ee->w, ee->h, ee->alpha,
1926 extn->file.shmfile->file,
1927 strlen(extn->file.shmfile->file) + 1);
1931 static const Ecore_Evas_Engine_Func _ecore_extn_socket_engine_func =
1933 _ecore_evas_extn_free,
1950 _ecore_evas_socket_resize,
1951 _ecore_evas_socket_move_resize,
1977 _ecore_evas_extn_socket_alpha_set,
1980 _ecore_evas_extn_socket_render, // render
1981 NULL // screen_geometry_get
1987 ecore_evas_extn_socket_new(int w, int h)
1991 Evas_Engine_Info_Buffer *einfo;
1995 rmethod = evas_render_method_lookup("buffer");
1996 if (!rmethod) return NULL;
1997 ee = calloc(1, sizeof(Ecore_Evas));
1998 if (!ee) return NULL;
2000 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
2002 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_extn_socket_engine_func;
2004 ee->driver = "extn_socket";
2016 ee->prop.focused = 0;
2017 ee->prop.borderless = 1;
2018 ee->prop.override = 1;
2019 ee->prop.maximized = 0;
2020 ee->prop.fullscreen = 0;
2021 ee->prop.withdrawn = 0;
2022 ee->prop.sticky = 0;
2024 /* init evas here */
2025 ee->evas = evas_new();
2026 evas_data_attach_set(ee->evas, ee);
2027 evas_output_method_set(ee->evas, rmethod);
2028 evas_output_size_set(ee->evas, w, h);
2029 evas_output_viewport_set(ee->evas, 0, 0, w, h);
2031 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
2035 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
2037 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
2038 einfo->info.dest_buffer = NULL;
2039 einfo->info.dest_buffer_row_bytes = 0;
2040 einfo->info.use_color_key = 0;
2041 einfo->info.alpha_threshold = 0;
2042 einfo->info.func.new_update_region = NULL;
2043 einfo->info.func.free_update_region = NULL;
2044 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2046 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2047 ecore_evas_free(ee);
2053 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
2054 ecore_evas_free(ee);
2057 evas_key_modifier_add(ee->evas, "Shift");
2058 evas_key_modifier_add(ee->evas, "Control");
2059 evas_key_modifier_add(ee->evas, "Alt");
2060 evas_key_modifier_add(ee->evas, "Meta");
2061 evas_key_modifier_add(ee->evas, "Hyper");
2062 evas_key_modifier_add(ee->evas, "Super");
2063 evas_key_lock_add(ee->evas, "Caps_Lock");
2064 evas_key_lock_add(ee->evas, "Num_Lock");
2065 evas_key_lock_add(ee->evas, "Scroll_Lock");
2067 extn_ee_list = eina_list_append(extn_ee_list, ee);
2069 _ecore_evas_register(ee);
2078 ecore_evas_extn_socket_listen(Ecore_Evas *ee, const char *svcname, int svcnum, Eina_Bool svcsys)
2083 extn = calloc(1, sizeof(Extn));
2090 Ecore_Ipc_Type ipctype = ECORE_IPC_LOCAL_USER;
2094 extn->svc.name = eina_stringshare_add(svcname);
2095 extn->svc.num = svcnum;
2096 extn->svc.sys = svcsys;
2098 snprintf(buf, sizeof(buf), "/tmp/ee-lock-XXXXXX");
2099 extn->file.lockfd = mkstemp(buf);
2100 if (extn->file.lockfd >= 0)
2101 extn->file.lock = eina_stringshare_add(buf);
2102 if ((extn->file.lockfd < 0) || (!extn->file.lock))
2104 if (extn->file.lockfd)
2106 close(extn->file.lockfd);
2109 eina_stringshare_del(extn->svc.name);
2110 if (extn->file.lock) eina_stringshare_del(extn->file.lock);
2112 ecore_ipc_shutdown();
2116 if (extn->svc.sys) ipctype = ECORE_IPC_LOCAL_SYSTEM;
2117 extn->ipc.am_server = EINA_TRUE;
2118 extn->ipc.server = ecore_ipc_server_add(ipctype,
2119 (char *)extn->svc.name,
2121 if (!extn->ipc.server)
2123 if (extn->file.lockfd)
2125 close(extn->file.lockfd);
2126 if (extn->file.lock) unlink(extn->file.lock);
2128 eina_stringshare_del(extn->svc.name);
2129 eina_stringshare_del(extn->file.lock);
2131 ecore_ipc_shutdown();
2134 ee->engine.buffer.data = extn;
2135 extn->ipc.handlers = eina_list_append
2136 (extn->ipc.handlers,
2137 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD,
2138 _ipc_client_add, ee));
2139 extn->ipc.handlers = eina_list_append
2140 (extn->ipc.handlers,
2141 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL,
2142 _ipc_client_del, ee));
2143 extn->ipc.handlers = eina_list_append
2144 (extn->ipc.handlers,
2145 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA,
2146 _ipc_client_data, ee));