17 # define alloca __builtin_alloca
19 # define alloca __alloca
20 # elif defined _MSC_VER
22 # define alloca _alloca
23 # elif !defined HAVE_ALLOCA
27 void *alloca (size_t);
33 #include <sys/types.h>
37 #ifdef HAVE_SYS_MMAN_H
38 # include <sys/mman.h>
47 #include "ecore_private.h"
48 #include <Ecore_Input.h>
50 #ifdef BUILD_ECORE_EVAS_EXTN
52 #include <Ecore_Ipc.h>
56 #include "ecore_evas_private.h"
57 #include "Ecore_Evas.h"
60 #ifdef BUILD_ECORE_EVAS_EXTN
63 typedef struct _Shmfile Shmfile;
73 static int blank = 0x00000000;
76 shmfile_new(const char *base, int id, int size, Eina_Bool sys)
81 sf = calloc(1, sizeof(Shmfile));
86 snprintf(file, sizeof(file), "/%s-%i-%i.%i.%i",
87 base, id, (int)time(NULL), (int)getpid(), (int)rand());
88 mode = S_IRUSR | S_IWUSR;
89 if (sys) mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
90 sf->fd = shm_open(file, O_RDWR | O_CREAT | O_EXCL, mode);
94 sf->file = eina_stringshare_add(file);
99 eina_stringshare_del(sf->file);
104 if (ftruncate(sf->fd, size) < 0)
107 shm_unlink(sf->file);
108 eina_stringshare_del(sf->file);
112 sf->addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, sf->fd, 0);
113 if (sf->addr == MAP_FAILED)
116 shm_unlink(sf->file);
117 eina_stringshare_del(sf->file);
125 shmfile_free(Shmfile *sf)
127 munmap(sf->addr, sf->size);
129 shm_unlink(sf->file);
130 eina_stringshare_del(sf->file);
135 shmfile_open(const char *ref, int size, Eina_Bool sys)
140 sf = calloc(1, sizeof(Shmfile));
141 mode = S_IRUSR | S_IWUSR;
142 if (sys) mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
143 sf->fd = shm_open(ref, O_RDWR, mode);
149 sf->file = eina_stringshare_add(ref);
153 eina_stringshare_del(sf->file);
158 sf->addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, sf->fd, 0);
159 if (sf->addr == MAP_FAILED)
162 eina_stringshare_del(sf->file);
170 shmfile_close(Shmfile *sf)
172 munmap(sf->addr, sf->size);
174 eina_stringshare_del(sf->file);
178 // procotol version - change this as needed
208 MOD_SHIFT = (1 << 0),
212 MOD_HYPER = (1 << 4),
213 MOD_SUPER = (1 << 5),
216 MOD_SCROLL = (1 << 8),
219 typedef struct _Ipc_Data_Resize Ipc_Data_Resize;
220 typedef struct _Ipc_Data_Update Ipc_Data_Update;
221 typedef struct _Ipc_Data_Ev_Mouse_In Ipc_Data_Ev_Mouse_In;
222 typedef struct _Ipc_Data_Ev_Mouse_Out Ipc_Data_Ev_Mouse_Out;
223 typedef struct _Ipc_Data_Ev_Mouse_Up Ipc_Data_Ev_Mouse_Up;
224 typedef struct _Ipc_Data_Ev_Mouse_Down Ipc_Data_Ev_Mouse_Down;
225 typedef struct _Ipc_Data_Ev_Mouse_Move Ipc_Data_Ev_Mouse_Move;
226 typedef struct _Ipc_Data_Ev_Mouse_Wheel Ipc_Data_Ev_Mouse_Wheel;
227 typedef struct _Ipc_Data_Ev_Hold Ipc_Data_Ev_Hold;
228 typedef struct _Ipc_Data_Ev_Multi_Up Ipc_Data_Ev_Multi_Up;
229 typedef struct _Ipc_Data_Ev_Multi_Down Ipc_Data_Ev_Multi_Down;
230 typedef struct _Ipc_Data_Ev_Multi_Move Ipc_Data_Ev_Multi_Move;
231 typedef struct _Ipc_Data_Ev_Key_Up Ipc_Data_Ev_Key_Up;
232 typedef struct _Ipc_Data_Ev_Key_Down Ipc_Data_Ev_Key_Down;
234 struct _Ipc_Data_Resize
239 struct _Ipc_Data_Update
244 struct _Ipc_Data_Ev_Mouse_In
246 unsigned int timestamp;
248 Evas_Event_Flags event_flags;
251 struct _Ipc_Data_Ev_Mouse_Out
253 unsigned int timestamp;
255 Evas_Event_Flags event_flags;
258 struct _Ipc_Data_Ev_Mouse_Up
261 Evas_Button_Flags flags;
263 unsigned int timestamp;
264 Evas_Event_Flags event_flags;
267 struct _Ipc_Data_Ev_Mouse_Down
270 Evas_Button_Flags flags;
272 unsigned int timestamp;
273 Evas_Event_Flags event_flags;
276 struct _Ipc_Data_Ev_Mouse_Move
279 Evas_Button_Flags flags;
281 unsigned int timestamp;
282 Evas_Event_Flags event_flags;
285 struct _Ipc_Data_Ev_Mouse_Wheel
288 Evas_Button_Flags flags;
290 unsigned int timestamp;
291 Evas_Event_Flags event_flags;
294 struct _Ipc_Data_Ev_Hold
297 unsigned int timestamp;
298 Evas_Event_Flags event_flags;
301 struct _Ipc_Data_Ev_Multi_Up
303 Evas_Button_Flags flags;
305 double rad, radx, rady, pres, ang, fx, fy;
307 unsigned int timestamp;
308 Evas_Event_Flags event_flags;
311 struct _Ipc_Data_Ev_Multi_Down
313 Evas_Button_Flags flags;
315 double rad, radx, rady, pres, ang, fx, fy;
317 unsigned int timestamp;
318 Evas_Event_Flags event_flags;
321 struct _Ipc_Data_Ev_Multi_Move
324 double rad, radx, rady, pres, ang, fx, fy;
326 unsigned int timestamp;
327 Evas_Event_Flags event_flags;
330 struct _Ipc_Data_Ev_Key_Up
332 const char *keyname, *key, *string, *compose;
334 unsigned int timestamp;
335 Evas_Event_Flags event_flags;
338 struct _Ipc_Data_Ev_Key_Down
340 const char *keyname, *key, *string, *compose;
342 unsigned int timestamp;
343 Evas_Event_Flags event_flags;
346 typedef struct _Extn Extn;
351 Ecore_Ipc_Server *server;
354 Eina_Bool am_server : 1;
368 Eina_Bool have_lock : 1;
369 Eina_Bool have_real_lock : 1;
373 static Eina_List *extn_ee_list = NULL;
375 EAPI int ECORE_EVAS_EXTN_CLIENT_ADD = 0;
376 EAPI int ECORE_EVAS_EXTN_CLIENT_DEL = 0;
379 _ecore_evas_extn_init(void)
381 if (ECORE_EVAS_EXTN_CLIENT_ADD) return;
382 ECORE_EVAS_EXTN_CLIENT_ADD = ecore_event_type_new();
383 ECORE_EVAS_EXTN_CLIENT_DEL = ecore_event_type_new();
387 _ecore_evas_extn_shutdown(void)
392 _ecore_evas_extn_event_free(void *data, void *ev __UNUSED__)
394 Ecore_Evas *ee = data;
395 if (ee->engine.buffer.image)
396 evas_object_unref(ee->engine.buffer.image);
397 _ecore_evas_unref(ee);
401 _ecore_evas_extn_event(Ecore_Evas *ee, int event)
404 if (ee->engine.buffer.image)
405 evas_object_ref(ee->engine.buffer.image);
406 ecore_event_add(event, ee->engine.buffer.image,
407 _ecore_evas_extn_event_free, ee);
411 _ecore_evas_lock_other_have(Ecore_Evas *ee)
417 extn = ee->engine.buffer.data;
418 if (!extn) return EINA_FALSE;
419 // brute force - i know. i expect extn_ee_list to be fairly short. could
420 // be improved with a hash of lockfiles
421 EINA_LIST_FOREACH(extn_ee_list, l, ee2)
423 if (ee == ee2) continue;
424 extn2 = ee2->engine.buffer.data;
425 if (!extn2) continue;
426 if ((extn->file.lock) && (extn2->file.lock) &&
427 (!strcmp(extn->file.lock, extn2->file.lock)) &&
428 (extn2->file.have_real_lock))
435 _ecore_evas_socket_lock(Ecore_Evas *ee)
439 extn = ee->engine.buffer.data;
441 if (extn->file.lockfd < 0) return;
442 if (extn->file.have_lock) return;
443 extn->file.have_lock = EINA_TRUE;
444 if (_ecore_evas_lock_other_have(ee)) return;
445 lockf(extn->file.lockfd, F_LOCK, 0);
446 extn->file.have_real_lock = EINA_TRUE;
450 _ecore_evas_socket_unlock(Ecore_Evas *ee)
454 extn = ee->engine.buffer.data;
456 if (extn->file.lockfd < 0) return;
457 if (!extn->file.have_lock) return;
458 extn->file.have_lock = EINA_FALSE;
459 if (!extn->file.have_real_lock) return;
460 lockf(extn->file.lockfd, F_ULOCK, 0);
464 _ecore_evas_extn_plug_targer_render_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
466 Ecore_Evas *ee = data;
467 if (ee) _ecore_evas_socket_lock(ee);
471 _ecore_evas_extn_plug_targer_render_post(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
473 Ecore_Evas *ee = data;
474 if (ee) _ecore_evas_socket_unlock(ee);
478 _ecore_evas_extn_plug_image_obj_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
480 Ecore_Evas *ee = data;
485 _ecore_evas_extn_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
487 Evas_Coord xx, yy, ww, hh, fx, fy, fw, fh;
489 evas_object_geometry_get(ee->engine.buffer.image, &xx, &yy, &ww, &hh);
490 evas_object_image_fill_get(ee->engine.buffer.image, &fx, &fy, &fw, &fh);
495 if (evas_object_map_get(ee->engine.buffer.image) &&
496 evas_object_map_enable_get(ee->engine.buffer.image))
499 fw = ee->w; fh = ee->h;
500 ww = ee->w; hh = ee->h;
503 if ((fx == 0) && (fy == 0) && (fw == ww) && (fh == hh))
505 *x = (ee->w * (*x - xx)) / fw;
506 *y = (ee->h * (*y - yy)) / fh;
511 while (xx < 0) xx += fw;
512 while (xx > fw) xx -= fw;
513 *x = (ee->w * xx) / fw;
516 while (yy < 0) yy += fh;
517 while (yy > fh) yy -= fh;
518 *y = (ee->h * yy) / fh;
523 _ecore_evas_extn_free(Ecore_Evas *ee)
526 Ecore_Ipc_Client *client;
528 extn = ee->engine.buffer.data;
531 Ecore_Event_Handler *hdl;
532 Ipc_Data_Update *ipc;
534 if (extn->file.have_lock)
535 _ecore_evas_socket_unlock(ee);
536 if (extn->file.lockfd)
538 close(extn->file.lockfd);
539 if (extn->ipc.am_server)
541 if (extn->file.lock) unlink(extn->file.lock);
544 if (extn->svc.name) eina_stringshare_del(extn->svc.name);
545 if (extn->ipc.clients)
547 EINA_LIST_FREE(extn->ipc.clients, client)
548 ecore_ipc_client_del(client);
550 if (extn->ipc.server) ecore_ipc_server_del(extn->ipc.server);
551 if (extn->file.lock) eina_stringshare_del(extn->file.lock);
552 if (extn->file.shm) eina_stringshare_del(extn->file.shm);
553 if (extn->file.shmfile)
555 if (extn->ipc.am_server)
556 shmfile_free(extn->file.shmfile);
558 shmfile_close(extn->file.shmfile);
561 EINA_LIST_FREE(extn->file.updates, ipc)
564 EINA_LIST_FREE(extn->ipc.handlers, hdl)
565 ecore_event_handler_del(hdl);
567 ecore_ipc_shutdown();
568 ee->engine.buffer.data = NULL;
570 if (ee->engine.buffer.image)
574 evas_object_event_callback_del_full(ee->engine.buffer.image,
576 _ecore_evas_extn_plug_image_obj_del,
578 evas_event_callback_del_full(evas_object_evas_get(ee->engine.buffer.image),
579 EVAS_CALLBACK_RENDER_PRE,
580 _ecore_evas_extn_plug_targer_render_pre,
582 evas_event_callback_del_full(evas_object_evas_get(ee->engine.buffer.image),
583 EVAS_CALLBACK_RENDER_POST,
584 _ecore_evas_extn_plug_targer_render_post,
586 evas_object_del(ee->engine.buffer.image);
587 ee2 = evas_object_data_get(ee->engine.buffer.image, "Ecore_Evas_Parent");
590 ee2->sub_ecore_evas = eina_list_remove(ee2->sub_ecore_evas, ee);
593 extn_ee_list = eina_list_remove(extn_ee_list, ee);
597 _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
603 if ((w == ee->w) && (h == ee->h)) return;
608 * No need for it if not used later.
611 extn = ee->engine.buffer.data;
613 if (ee->engine.buffer.image)
614 evas_object_image_size_set(ee->engine.buffer.image, ee->w, ee->h);
615 /* Server can have many plugs, so I block resize comand from client to server *
616 if ((extn) && (extn->ipc.server))
622 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_RESIZE, 0, 0, 0, &ipc, sizeof(ipc));
624 if (ee->func.fn_resize) ee->func.fn_resize(ee);
628 _ecore_evas_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int w, int h)
630 _ecore_evas_resize(ee, w, h);
634 _ecore_evas_modifiers_locks_mask_get(Evas *e)
638 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
640 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
642 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
644 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
646 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
648 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
650 if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
652 if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
654 if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
660 _ecore_evas_modifiers_locks_mask_set(Evas *e, int mask)
662 if (mask & MOD_SHIFT) evas_key_modifier_on (e, "Shift");
663 else evas_key_modifier_off(e, "Shift");
664 if (mask & MOD_CTRL) evas_key_modifier_on (e, "Control");
665 else evas_key_modifier_off(e, "Control");
666 if (mask & MOD_ALT) evas_key_modifier_on (e, "Alt");
667 else evas_key_modifier_off(e, "Alt");
668 if (mask & MOD_META) evas_key_modifier_on (e, "Meta");
669 else evas_key_modifier_off(e, "Meta");
670 if (mask & MOD_HYPER) evas_key_modifier_on (e, "Hyper");
671 else evas_key_modifier_off(e, "Hyper");
672 if (mask & MOD_SUPER) evas_key_modifier_on (e, "Super");
673 else evas_key_modifier_off(e, "Super");
674 if (mask & MOD_SCROLL) evas_key_lock_on (e, "Scroll_Lock");
675 else evas_key_lock_off(e, "Scroll_Lock");
676 if (mask & MOD_NUM) evas_key_lock_on (e, "Num_Lock");
677 else evas_key_lock_off(e, "Num_Lock");
678 if (mask & MOD_CAPS) evas_key_lock_on (e, "Caps_Lock");
679 else evas_key_lock_off(e, "Caps_Lock");
683 _ecore_evas_extn_cb_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
685 Ecore_Evas *ee = data;
686 Evas_Event_Mouse_In *ev = event_info;
689 extn = ee->engine.buffer.data;
691 if (extn->ipc.server)
693 Ipc_Data_Ev_Mouse_In ipc;
694 memset(&ipc, 0, sizeof(ipc));
696 ipc.timestamp = ev->timestamp;
697 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
698 ipc.event_flags = ev->event_flags;
699 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_IN, 0, 0, 0, &ipc, sizeof(ipc));
704 _ecore_evas_extn_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
706 Ecore_Evas *ee = data;
707 Evas_Event_Mouse_Out *ev = event_info;
710 extn = ee->engine.buffer.data;
712 if (extn->ipc.server)
714 Ipc_Data_Ev_Mouse_Out ipc;
715 memset(&ipc, 0, sizeof(ipc));
717 ipc.timestamp = ev->timestamp;
718 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
719 ipc.event_flags = ev->event_flags;
720 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_OUT, 0, 0, 0, &ipc, sizeof(ipc));
725 _ecore_evas_extn_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
727 Ecore_Evas *ee = data;
728 Evas_Event_Mouse_Down *ev = event_info;
731 extn = ee->engine.buffer.data;
733 if (extn->ipc.server)
735 /* We have send mouse move event before mouse down event */
737 Ipc_Data_Ev_Mouse_Move ipc_move;
738 memset(&ipc_move, 0, sizeof(ipc_move));
743 _ecore_evas_extn_coord_translate(ee, &x, &y);
746 ipc_move.timestamp = ev->timestamp;
747 ipc_move.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
748 ipc_move.event_flags = ev->event_flags;
749 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_MOVE, 0, 0, 0, &ipc_move, sizeof(ipc_move));
752 Ipc_Data_Ev_Mouse_Down ipc;
753 memset(&ipc, 0, sizeof(ipc));
755 ipc.flags = ev->flags;
756 ipc.timestamp = ev->timestamp;
757 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
758 ipc.event_flags = ev->event_flags;
759 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_DOWN, 0, 0, 0, &ipc, sizeof(ipc));
765 _ecore_evas_extn_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
767 Ecore_Evas *ee = data;
768 Evas_Event_Mouse_Up *ev = event_info;
771 extn = ee->engine.buffer.data;
773 if (extn->ipc.server)
775 Ipc_Data_Ev_Mouse_Up ipc;
776 memset(&ipc, 0, sizeof(ipc));
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_MOUSE_UP, 0, 0, 0, &ipc, sizeof(ipc));
788 _ecore_evas_extn_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
790 Ecore_Evas *ee = data;
791 Evas_Event_Mouse_Move *ev = event_info;
794 extn = ee->engine.buffer.data;
796 if (extn->ipc.server)
798 Ipc_Data_Ev_Mouse_Move ipc;
799 memset(&ipc, 0, sizeof(ipc));
802 x = ev->cur.canvas.x;
803 y = ev->cur.canvas.y;
804 _ecore_evas_extn_coord_translate(ee, &x, &y);
807 ipc.timestamp = ev->timestamp;
808 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
809 ipc.event_flags = ev->event_flags;
810 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_MOVE, 0, 0, 0, &ipc, sizeof(ipc));
815 _ecore_evas_extn_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
817 Ecore_Evas *ee = data;
818 Evas_Event_Mouse_Wheel *ev = event_info;
821 extn = ee->engine.buffer.data;
823 if (extn->ipc.server)
825 Ipc_Data_Ev_Mouse_Wheel ipc;
826 memset(&ipc, 0, sizeof(ipc));
828 ipc.direction = ev->direction;
830 ipc.timestamp = ev->timestamp;
831 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
832 ipc.event_flags = ev->event_flags;
833 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_WHEEL, 0, 0, 0, &ipc, sizeof(ipc));
838 _ecore_evas_extn_cb_multi_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
840 Ecore_Evas *ee = data;
841 Evas_Event_Multi_Down *ev = event_info;
844 extn = ee->engine.buffer.data;
846 if (extn->ipc.server)
848 Ipc_Data_Ev_Multi_Down ipc;
849 memset(&ipc, 0, sizeof(ipc));
855 _ecore_evas_extn_coord_translate(ee, &x, &y);
858 ipc.rad = ev->radius;
859 ipc.radx = ev->radius_x;
860 ipc.rady = ev->radius_y;
861 ipc.pres = ev->pressure;
863 ipc.fx = ev->canvas.xsub;
864 ipc.fy = ev->canvas.ysub;
865 ipc.flags = ev->flags;
866 ipc.timestamp = ev->timestamp;
867 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
868 ipc.event_flags = ev->event_flags;
869 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MULTI_DOWN, 0, 0, 0, &ipc, sizeof(ipc));
875 _ecore_evas_extn_cb_multi_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
877 Ecore_Evas *ee = data;
878 Evas_Event_Multi_Up *ev = event_info;
881 extn = ee->engine.buffer.data;
883 if (extn->ipc.server)
885 Ipc_Data_Ev_Multi_Up ipc;
886 memset(&ipc, 0, sizeof(ipc));
892 _ecore_evas_extn_coord_translate(ee, &x, &y);
895 ipc.rad = ev->radius;
896 ipc.radx = ev->radius_x;
897 ipc.rady = ev->radius_y;
898 ipc.pres = ev->pressure;
900 ipc.fx = ev->canvas.xsub;
901 ipc.fy = ev->canvas.ysub;
902 ipc.flags = ev->flags;
903 ipc.timestamp = ev->timestamp;
904 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
905 ipc.event_flags = ev->event_flags;
906 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MULTI_UP, 0, 0, 0, &ipc, sizeof(ipc));
911 _ecore_evas_extn_cb_multi_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
913 Ecore_Evas *ee = data;
914 Evas_Event_Multi_Move *ev = event_info;
917 extn = ee->engine.buffer.data;
919 if (extn->ipc.server)
921 Ipc_Data_Ev_Multi_Move ipc;
922 memset(&ipc, 0, sizeof(ipc));
926 x = ev->cur.canvas.x;
927 y = ev->cur.canvas.y;
928 _ecore_evas_extn_coord_translate(ee, &x, &y);
931 ipc.rad = ev->radius;
932 ipc.radx = ev->radius_x;
933 ipc.rady = ev->radius_y;
934 ipc.pres = ev->pressure;
936 ipc.fx = ev->cur.canvas.xsub;
937 ipc.fy = ev->cur.canvas.ysub;
938 ipc.timestamp = ev->timestamp;
939 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
940 ipc.event_flags = ev->event_flags;
941 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MULTI_MOVE, 0, 0, 0, &ipc, sizeof(ipc));
946 _ecore_evas_extn_cb_key_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
948 Ecore_Evas *ee = data;
949 Evas_Event_Key_Down *ev = event_info;
952 extn = ee->engine.buffer.data;
954 if (extn->ipc.server)
956 Ipc_Data_Ev_Key_Down *ipc;
960 len = sizeof(Ipc_Data_Ev_Key_Down);
961 if (ev->key) len += strlen(ev->key) + 1;
962 if (ev->keyname) len += strlen(ev->keyname) + 1;
963 if (ev->string) len += strlen(ev->string) + 1;
964 if (ev->compose) len += strlen(ev->compose) + 1;
967 ipc = (Ipc_Data_Ev_Key_Down *)st;
969 p = st + sizeof(Ipc_Data_Ev_Key_Down);
973 ipc->key = p - (long)st;
978 strcpy(p, ev->keyname);
979 ipc->keyname = p - (long)st;
984 strcpy(p, ev->string);
985 ipc->string = p - (long)st;
990 strcpy(p, ev->compose);
991 ipc->compose = p - (long)st;
994 ipc->timestamp = ev->timestamp;
995 ipc->mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
996 ipc->event_flags = ev->event_flags;
997 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_KEY_DOWN, 0, 0, 0, ipc, len);
1002 _ecore_evas_extn_cb_key_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1004 Ecore_Evas *ee = data;
1005 Evas_Event_Key_Up *ev = event_info;
1008 extn = ee->engine.buffer.data;
1010 if (extn->ipc.server)
1012 Ipc_Data_Ev_Key_Up *ipc;
1016 len = sizeof(Ipc_Data_Ev_Key_Up);
1017 if (ev->key) len += strlen(ev->key) + 1;
1018 if (ev->keyname) len += strlen(ev->keyname) + 1;
1019 if (ev->string) len += strlen(ev->string) + 1;
1020 if (ev->compose) len += strlen(ev->compose) + 1;
1023 ipc = (Ipc_Data_Ev_Key_Up *)st;
1025 p = st + sizeof(Ipc_Data_Ev_Key_Down);
1029 ipc->key = p - (long)st;
1034 strcpy(p, ev->keyname);
1035 ipc->keyname = p - (long)st;
1040 strcpy(p, ev->string);
1041 ipc->string = p - (long)st;
1046 strcpy(p, ev->compose);
1047 ipc->compose = p - (long)st;
1050 ipc->timestamp = ev->timestamp;
1051 ipc->mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
1052 ipc->event_flags = ev->event_flags;
1053 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_KEY_UP, 0, 0, 0, ipc, len);
1058 _ecore_evas_extn_cb_hold(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1060 Ecore_Evas *ee = data;
1061 Evas_Event_Hold *ev = event_info;
1064 extn = ee->engine.buffer.data;
1066 if (extn->ipc.server)
1068 Ipc_Data_Ev_Hold ipc;
1069 memset(&ipc, 0, sizeof(ipc));
1071 ipc.hold = ev->hold;
1072 ipc.timestamp = ev->timestamp;
1073 ipc.event_flags = ev->event_flags;
1074 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_HOLD, 0, 0, 0, &ipc, sizeof(ipc));
1079 _ecore_evas_extn_cb_focus_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1085 ee->prop.focused = 1;
1086 extn = ee->engine.buffer.data;
1088 if (!extn->ipc.server) return;
1089 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_FOCUS, 0, 0, 0, NULL, 0);
1093 _ecore_evas_extn_cb_focus_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1099 ee->prop.focused = 0;
1100 extn = ee->engine.buffer.data;
1102 if (!extn->ipc.server) return;
1103 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_UNFOCUS, 0, 0, 0, NULL, 0);
1107 _ecore_evas_extn_cb_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1114 extn = ee->engine.buffer.data;
1116 if (!extn->ipc.server) return;
1117 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_SHOW, 0, 0, 0, NULL, 0);
1121 _ecore_evas_extn_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1128 extn = ee->engine.buffer.data;
1130 if (!extn->ipc.server) return;
1131 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_HIDE, 0, 0, 0, NULL, 0);
1134 static const Ecore_Evas_Engine_Func _ecore_extn_plug_engine_func =
1136 _ecore_evas_extn_free,
1154 _ecore_evas_move_resize,
1182 NULL, // profiles_set
1191 NULL, // screen_geometry_get
1192 NULL, // screen_dpi_get
1194 NULL, // wm_rot_preferred_rotation_set
1195 NULL // wm_rot_available_rotations_set
1199 _ipc_server_add(void *data, int type __UNUSED__, void *event)
1201 Ecore_Ipc_Event_Server_Add *e = event;
1202 Ecore_Evas *ee = data;
1205 if (ee != ecore_ipc_server_data_get(e->server))
1206 return ECORE_CALLBACK_PASS_ON;
1207 if (!eina_list_data_find(extn_ee_list, ee))
1208 return ECORE_CALLBACK_PASS_ON;
1209 extn = ee->engine.buffer.data;
1210 if (!extn) return ECORE_CALLBACK_PASS_ON;
1211 //FIXME: find a way to let app know server there
1212 return ECORE_CALLBACK_PASS_ON;
1216 _ipc_server_del(void *data, int type __UNUSED__, void *event)
1218 Ecore_Ipc_Event_Server_Del *e = event;
1219 Ecore_Evas *ee = data;
1222 extn = ee->engine.buffer.data;
1223 if (!extn) return ECORE_CALLBACK_PASS_ON;
1224 if (extn->ipc.server != e->server) return ECORE_CALLBACK_PASS_ON;
1225 evas_object_image_data_set(ee->engine.buffer.image, NULL);
1226 ee->engine.buffer.pixels = NULL;
1227 if (extn->file.shmfile)
1229 shmfile_close(extn->file.shmfile);
1230 extn->file.shmfile = NULL;
1234 eina_stringshare_del(extn->file.shm);
1235 extn->file.shm = NULL;
1237 extn->ipc.server = NULL;
1238 if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
1239 return ECORE_CALLBACK_PASS_ON;
1243 _ipc_server_data(void *data, int type __UNUSED__, void *event)
1245 Ecore_Ipc_Event_Server_Data *e = event;
1246 Ecore_Evas *ee = data;
1249 if (ee != ecore_ipc_server_data_get(e->server))
1250 return ECORE_CALLBACK_PASS_ON;
1251 if (!eina_list_data_find(extn_ee_list, ee))
1252 return ECORE_CALLBACK_PASS_ON;
1253 extn = ee->engine.buffer.data;
1254 if (!extn) return ECORE_CALLBACK_PASS_ON;
1255 if (e->major != MAJOR)
1256 return ECORE_CALLBACK_PASS_ON;
1260 // add rect to update list
1261 if (e->size >= (int)sizeof(Ipc_Data_Update))
1263 Ipc_Data_Update *ipc = malloc(sizeof(Ipc_Data_Update));
1266 memcpy(ipc, e->data, sizeof(Ipc_Data_Update));
1267 extn->file.updates = eina_list_append(extn->file.updates, ipc);
1271 case OP_UPDATE_DONE:
1272 // updates finished being sent - done now. frame ready
1274 Ipc_Data_Update *ipc;
1276 EINA_LIST_FREE(extn->file.updates, ipc)
1278 if (ee->engine.buffer.image)
1279 evas_object_image_data_update_add(ee->engine.buffer.image,
1287 if ((e->data) && (e->size > 0) &&
1288 (((unsigned char *)e->data)[e->size - 1] == 0))
1290 if (extn->file.have_lock) _ecore_evas_socket_unlock(ee);
1291 if (extn->file.lockfd) close(extn->file.lockfd);
1292 if (extn->file.lock) eina_stringshare_del(extn->file.lock);
1293 extn->file.lock = eina_stringshare_add(e->data);
1294 extn->file.lockfd = open(extn->file.lock, O_RDONLY);
1300 // e->response == alpha
1301 // e->data = shm ref string + nul byte
1302 if ((e->data) && ((unsigned char *)e->data)[e->size - 1] == 0)
1304 ee->engine.buffer.pixels = NULL;
1305 if (extn->file.shmfile)
1307 shmfile_close(extn->file.shmfile);
1308 extn->file.shmfile = NULL;
1312 eina_stringshare_del(extn->file.shm);
1313 extn->file.shm = NULL;
1315 if ((e->ref > 0) && (e->ref_to > 0))
1317 extn->file.w = e->ref;
1318 extn->file.h = e->ref_to;
1319 extn->file.shm = eina_stringshare_add(e->data);
1320 extn->file.shmfile = shmfile_open(extn->file.shm,
1324 if (extn->file.shmfile)
1326 ee->engine.buffer.pixels = extn->file.shmfile->addr;
1327 if (ee->engine.buffer.image)
1330 evas_object_image_alpha_set(ee->engine.buffer.image,
1333 evas_object_image_alpha_set(ee->engine.buffer.image,
1335 evas_object_image_size_set(ee->engine.buffer.image,
1338 evas_object_image_data_set(ee->engine.buffer.image,
1339 ee->engine.buffer.pixels);
1340 evas_object_image_data_update_add(ee->engine.buffer.image,
1344 _ecore_evas_resize(ee,
1349 evas_object_image_data_set(ee->engine.buffer.image, NULL);
1352 evas_object_image_data_set(ee->engine.buffer.image, NULL);
1355 evas_object_image_data_set(ee->engine.buffer.image, NULL);
1359 if ((e->data) && (e->size >= (int)sizeof(Ipc_Data_Resize)))
1361 Ipc_Data_Resize *ipc = e->data;
1362 _ecore_evas_resize(ee, ipc->w, ipc->h);
1368 return ECORE_CALLBACK_PASS_ON;
1372 _ecore_evas_extn_init(void)
1377 _ecore_evas_extn_shutdown(void)
1381 #endif /* BUILD_ECORE_EVAS_EXTN */
1384 ecore_evas_extn_plug_new(Ecore_Evas *ee_target)
1386 #ifdef BUILD_ECORE_EVAS_EXTN
1391 if (!ee_target) return NULL;
1393 ee = calloc(1, sizeof(Ecore_Evas));
1394 if (!ee) return NULL;
1396 o = evas_object_image_filled_add(ee_target->evas);
1397 /* this make problem in gl engine, so I'll block this until solve problem
1398 evas_object_image_content_hint_set(o, EVAS_IMAGE_CONTENT_HINT_DYNAMIC);*/
1399 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
1400 evas_object_image_alpha_set(o, 1);
1401 evas_object_image_size_set(o, 1, 1);
1402 evas_object_image_data_set(o, &blank);
1404 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
1406 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_extn_plug_engine_func;
1408 ee->driver = "extn_plug";
1420 ee->prop.focused = 0;
1421 ee->prop.borderless = 1;
1422 ee->prop.override = 1;
1423 ee->prop.maximized = 0;
1424 ee->prop.fullscreen = 0;
1425 ee->prop.withdrawn = 0;
1426 ee->prop.sticky = 0;
1428 ee->engine.buffer.image = o;
1429 evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas", ee);
1430 evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas_Parent", ee_target);
1431 evas_object_event_callback_add(ee->engine.buffer.image,
1432 EVAS_CALLBACK_MOUSE_IN,
1433 _ecore_evas_extn_cb_mouse_in, ee);
1434 evas_object_event_callback_add(ee->engine.buffer.image,
1435 EVAS_CALLBACK_MOUSE_OUT,
1436 _ecore_evas_extn_cb_mouse_out, ee);
1437 evas_object_event_callback_add(ee->engine.buffer.image,
1438 EVAS_CALLBACK_MOUSE_DOWN,
1439 _ecore_evas_extn_cb_mouse_down, ee);
1440 evas_object_event_callback_add(ee->engine.buffer.image,
1441 EVAS_CALLBACK_MOUSE_UP,
1442 _ecore_evas_extn_cb_mouse_up, ee);
1443 evas_object_event_callback_add(ee->engine.buffer.image,
1444 EVAS_CALLBACK_MOUSE_MOVE,
1445 _ecore_evas_extn_cb_mouse_move, ee);
1446 evas_object_event_callback_add(ee->engine.buffer.image,
1447 EVAS_CALLBACK_MOUSE_WHEEL,
1448 _ecore_evas_extn_cb_mouse_wheel, ee);
1449 evas_object_event_callback_add(ee->engine.buffer.image,
1450 EVAS_CALLBACK_MULTI_DOWN,
1451 _ecore_evas_extn_cb_multi_down, ee);
1452 evas_object_event_callback_add(ee->engine.buffer.image,
1453 EVAS_CALLBACK_MULTI_UP,
1454 _ecore_evas_extn_cb_multi_up, ee);
1455 evas_object_event_callback_add(ee->engine.buffer.image,
1456 EVAS_CALLBACK_MULTI_MOVE,
1457 _ecore_evas_extn_cb_multi_move, ee);
1458 evas_object_event_callback_add(ee->engine.buffer.image,
1459 EVAS_CALLBACK_KEY_DOWN,
1460 _ecore_evas_extn_cb_key_down, ee);
1461 evas_object_event_callback_add(ee->engine.buffer.image,
1462 EVAS_CALLBACK_KEY_UP,
1463 _ecore_evas_extn_cb_key_up, ee);
1464 evas_object_event_callback_add(ee->engine.buffer.image,
1466 _ecore_evas_extn_cb_hold, ee);
1467 evas_object_event_callback_add(ee->engine.buffer.image,
1468 EVAS_CALLBACK_FOCUS_IN,
1469 _ecore_evas_extn_cb_focus_in, ee);
1470 evas_object_event_callback_add(ee->engine.buffer.image,
1471 EVAS_CALLBACK_FOCUS_OUT,
1472 _ecore_evas_extn_cb_focus_out, ee);
1473 evas_object_event_callback_add(ee->engine.buffer.image,
1475 _ecore_evas_extn_cb_show, ee);
1476 evas_object_event_callback_add(ee->engine.buffer.image,
1478 _ecore_evas_extn_cb_hide, ee);
1480 evas_object_event_callback_add(ee->engine.buffer.image,
1482 _ecore_evas_extn_plug_image_obj_del, ee);
1485 extn_ee_list = eina_list_append(extn_ee_list, ee);
1486 ee_target->sub_ecore_evas = eina_list_append(ee_target->sub_ecore_evas, ee);
1488 evas_event_callback_add(ee_target->evas, EVAS_CALLBACK_RENDER_PRE,
1489 _ecore_evas_extn_plug_targer_render_pre, ee);
1490 evas_event_callback_add(ee_target->evas, EVAS_CALLBACK_RENDER_POST,
1491 _ecore_evas_extn_plug_targer_render_post, ee);
1499 ecore_evas_extn_plug_connect(Evas_Object *obj, const char *svcname, int svcnum, Eina_Bool svcsys)
1501 #ifdef BUILD_ECORE_EVAS_EXTN
1503 Ecore_Evas *ee = NULL;
1505 if (!obj) return EINA_FALSE;
1507 ee = evas_object_data_get(obj, "Ecore_Evas");
1508 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS)) return EINA_FALSE;
1510 extn = calloc(1, sizeof(Extn));
1511 if (!extn) return EINA_FALSE;
1513 Ecore_Ipc_Type ipctype = ECORE_IPC_LOCAL_USER;
1516 extn->svc.name = eina_stringshare_add(svcname);
1517 extn->svc.num = svcnum;
1518 extn->svc.sys = svcsys;
1520 if (extn->svc.sys) ipctype = ECORE_IPC_LOCAL_SYSTEM;
1521 extn->ipc.server = ecore_ipc_server_connect(ipctype, (char *)extn->svc.name,
1523 if (!extn->ipc.server)
1525 eina_stringshare_del(extn->svc.name);
1527 ecore_ipc_shutdown();
1530 ee->engine.buffer.data = extn;
1531 extn->ipc.handlers = eina_list_append
1532 (extn->ipc.handlers,
1533 ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD,
1534 _ipc_server_add, ee));
1535 extn->ipc.handlers = eina_list_append
1536 (extn->ipc.handlers,
1537 ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL,
1538 _ipc_server_del, ee));
1539 extn->ipc.handlers = eina_list_append
1540 (extn->ipc.handlers,
1541 ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DATA,
1542 _ipc_server_data, ee));
1550 ecore_evas_extn_plug_object_data_lock(Evas_Object *obj)
1552 #ifdef BUILD_ECORE_EVAS_EXTN
1555 ee = ecore_evas_object_ecore_evas_get(obj);
1557 _ecore_evas_socket_lock(ee);
1562 ecore_evas_extn_plug_object_data_unlock(Evas_Object *obj)
1564 #ifdef BUILD_ECORE_EVAS_EXTN
1567 ee = ecore_evas_object_ecore_evas_get(obj);
1569 _ecore_evas_socket_unlock(ee);
1573 #ifdef BUILD_ECORE_EVAS_EXTN
1575 _ecore_evas_socket_resize(Ecore_Evas *ee, int w, int h)
1578 Evas_Engine_Info_Buffer *einfo;
1585 if ((w == ee->w) && (h == ee->h)) return;
1588 evas_output_size_set(ee->evas, ee->w, ee->h);
1589 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1590 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1591 extn = ee->engine.buffer.data;
1594 if (extn->file.shmfile)
1595 shmfile_free(extn->file.shmfile);
1596 ee->engine.buffer.pixels = NULL;
1597 extn->file.shmfile = shmfile_new(extn->svc.name, extn->svc.num,
1598 ee->w * ee->h * 4, extn->svc.sys);
1599 if (extn->file.shmfile)
1600 ee->engine.buffer.pixels = extn->file.shmfile->addr;
1603 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
1607 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
1609 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
1610 einfo->info.dest_buffer = ee->engine.buffer.pixels;
1611 einfo->info.dest_buffer_row_bytes = stride;
1612 einfo->info.use_color_key = 0;
1613 einfo->info.alpha_threshold = 0;
1614 einfo->info.func.new_update_region = NULL;
1615 einfo->info.func.free_update_region = NULL;
1616 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1618 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1622 if (extn->ipc.clients && extn->file.shmfile)
1624 Ipc_Data_Resize ipc;
1626 Ecore_Ipc_Client *client;
1628 EINA_LIST_FOREACH(extn->ipc.clients, l, client)
1629 ecore_ipc_client_send(client, MAJOR, OP_SHM_REF,
1630 ee->w, ee->h, ee->alpha,
1631 extn->file.shmfile->file,
1632 strlen(extn->file.shmfile->file) + 1);
1635 EINA_LIST_FOREACH(extn->ipc.clients, l, client)
1636 ecore_ipc_client_send(client, MAJOR, OP_RESIZE,
1637 0, 0, 0, &ipc, sizeof(ipc));
1640 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1644 _ecore_evas_socket_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int w, int h)
1646 _ecore_evas_socket_resize(ee, w, h);
1650 _ecore_evas_extn_socket_render(Ecore_Evas *ee)
1652 Eina_List *updates = NULL, *l, *ll;
1657 Ecore_Ipc_Client *client;
1659 extn = ee->engine.buffer.data;
1660 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
1662 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
1663 if (ee2->engine.func->fn_render)
1664 rend |= ee2->engine.func->fn_render(ee2);
1665 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
1667 if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
1669 if (ee->engine.buffer.pixels)
1671 _ecore_evas_socket_lock(ee);
1672 updates = evas_render_updates(ee->evas);
1673 _ecore_evas_socket_unlock(ee);
1675 EINA_LIST_FOREACH(updates, l, r)
1677 Ipc_Data_Update ipc;
1684 EINA_LIST_FOREACH(extn->ipc.clients, ll, client)
1685 ecore_ipc_client_send(client, MAJOR, OP_UPDATE, 0, 0, 0, &ipc, sizeof(ipc));
1689 evas_render_updates_free(updates);
1690 _ecore_evas_idle_timeout_update(ee);
1691 EINA_LIST_FOREACH(extn->ipc.clients, ll, client)
1692 ecore_ipc_client_send(client, MAJOR, OP_UPDATE_DONE, 0, 0, 0, NULL, 0);
1695 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
1696 return updates ? 1 : rend;
1700 _ipc_client_add(void *data, int type __UNUSED__, void *event)
1702 Ecore_Ipc_Event_Client_Add *e = event;
1703 Ecore_Evas *ee = data;
1706 if (ee != ecore_ipc_server_data_get(ecore_ipc_client_server_get(e->client)))
1707 return ECORE_CALLBACK_PASS_ON;
1708 if (!eina_list_data_find(extn_ee_list, ee))
1709 return ECORE_CALLBACK_PASS_ON;
1710 extn = ee->engine.buffer.data;
1711 if (!extn) return ECORE_CALLBACK_PASS_ON;
1713 extn->ipc.clients = eina_list_append(extn->ipc.clients, e->client);
1714 ecore_ipc_client_send(e->client, MAJOR, OP_LOCK_FILE, 0, 0, 0, extn->file.lock, strlen(extn->file.lock) + 1);
1716 if (extn->file.shmfile)
1718 Ipc_Data_Resize ipc;
1720 ecore_ipc_client_send(e->client, MAJOR, OP_SHM_REF,
1721 ee->w, ee->h, ee->alpha,
1722 extn->file.shmfile->file,
1723 strlen(extn->file.shmfile->file) + 1);
1727 ecore_ipc_client_send(e->client, MAJOR, OP_RESIZE,
1728 0, 0, 0, &ipc, sizeof(ipc));
1730 _ecore_evas_extn_event(ee, ECORE_EVAS_EXTN_CLIENT_ADD);
1731 return ECORE_CALLBACK_PASS_ON;
1735 _ipc_client_del(void *data, int type __UNUSED__, void *event)
1737 Ecore_Ipc_Event_Client_Del *e = event;
1738 Ecore_Evas *ee = data;
1740 extn = ee->engine.buffer.data;
1741 if (!extn) return ECORE_CALLBACK_PASS_ON;
1742 if (!eina_list_data_find(extn->ipc.clients, e->client)) return ECORE_CALLBACK_PASS_ON;
1744 extn->ipc.clients = eina_list_remove(extn->ipc.clients, e->client);
1746 _ecore_evas_extn_event(ee, ECORE_EVAS_EXTN_CLIENT_DEL);
1747 return ECORE_CALLBACK_PASS_ON;
1751 _ipc_client_data(void *data, int type __UNUSED__, void *event)
1753 Ecore_Ipc_Event_Client_Data *e = event;
1754 Ecore_Evas *ee = data;
1757 if (ee != ecore_ipc_server_data_get(ecore_ipc_client_server_get(e->client)))
1758 return ECORE_CALLBACK_PASS_ON;
1759 if (!eina_list_data_find(extn_ee_list, ee))
1760 return ECORE_CALLBACK_PASS_ON;
1761 extn = ee->engine.buffer.data;
1762 if (!extn) return ECORE_CALLBACK_PASS_ON;
1763 if (e->major != MAJOR)
1764 return ECORE_CALLBACK_PASS_ON;
1768 if ((e->data) && (e->size >= (int)sizeof(Ipc_Data_Resize)))
1771 Ipc_Data_Resize *ipc = e->data;
1772 /* create callbacke data size changed */
1773 _ecore_evas_socket_resize(ee, ipc->w, ipc->h);
1780 if (ee->func.fn_show) ee->func.fn_show(ee);
1787 if (ee->func.fn_hide) ee->func.fn_hide(ee);
1791 if (!ee->prop.focused)
1793 ee->prop.focused = 1;
1794 evas_focus_in(ee->evas);
1795 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
1799 if (ee->prop.focused)
1801 ee->prop.focused = 0;
1802 evas_focus_out(ee->evas);
1803 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
1806 case OP_EV_MOUSE_IN:
1807 if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_In))
1809 Ipc_Data_Ev_Mouse_In *ipc = e->data;
1810 Evas_Event_Flags flags;
1812 flags = evas_event_default_flags_get(ee->evas);
1813 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1814 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1815 evas_event_feed_mouse_in(ee->evas, ipc->timestamp, NULL);
1816 evas_event_default_flags_set(ee->evas, flags);
1819 case OP_EV_MOUSE_OUT:
1820 if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Out))
1822 Ipc_Data_Ev_Mouse_Out *ipc = e->data;
1823 Evas_Event_Flags flags;
1825 flags = evas_event_default_flags_get(ee->evas);
1826 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1827 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1828 evas_event_feed_mouse_out(ee->evas, ipc->timestamp, NULL);
1829 evas_event_default_flags_set(ee->evas, flags);
1832 case OP_EV_MOUSE_UP:
1833 if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Up))
1835 Ipc_Data_Ev_Mouse_Up *ipc = e->data;
1836 Evas_Event_Flags flags;
1838 flags = evas_event_default_flags_get(ee->evas);
1839 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1840 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1841 evas_event_feed_mouse_up(ee->evas, ipc->b, ipc->flags, ipc->timestamp, NULL);
1842 evas_event_default_flags_set(ee->evas, flags);
1845 case OP_EV_MOUSE_DOWN:
1846 if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Down))
1848 Ipc_Data_Ev_Mouse_Up *ipc = e->data;
1849 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_mouse_down(ee->evas, ipc->b, ipc->flags, ipc->timestamp, NULL);
1855 evas_event_default_flags_set(ee->evas, flags);
1858 case OP_EV_MOUSE_MOVE:
1859 if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Move))
1861 Ipc_Data_Ev_Mouse_Move *ipc = e->data;
1862 Evas_Event_Flags flags;
1864 flags = evas_event_default_flags_get(ee->evas);
1865 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1866 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1867 evas_event_feed_mouse_move(ee->evas, ipc->x, ipc->y, ipc->timestamp, NULL);
1868 evas_event_default_flags_set(ee->evas, flags);
1871 case OP_EV_MOUSE_WHEEL:
1872 if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Wheel))
1874 Ipc_Data_Ev_Mouse_Wheel *ipc = e->data;
1875 Evas_Event_Flags flags;
1877 flags = evas_event_default_flags_get(ee->evas);
1878 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1879 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1880 evas_event_feed_mouse_wheel(ee->evas, ipc->direction, ipc->z, ipc->timestamp, NULL);
1881 evas_event_default_flags_set(ee->evas, flags);
1884 case OP_EV_MULTI_UP:
1885 if (e->size >= (int)sizeof(Ipc_Data_Ev_Multi_Up))
1887 Ipc_Data_Ev_Multi_Up *ipc = e->data;
1888 Evas_Event_Flags flags;
1890 flags = evas_event_default_flags_get(ee->evas);
1891 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1892 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1893 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);
1894 evas_event_default_flags_set(ee->evas, flags);
1897 case OP_EV_MULTI_DOWN:
1898 if (e->size >= (int)sizeof(Ipc_Data_Ev_Multi_Down))
1900 Ipc_Data_Ev_Multi_Down *ipc = e->data;
1901 Evas_Event_Flags flags;
1903 flags = evas_event_default_flags_get(ee->evas);
1904 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1905 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1906 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);
1907 evas_event_default_flags_set(ee->evas, flags);
1910 case OP_EV_MULTI_MOVE:
1911 if (e->size >= (int)sizeof(Ipc_Data_Ev_Multi_Move))
1913 Ipc_Data_Ev_Multi_Move *ipc = e->data;
1914 Evas_Event_Flags flags;
1916 flags = evas_event_default_flags_get(ee->evas);
1917 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1918 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1919 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);
1920 evas_event_default_flags_set(ee->evas, flags);
1924 #define STRGET(val) \
1926 if ((ipc->val) && (ipc->val < (char *)(long)(e->size - 1))) \
1927 ipc->val = ((char *)ipc) + (long)ipc->val; \
1933 if (e->size >= (int)sizeof(Ipc_Data_Ev_Key_Up))
1935 if ((e->data) && (e->size > 0) &&
1936 (((unsigned char *)e->data)[e->size - 1] == 0))
1938 Ipc_Data_Ev_Key_Up *ipc = e->data;
1939 Evas_Event_Flags flags;
1945 flags = evas_event_default_flags_get(ee->evas);
1946 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1947 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1948 evas_event_feed_key_up(ee->evas, ipc->keyname, ipc->key, ipc->string, ipc->compose, ipc->timestamp, NULL);
1949 evas_event_default_flags_set(ee->evas, flags);
1953 case OP_EV_KEY_DOWN:
1954 if (e->size >= (int)sizeof(Ipc_Data_Ev_Key_Down))
1956 if ((e->data) && (e->size > 0) &&
1957 (((unsigned char *)e->data)[e->size - 1] == 0))
1959 Ipc_Data_Ev_Key_Down *ipc = e->data;
1960 Evas_Event_Flags flags;
1966 flags = evas_event_default_flags_get(ee->evas);
1967 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1968 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1969 evas_event_feed_key_down(ee->evas, ipc->keyname, ipc->key, ipc->string, ipc->compose, ipc->timestamp, NULL);
1970 evas_event_default_flags_set(ee->evas, flags);
1975 if (e->size >= (int)sizeof(Ipc_Data_Ev_Hold))
1977 Ipc_Data_Ev_Hold *ipc = e->data;
1978 Evas_Event_Flags flags;
1980 flags = evas_event_default_flags_get(ee->evas);
1981 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1982 evas_event_feed_hold(ee->evas, ipc->hold, ipc->timestamp, NULL);
1983 evas_event_default_flags_set(ee->evas, flags);
1989 return ECORE_CALLBACK_PASS_ON;
1993 _ecore_evas_extn_socket_alpha_set(Ecore_Evas *ee, int alpha)
1997 Ecore_Ipc_Client *client;
1999 if (((ee->alpha) && (alpha)) || ((!ee->alpha) && (!alpha))) return;
2002 extn = ee->engine.buffer.data;
2005 Evas_Engine_Info_Buffer *einfo;
2007 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
2011 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
2013 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
2014 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
2015 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2017 EINA_LIST_FOREACH(extn->ipc.clients, l, client)
2018 ecore_ipc_client_send(client, MAJOR, OP_SHM_REF,
2019 ee->w, ee->h, ee->alpha,
2020 extn->file.shmfile->file,
2021 strlen(extn->file.shmfile->file) + 1);
2025 static const Ecore_Evas_Engine_Func _ecore_extn_socket_engine_func =
2027 _ecore_evas_extn_free,
2044 _ecore_evas_socket_resize,
2045 _ecore_evas_socket_move_resize,
2071 _ecore_evas_extn_socket_alpha_set,
2073 NULL, // profiles_set
2082 _ecore_evas_extn_socket_render, // render
2083 NULL, // screen_geometry_get
2084 NULL, // screen_dpi_get
2090 ecore_evas_extn_socket_new(int w, int h)
2092 #ifdef BUILD_ECORE_EVAS_EXTN
2093 Evas_Engine_Info_Buffer *einfo;
2097 rmethod = evas_render_method_lookup("buffer");
2098 if (!rmethod) return NULL;
2099 ee = calloc(1, sizeof(Ecore_Evas));
2100 if (!ee) return NULL;
2102 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
2104 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_extn_socket_engine_func;
2106 ee->driver = "extn_socket";
2118 ee->prop.focused = 0;
2119 ee->prop.borderless = 1;
2120 ee->prop.override = 1;
2121 ee->prop.maximized = 0;
2122 ee->prop.fullscreen = 0;
2123 ee->prop.withdrawn = 0;
2124 ee->prop.sticky = 0;
2126 /* init evas here */
2127 ee->evas = evas_new();
2128 evas_data_attach_set(ee->evas, ee);
2129 evas_output_method_set(ee->evas, rmethod);
2130 evas_output_size_set(ee->evas, w, h);
2131 evas_output_viewport_set(ee->evas, 0, 0, w, h);
2133 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
2137 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
2139 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
2140 einfo->info.dest_buffer = NULL;
2141 einfo->info.dest_buffer_row_bytes = 0;
2142 einfo->info.use_color_key = 0;
2143 einfo->info.alpha_threshold = 0;
2144 einfo->info.func.new_update_region = NULL;
2145 einfo->info.func.free_update_region = NULL;
2146 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2148 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2149 ecore_evas_free(ee);
2155 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
2156 ecore_evas_free(ee);
2159 evas_key_modifier_add(ee->evas, "Shift");
2160 evas_key_modifier_add(ee->evas, "Control");
2161 evas_key_modifier_add(ee->evas, "Alt");
2162 evas_key_modifier_add(ee->evas, "Meta");
2163 evas_key_modifier_add(ee->evas, "Hyper");
2164 evas_key_modifier_add(ee->evas, "Super");
2165 evas_key_lock_add(ee->evas, "Caps_Lock");
2166 evas_key_lock_add(ee->evas, "Num_Lock");
2167 evas_key_lock_add(ee->evas, "Scroll_Lock");
2169 extn_ee_list = eina_list_append(extn_ee_list, ee);
2171 _ecore_evas_register(ee);
2180 ecore_evas_extn_socket_listen(Ecore_Evas *ee, const char *svcname, int svcnum, Eina_Bool svcsys)
2182 #ifdef BUILD_ECORE_EVAS_EXTN
2185 extn = calloc(1, sizeof(Extn));
2192 Ecore_Ipc_Type ipctype = ECORE_IPC_LOCAL_USER;
2196 extn->svc.name = eina_stringshare_add(svcname);
2197 extn->svc.num = svcnum;
2198 extn->svc.sys = svcsys;
2200 snprintf(buf, sizeof(buf), "/tmp/ee-lock-XXXXXX");
2201 extn->file.lockfd = mkstemp(buf);
2202 if (extn->file.lockfd >= 0)
2203 extn->file.lock = eina_stringshare_add(buf);
2204 if ((extn->file.lockfd < 0) || (!extn->file.lock))
2206 if (extn->file.lockfd)
2208 close(extn->file.lockfd);
2211 eina_stringshare_del(extn->svc.name);
2212 if (extn->file.lock) eina_stringshare_del(extn->file.lock);
2214 ecore_ipc_shutdown();
2218 if (extn->svc.sys) ipctype = ECORE_IPC_LOCAL_SYSTEM;
2219 extn->ipc.am_server = EINA_TRUE;
2220 extn->ipc.server = ecore_ipc_server_add(ipctype,
2221 (char *)extn->svc.name,
2223 if (!extn->ipc.server)
2225 if (extn->file.lockfd)
2227 close(extn->file.lockfd);
2228 if (extn->file.lock) unlink(extn->file.lock);
2230 eina_stringshare_del(extn->svc.name);
2231 eina_stringshare_del(extn->file.lock);
2233 ecore_ipc_shutdown();
2236 ee->engine.buffer.data = extn;
2237 extn->ipc.handlers = eina_list_append
2238 (extn->ipc.handlers,
2239 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD,
2240 _ipc_client_add, ee));
2241 extn->ipc.handlers = eina_list_append
2242 (extn->ipc.handlers,
2243 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL,
2244 _ipc_client_del, ee));
2245 extn->ipc.handlers = eina_list_append
2246 (extn->ipc.handlers,
2247 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA,
2248 _ipc_client_data, ee));