11 #ifdef HAVE_SYS_MMAN_H
12 # include <sys/mman.h>
21 #include "ecore_private.h"
22 #include <Ecore_Input.h>
24 #ifdef BUILD_ECORE_EVAS_EXTN
26 #include <Ecore_Ipc.h>
30 #include "ecore_evas_private.h"
31 #include "Ecore_Evas.h"
34 #ifdef BUILD_ECORE_EVAS_EXTN
37 typedef struct _Shmfile Shmfile;
47 static int blank = 0x00000000;
50 shmfile_new(const char *base, int id, int size, Eina_Bool sys)
55 sf = calloc(1, sizeof(Shmfile));
60 snprintf(file, sizeof(file), "/%s-%i-%i.%i.%i",
61 base, id, (int)time(NULL), (int)getpid(), (int)rand());
62 mode = S_IRUSR | S_IWUSR;
63 if (sys) mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
64 sf->fd = shm_open(file, O_RDWR | O_CREAT | O_EXCL, mode);
68 sf->file = eina_stringshare_add(file);
73 eina_stringshare_del(sf->file);
78 if (ftruncate(sf->fd, size) < 0)
82 eina_stringshare_del(sf->file);
86 sf->addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, sf->fd, 0);
87 if (sf->addr == MAP_FAILED)
91 eina_stringshare_del(sf->file);
99 shmfile_free(Shmfile *sf)
101 munmap(sf->addr, sf->size);
103 shm_unlink(sf->file);
104 eina_stringshare_del(sf->file);
109 shmfile_open(const char *ref, int size, Eina_Bool sys)
114 sf = calloc(1, sizeof(Shmfile));
115 mode = S_IRUSR | S_IWUSR;
116 if (sys) mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
117 sf->fd = shm_open(ref, O_RDWR, mode);
123 sf->file = eina_stringshare_add(ref);
127 eina_stringshare_del(sf->file);
132 sf->addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, sf->fd, 0);
133 if (sf->addr == MAP_FAILED)
136 eina_stringshare_del(sf->file);
144 shmfile_close(Shmfile *sf)
146 munmap(sf->addr, sf->size);
148 eina_stringshare_del(sf->file);
152 // procotol version - change this as needed
182 MOD_SHIFT = (1 << 0),
186 MOD_HYPER = (1 << 4),
187 MOD_SUPER = (1 << 5),
190 MOD_SCROLL = (1 << 8),
193 typedef struct _Ipc_Data_Resize Ipc_Data_Resize;
194 typedef struct _Ipc_Data_Update Ipc_Data_Update;
195 typedef struct _Ipc_Data_Ev_Mouse_In Ipc_Data_Ev_Mouse_In;
196 typedef struct _Ipc_Data_Ev_Mouse_Out Ipc_Data_Ev_Mouse_Out;
197 typedef struct _Ipc_Data_Ev_Mouse_Up Ipc_Data_Ev_Mouse_Up;
198 typedef struct _Ipc_Data_Ev_Mouse_Down Ipc_Data_Ev_Mouse_Down;
199 typedef struct _Ipc_Data_Ev_Mouse_Move Ipc_Data_Ev_Mouse_Move;
200 typedef struct _Ipc_Data_Ev_Mouse_Wheel Ipc_Data_Ev_Mouse_Wheel;
201 typedef struct _Ipc_Data_Ev_Hold Ipc_Data_Ev_Hold;
202 typedef struct _Ipc_Data_Ev_Multi_Up Ipc_Data_Ev_Multi_Up;
203 typedef struct _Ipc_Data_Ev_Multi_Down Ipc_Data_Ev_Multi_Down;
204 typedef struct _Ipc_Data_Ev_Multi_Move Ipc_Data_Ev_Multi_Move;
205 typedef struct _Ipc_Data_Ev_Key_Up Ipc_Data_Ev_Key_Up;
206 typedef struct _Ipc_Data_Ev_Key_Down Ipc_Data_Ev_Key_Down;
208 struct _Ipc_Data_Resize
213 struct _Ipc_Data_Update
218 struct _Ipc_Data_Ev_Mouse_In
220 unsigned int timestamp;
222 Evas_Event_Flags event_flags;
225 struct _Ipc_Data_Ev_Mouse_Out
227 unsigned int timestamp;
229 Evas_Event_Flags event_flags;
232 struct _Ipc_Data_Ev_Mouse_Up
235 Evas_Button_Flags flags;
237 unsigned int timestamp;
238 Evas_Event_Flags event_flags;
241 struct _Ipc_Data_Ev_Mouse_Down
244 Evas_Button_Flags flags;
246 unsigned int timestamp;
247 Evas_Event_Flags event_flags;
250 struct _Ipc_Data_Ev_Mouse_Move
253 Evas_Button_Flags flags;
255 unsigned int timestamp;
256 Evas_Event_Flags event_flags;
259 struct _Ipc_Data_Ev_Mouse_Wheel
262 Evas_Button_Flags flags;
264 unsigned int timestamp;
265 Evas_Event_Flags event_flags;
268 struct _Ipc_Data_Ev_Hold
271 unsigned int timestamp;
272 Evas_Event_Flags event_flags;
275 struct _Ipc_Data_Ev_Multi_Up
277 Evas_Button_Flags flags;
279 double rad, radx, rady, pres, ang, fx, fy;
281 unsigned int timestamp;
282 Evas_Event_Flags event_flags;
285 struct _Ipc_Data_Ev_Multi_Down
287 Evas_Button_Flags flags;
289 double rad, radx, rady, pres, ang, fx, fy;
291 unsigned int timestamp;
292 Evas_Event_Flags event_flags;
295 struct _Ipc_Data_Ev_Multi_Move
298 double rad, radx, rady, pres, ang, fx, fy;
300 unsigned int timestamp;
301 Evas_Event_Flags event_flags;
304 struct _Ipc_Data_Ev_Key_Up
306 const char *keyname, *key, *string, *compose;
308 unsigned int timestamp;
309 Evas_Event_Flags event_flags;
312 struct _Ipc_Data_Ev_Key_Down
314 const char *keyname, *key, *string, *compose;
316 unsigned int timestamp;
317 Evas_Event_Flags event_flags;
320 typedef struct _Extn Extn;
325 Ecore_Ipc_Server *server;
328 Eina_Bool am_server : 1;
342 Eina_Bool have_lock : 1;
346 static Eina_List *extn_ee_list = NULL;
348 EAPI int ECORE_EVAS_EXTN_CLIENT_ADD = 0;
349 EAPI int ECORE_EVAS_EXTN_CLIENT_DEL = 0;
352 _ecore_evas_extn_init(void)
354 if (ECORE_EVAS_EXTN_CLIENT_ADD) return;
355 ECORE_EVAS_EXTN_CLIENT_ADD = ecore_event_type_new();
356 ECORE_EVAS_EXTN_CLIENT_DEL = ecore_event_type_new();
360 _ecore_evas_extn_shutdown(void)
365 _ecore_evas_extn_event_free(void *data, void *ev __UNUSED__)
367 Ecore_Evas *ee = data;
368 if (ee->engine.buffer.image)
369 evas_object_unref(ee->engine.buffer.image);
370 _ecore_evas_unref(ee);
374 _ecore_evas_extn_event(Ecore_Evas *ee, int event)
377 if (ee->engine.buffer.image)
378 evas_object_ref(ee->engine.buffer.image);
379 ecore_event_add(event, ee->engine.buffer.image,
380 _ecore_evas_extn_event_free, ee);
384 _ecore_evas_socket_lock(Ecore_Evas *ee)
388 extn = ee->engine.buffer.data;
390 if (extn->file.lockfd < 0) return;
391 if (extn->file.have_lock) return;
392 flock(extn->file.lockfd, LOCK_EX);
393 extn->file.have_lock = EINA_TRUE;
397 _ecore_evas_socket_unlock(Ecore_Evas *ee)
401 extn = ee->engine.buffer.data;
403 if (extn->file.lockfd < 0) return;
404 if (!extn->file.have_lock) return;
405 flock(extn->file.lockfd, LOCK_UN);
406 extn->file.have_lock = EINA_FALSE;
410 _ecore_evas_extn_plug_targer_render_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
412 Ecore_Evas *ee = data;
413 if (ee) _ecore_evas_socket_lock(ee);
417 _ecore_evas_extn_plug_targer_render_post(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
419 Ecore_Evas *ee = data;
420 if (ee) _ecore_evas_socket_unlock(ee);
424 _ecore_evas_extn_plug_image_obj_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
426 Ecore_Evas *ee = data;
427 if (ee) ecore_evas_free(ee);
431 _ecore_evas_extn_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
433 Evas_Coord xx, yy, ww, hh, fx, fy, fw, fh;
435 evas_object_geometry_get(ee->engine.buffer.image, &xx, &yy, &ww, &hh);
436 evas_object_image_fill_get(ee->engine.buffer.image, &fx, &fy, &fw, &fh);
441 if (evas_object_map_get(ee->engine.buffer.image) &&
442 evas_object_map_enable_get(ee->engine.buffer.image))
445 fw = ee->w; fh = ee->h;
446 ww = ee->w; hh = ee->h;
449 if ((fx == 0) && (fy == 0) && (fw == ww) && (fh == hh))
451 *x = (ee->w * (*x - xx)) / fw;
452 *y = (ee->h * (*y - yy)) / fh;
457 while (xx < 0) xx += fw;
458 while (xx > fw) xx -= fw;
459 *x = (ee->w * xx) / fw;
462 while (yy < 0) yy += fh;
463 while (yy > fh) yy -= fh;
464 *y = (ee->h * yy) / fh;
469 _ecore_evas_extn_free(Ecore_Evas *ee)
472 Ecore_Ipc_Client *client;
474 extn = ee->engine.buffer.data;
477 Ecore_Event_Handler *hdl;
479 if (extn->file.have_lock)
480 _ecore_evas_socket_unlock(ee);
481 if (extn->file.lockfd)
483 close(extn->file.lockfd);
484 if (extn->ipc.am_server)
486 if (extn->file.lock) unlink(extn->file.lock);
489 if (extn->svc.name) eina_stringshare_del(extn->svc.name);
490 if (extn->ipc.clients)
492 EINA_LIST_FREE(extn->ipc.clients, client)
493 ecore_ipc_client_del(client);
495 if (extn->ipc.server) ecore_ipc_server_del(extn->ipc.server);
496 if (extn->file.lock) eina_stringshare_del(extn->file.lock);
497 if (extn->file.shm) eina_stringshare_del(extn->file.shm);
498 if (extn->file.shmfile)
500 if (extn->ipc.am_server)
501 shmfile_free(extn->file.shmfile);
503 shmfile_close(extn->file.shmfile);
506 EINA_LIST_FREE(extn->ipc.handlers, hdl)
507 ecore_event_handler_del(hdl);
509 ecore_ipc_shutdown();
510 ee->engine.buffer.data = NULL;
512 if (ee->engine.buffer.image)
516 evas_object_event_callback_del_full(ee->engine.buffer.image,
518 _ecore_evas_extn_plug_image_obj_del,
520 evas_event_callback_del_full(evas_object_evas_get(ee->engine.buffer.image),
521 EVAS_CALLBACK_RENDER_PRE,
522 _ecore_evas_extn_plug_targer_render_pre,
524 evas_event_callback_del_full(evas_object_evas_get(ee->engine.buffer.image),
525 EVAS_CALLBACK_RENDER_POST,
526 _ecore_evas_extn_plug_targer_render_post,
528 evas_object_del(ee->engine.buffer.image);
529 ee2 = evas_object_data_get(ee->engine.buffer.image, "Ecore_Evas_Parent");
532 ee2->sub_ecore_evas = eina_list_remove(ee2->sub_ecore_evas, ee);
535 extn_ee_list = eina_list_remove(extn_ee_list, ee);
539 _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
545 if ((w == ee->w) && (h == ee->h)) return;
550 * No need for it if not used later.
553 extn = ee->engine.buffer.data;
555 if (ee->engine.buffer.image)
556 evas_object_image_size_set(ee->engine.buffer.image, ee->w, ee->h);
557 /* Server can have many plugs, so I block resize comand from client to server *
558 if ((extn) && (extn->ipc.server))
564 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_RESIZE, 0, 0, 0, &ipc, sizeof(ipc));
566 if (ee->func.fn_resize) ee->func.fn_resize(ee);
570 _ecore_evas_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int w, int h)
572 _ecore_evas_resize(ee, w, h);
576 _ecore_evas_modifiers_locks_mask_get(Evas *e)
580 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
582 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
584 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
586 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
588 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
590 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
592 if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
594 if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
596 if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
602 _ecore_evas_modifiers_locks_mask_set(Evas *e, int mask)
604 if (mask & MOD_SHIFT) evas_key_modifier_on (e, "Shift");
605 else evas_key_modifier_off(e, "Shift");
606 if (mask & MOD_CTRL) evas_key_modifier_on (e, "Control");
607 else evas_key_modifier_off(e, "Control");
608 if (mask & MOD_ALT) evas_key_modifier_on (e, "Alt");
609 else evas_key_modifier_off(e, "Alt");
610 if (mask & MOD_META) evas_key_modifier_on (e, "Meta");
611 else evas_key_modifier_off(e, "Meta");
612 if (mask & MOD_HYPER) evas_key_modifier_on (e, "Hyper");
613 else evas_key_modifier_off(e, "Hyper");
614 if (mask & MOD_SUPER) evas_key_modifier_on (e, "Super");
615 else evas_key_modifier_off(e, "Super");
616 if (mask & MOD_SCROLL) evas_key_lock_on (e, "Scroll_Lock");
617 else evas_key_lock_off(e, "Scroll_Lock");
618 if (mask & MOD_NUM) evas_key_lock_on (e, "Num_Lock");
619 else evas_key_lock_off(e, "Num_Lock");
620 if (mask & MOD_CAPS) evas_key_lock_on (e, "Caps_Lock");
621 else evas_key_lock_off(e, "Caps_Lock");
625 _ecore_evas_extn_cb_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
627 Ecore_Evas *ee = data;
628 Evas_Event_Mouse_In *ev = event_info;
631 extn = ee->engine.buffer.data;
633 if (extn->ipc.server)
635 Ipc_Data_Ev_Mouse_In ipc;
637 ipc.timestamp = ev->timestamp;
638 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
639 ipc.event_flags = ev->event_flags;
640 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_IN, 0, 0, 0, &ipc, sizeof(ipc));
645 _ecore_evas_extn_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
647 Ecore_Evas *ee = data;
648 Evas_Event_Mouse_Out *ev = event_info;
651 extn = ee->engine.buffer.data;
653 if (extn->ipc.server)
655 Ipc_Data_Ev_Mouse_Out ipc;
657 ipc.timestamp = ev->timestamp;
658 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
659 ipc.event_flags = ev->event_flags;
660 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_OUT, 0, 0, 0, &ipc, sizeof(ipc));
665 _ecore_evas_extn_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
667 Ecore_Evas *ee = data;
668 Evas_Event_Mouse_Down *ev = event_info;
671 extn = ee->engine.buffer.data;
673 if (extn->ipc.server)
675 Ipc_Data_Ev_Mouse_Down ipc;
678 ipc.flags = ev->flags;
679 ipc.timestamp = ev->timestamp;
680 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
681 ipc.event_flags = ev->event_flags;
682 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_DOWN, 0, 0, 0, &ipc, sizeof(ipc));
687 _ecore_evas_extn_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
689 Ecore_Evas *ee = data;
690 Evas_Event_Mouse_Up *ev = event_info;
693 extn = ee->engine.buffer.data;
695 if (extn->ipc.server)
697 Ipc_Data_Ev_Mouse_Up ipc;
700 ipc.flags = ev->flags;
701 ipc.timestamp = ev->timestamp;
702 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
703 ipc.event_flags = ev->event_flags;
704 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_UP, 0, 0, 0, &ipc, sizeof(ipc));
709 _ecore_evas_extn_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
711 Ecore_Evas *ee = data;
712 Evas_Event_Mouse_Move *ev = event_info;
715 extn = ee->engine.buffer.data;
717 if (extn->ipc.server)
719 Ipc_Data_Ev_Mouse_Move ipc;
722 x = ev->cur.canvas.x;
723 y = ev->cur.canvas.y;
724 _ecore_evas_extn_coord_translate(ee, &x, &y);
727 ipc.timestamp = ev->timestamp;
728 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
729 ipc.event_flags = ev->event_flags;
730 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_MOVE, 0, 0, 0, &ipc, sizeof(ipc));
735 _ecore_evas_extn_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
737 Ecore_Evas *ee = data;
738 Evas_Event_Mouse_Wheel *ev = event_info;
741 extn = ee->engine.buffer.data;
743 if (extn->ipc.server)
745 Ipc_Data_Ev_Mouse_Wheel ipc;
747 ipc.direction = ev->direction;
749 ipc.timestamp = ev->timestamp;
750 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
751 ipc.event_flags = ev->event_flags;
752 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_WHEEL, 0, 0, 0, &ipc, sizeof(ipc));
757 _ecore_evas_extn_cb_multi_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
759 Ecore_Evas *ee = data;
760 Evas_Event_Multi_Down *ev = event_info;
763 extn = ee->engine.buffer.data;
765 if (extn->ipc.server)
767 Ipc_Data_Ev_Multi_Down ipc;
773 _ecore_evas_extn_coord_translate(ee, &x, &y);
776 ipc.rad = ev->radius;
777 ipc.radx = ev->radius_x;
778 ipc.rady = ev->radius_y;
779 ipc.pres = ev->pressure;
781 ipc.fx = ev->canvas.xsub;
782 ipc.fy = ev->canvas.ysub;
783 ipc.flags = ev->flags;
784 ipc.timestamp = ev->timestamp;
785 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
786 ipc.event_flags = ev->event_flags;
787 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MULTI_DOWN, 0, 0, 0, &ipc, sizeof(ipc));
793 _ecore_evas_extn_cb_multi_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
795 Ecore_Evas *ee = data;
796 Evas_Event_Multi_Up *ev = event_info;
799 extn = ee->engine.buffer.data;
801 if (extn->ipc.server)
803 Ipc_Data_Ev_Multi_Up ipc;
809 _ecore_evas_extn_coord_translate(ee, &x, &y);
812 ipc.rad = ev->radius;
813 ipc.radx = ev->radius_x;
814 ipc.rady = ev->radius_y;
815 ipc.pres = ev->pressure;
817 ipc.fx = ev->canvas.xsub;
818 ipc.fy = ev->canvas.ysub;
819 ipc.flags = ev->flags;
820 ipc.timestamp = ev->timestamp;
821 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
822 ipc.event_flags = ev->event_flags;
823 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MULTI_UP, 0, 0, 0, &ipc, sizeof(ipc));
828 _ecore_evas_extn_cb_multi_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
830 Ecore_Evas *ee = data;
831 Evas_Event_Multi_Move *ev = event_info;
834 extn = ee->engine.buffer.data;
836 if (extn->ipc.server)
838 Ipc_Data_Ev_Multi_Move ipc;
842 x = ev->cur.canvas.x;
843 y = ev->cur.canvas.y;
844 _ecore_evas_extn_coord_translate(ee, &x, &y);
847 ipc.rad = ev->radius;
848 ipc.radx = ev->radius_x;
849 ipc.rady = ev->radius_y;
850 ipc.pres = ev->pressure;
852 ipc.fx = ev->cur.canvas.xsub;
853 ipc.fy = ev->cur.canvas.ysub;
854 ipc.timestamp = ev->timestamp;
855 ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
856 ipc.event_flags = ev->event_flags;
857 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MULTI_MOVE, 0, 0, 0, &ipc, sizeof(ipc));
862 _ecore_evas_extn_cb_free(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
867 if (ee->driver) _ecore_evas_free(ee);
871 _ecore_evas_extn_cb_key_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
873 Ecore_Evas *ee = data;
874 Evas_Event_Key_Down *ev = event_info;
877 extn = ee->engine.buffer.data;
879 if (extn->ipc.server)
881 Ipc_Data_Ev_Key_Down *ipc;
885 len = sizeof(Ipc_Data_Ev_Key_Down);
886 if (ev->key) len += strlen(ev->key) + 1;
887 if (ev->keyname) len += strlen(ev->keyname) + 1;
888 if (ev->string) len += strlen(ev->string) + 1;
889 if (ev->compose) len += strlen(ev->compose) + 1;
892 ipc = (Ipc_Data_Ev_Key_Down *)st;
894 p = st + sizeof(Ipc_Data_Ev_Key_Down);
898 ipc->key = p - (long)st;
903 strcpy(p, ev->keyname);
904 ipc->keyname = p - (long)st;
909 strcpy(p, ev->string);
910 ipc->string = p - (long)st;
915 strcpy(p, ev->compose);
916 ipc->compose = p - (long)st;
919 ipc->timestamp = ev->timestamp;
920 ipc->mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
921 ipc->event_flags = ev->event_flags;
922 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_KEY_DOWN, 0, 0, 0, ipc, len);
927 _ecore_evas_extn_cb_key_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
929 Ecore_Evas *ee = data;
930 Evas_Event_Key_Up *ev = event_info;
933 extn = ee->engine.buffer.data;
935 if (extn->ipc.server)
937 Ipc_Data_Ev_Key_Up *ipc;
941 len = sizeof(Ipc_Data_Ev_Key_Up);
942 if (ev->key) len += strlen(ev->key) + 1;
943 if (ev->keyname) len += strlen(ev->keyname) + 1;
944 if (ev->string) len += strlen(ev->string) + 1;
945 if (ev->compose) len += strlen(ev->compose) + 1;
948 ipc = (Ipc_Data_Ev_Key_Up *)st;
950 p = st + sizeof(Ipc_Data_Ev_Key_Down);
954 ipc->key = p - (long)st;
959 strcpy(p, ev->keyname);
960 ipc->keyname = p - (long)st;
965 strcpy(p, ev->string);
966 ipc->string = p - (long)st;
971 strcpy(p, ev->compose);
972 ipc->compose = p - (long)st;
975 ipc->timestamp = ev->timestamp;
976 ipc->mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
977 ipc->event_flags = ev->event_flags;
978 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_KEY_UP, 0, 0, 0, ipc, len);
983 _ecore_evas_extn_cb_hold(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
985 Ecore_Evas *ee = data;
986 Evas_Event_Hold *ev = event_info;
989 extn = ee->engine.buffer.data;
991 if (extn->ipc.server)
993 Ipc_Data_Ev_Hold ipc;
996 ipc.timestamp = ev->timestamp;
997 ipc.event_flags = ev->event_flags;
998 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_HOLD, 0, 0, 0, &ipc, sizeof(ipc));
1003 _ecore_evas_extn_cb_focus_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1009 ee->prop.focused = 1;
1010 extn = ee->engine.buffer.data;
1012 if (!extn->ipc.server) return;
1013 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_FOCUS, 0, 0, 0, NULL, 0);
1017 _ecore_evas_extn_cb_focus_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1023 ee->prop.focused = 0;
1024 extn = ee->engine.buffer.data;
1026 if (!extn->ipc.server) return;
1027 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_UNFOCUS, 0, 0, 0, NULL, 0);
1031 _ecore_evas_extn_cb_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1038 extn = ee->engine.buffer.data;
1040 if (!extn->ipc.server) return;
1041 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_SHOW, 0, 0, 0, NULL, 0);
1045 _ecore_evas_extn_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1052 extn = ee->engine.buffer.data;
1054 if (!extn->ipc.server) return;
1055 ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_HIDE, 0, 0, 0, NULL, 0);
1058 static const Ecore_Evas_Engine_Func _ecore_extn_plug_engine_func =
1060 _ecore_evas_extn_free,
1078 _ecore_evas_move_resize,
1115 NULL // screen_geometry_get
1119 _ipc_server_add(void *data, int type __UNUSED__, void *event)
1121 Ecore_Ipc_Event_Server_Add *e = event;
1122 Ecore_Evas *ee = data;
1125 if (ee != ecore_ipc_server_data_get(e->server))
1126 return ECORE_CALLBACK_PASS_ON;
1127 if (!eina_list_data_find(extn_ee_list, ee))
1128 return ECORE_CALLBACK_PASS_ON;
1129 extn = ee->engine.buffer.data;
1130 if (!extn) return ECORE_CALLBACK_PASS_ON;
1131 //FIXME: find a way to let app know server there
1132 return ECORE_CALLBACK_PASS_ON;
1136 _ipc_server_del(void *data, int type __UNUSED__, void *event)
1138 Ecore_Ipc_Event_Server_Del *e = event;
1139 Ecore_Evas *ee = data;
1142 extn = ee->engine.buffer.data;
1143 if (!extn) return ECORE_CALLBACK_PASS_ON;
1144 if (extn->ipc.server != e->server) return ECORE_CALLBACK_PASS_ON;
1145 evas_object_image_data_set(ee->engine.buffer.image, NULL);
1146 ee->engine.buffer.pixels = NULL;
1147 if (extn->file.shmfile)
1149 shmfile_close(extn->file.shmfile);
1150 extn->file.shmfile = NULL;
1154 eina_stringshare_del(extn->file.shm);
1155 extn->file.shm = NULL;
1157 extn->ipc.server = NULL;
1158 if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
1159 return ECORE_CALLBACK_PASS_ON;
1163 _ipc_server_data(void *data, int type __UNUSED__, void *event)
1165 Ecore_Ipc_Event_Server_Data *e = event;
1166 Ecore_Evas *ee = data;
1169 if (ee != ecore_ipc_server_data_get(e->server))
1170 return ECORE_CALLBACK_PASS_ON;
1171 if (!eina_list_data_find(extn_ee_list, ee))
1172 return ECORE_CALLBACK_PASS_ON;
1173 extn = ee->engine.buffer.data;
1174 if (!extn) return ECORE_CALLBACK_PASS_ON;
1175 if (e->major != MAJOR)
1176 return ECORE_CALLBACK_PASS_ON;
1180 // add rect to update list
1181 if (e->size >= (int)sizeof(Ipc_Data_Update))
1183 Ipc_Data_Update *ipc = malloc(sizeof(Ipc_Data_Update));
1186 memcpy(ipc, e->data, sizeof(Ipc_Data_Update));
1187 extn->file.updates = eina_list_append(extn->file.updates, ipc);
1191 case OP_UPDATE_DONE:
1192 // updates finished being sent - done now. frame ready
1194 Ipc_Data_Update *ipc;
1196 EINA_LIST_FREE(extn->file.updates, ipc)
1198 if (ee->engine.buffer.image)
1199 evas_object_image_data_update_add(ee->engine.buffer.image,
1206 if ((e->data) && (e->size > 0) &&
1207 (((unsigned char *)e->data)[e->size - 1] == 0))
1209 if (extn->file.lockfd) close(extn->file.lockfd);
1210 if (extn->file.lock) eina_stringshare_del(extn->file.lock);
1211 extn->file.lock = eina_stringshare_add(e->data);
1212 extn->file.lockfd = open(extn->file.lock, O_RDONLY);
1218 // e->response == alpha
1219 // e->data = shm ref string + nul byte
1220 if ((e->data) && ((unsigned char *)e->data)[e->size - 1] == 0)
1222 ee->engine.buffer.pixels = NULL;
1223 if (extn->file.shmfile)
1225 shmfile_close(extn->file.shmfile);
1226 extn->file.shmfile = NULL;
1230 eina_stringshare_del(extn->file.shm);
1231 extn->file.shm = NULL;
1233 if ((e->ref > 0) && (e->ref_to > 0))
1235 extn->file.w = e->ref;
1236 extn->file.h = e->ref_to;
1237 extn->file.shm = eina_stringshare_add(e->data);
1238 extn->file.shmfile = shmfile_open(extn->file.shm,
1242 if (extn->file.shmfile)
1244 ee->engine.buffer.pixels = extn->file.shmfile->addr;
1245 if (ee->engine.buffer.image)
1248 evas_object_image_alpha_set(ee->engine.buffer.image,
1251 evas_object_image_alpha_set(ee->engine.buffer.image,
1253 evas_object_image_size_set(ee->engine.buffer.image,
1256 evas_object_image_data_set(ee->engine.buffer.image,
1257 ee->engine.buffer.pixels);
1258 evas_object_image_data_update_add(ee->engine.buffer.image,
1262 _ecore_evas_resize(ee,
1267 evas_object_image_data_set(ee->engine.buffer.image, NULL);
1270 evas_object_image_data_set(ee->engine.buffer.image, NULL);
1273 evas_object_image_data_set(ee->engine.buffer.image, NULL);
1277 if ((e->data) && (e->size >= (int)sizeof(Ipc_Data_Resize)))
1279 Ipc_Data_Resize *ipc = e->data;
1280 _ecore_evas_resize(ee, ipc->w, ipc->h);
1286 return ECORE_CALLBACK_PASS_ON;
1290 _ecore_evas_extn_init(void)
1295 _ecore_evas_extn_shutdown(void)
1299 #endif /* BUILD_ECORE_EVAS_EXTN */
1302 ecore_evas_extn_plug_new(Ecore_Evas *ee_target)
1304 #ifdef BUILD_ECORE_EVAS_EXTN
1309 if (!ee_target) return NULL;
1311 ee = calloc(1, sizeof(Ecore_Evas));
1312 if (!ee) return NULL;
1314 o = evas_object_image_filled_add(ee_target->evas);
1315 evas_object_image_content_hint_set(o, EVAS_IMAGE_CONTENT_HINT_DYNAMIC);
1316 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
1317 evas_object_image_alpha_set(o, 1);
1318 evas_object_image_size_set(o, 1, 1);
1319 evas_object_image_data_set(o, &blank);
1321 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
1323 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_extn_plug_engine_func;
1325 ee->driver = "extn_plug";
1337 ee->prop.focused = 0;
1338 ee->prop.borderless = 1;
1339 ee->prop.override = 1;
1340 ee->prop.maximized = 0;
1341 ee->prop.fullscreen = 0;
1342 ee->prop.withdrawn = 0;
1343 ee->prop.sticky = 0;
1345 ee->engine.buffer.image = o;
1346 evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas", ee);
1347 evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas_Parent", ee_target);
1348 evas_object_event_callback_add(ee->engine.buffer.image,
1349 EVAS_CALLBACK_MOUSE_IN,
1350 _ecore_evas_extn_cb_mouse_in, ee);
1351 evas_object_event_callback_add(ee->engine.buffer.image,
1352 EVAS_CALLBACK_MOUSE_OUT,
1353 _ecore_evas_extn_cb_mouse_out, ee);
1354 evas_object_event_callback_add(ee->engine.buffer.image,
1355 EVAS_CALLBACK_MOUSE_DOWN,
1356 _ecore_evas_extn_cb_mouse_down, ee);
1357 evas_object_event_callback_add(ee->engine.buffer.image,
1358 EVAS_CALLBACK_MOUSE_UP,
1359 _ecore_evas_extn_cb_mouse_up, ee);
1360 evas_object_event_callback_add(ee->engine.buffer.image,
1361 EVAS_CALLBACK_MOUSE_MOVE,
1362 _ecore_evas_extn_cb_mouse_move, ee);
1363 evas_object_event_callback_add(ee->engine.buffer.image,
1364 EVAS_CALLBACK_MOUSE_WHEEL,
1365 _ecore_evas_extn_cb_mouse_wheel, ee);
1366 evas_object_event_callback_add(ee->engine.buffer.image,
1367 EVAS_CALLBACK_MULTI_DOWN,
1368 _ecore_evas_extn_cb_multi_down, ee);
1369 evas_object_event_callback_add(ee->engine.buffer.image,
1370 EVAS_CALLBACK_MULTI_UP,
1371 _ecore_evas_extn_cb_multi_up, ee);
1372 evas_object_event_callback_add(ee->engine.buffer.image,
1373 EVAS_CALLBACK_MULTI_MOVE,
1374 _ecore_evas_extn_cb_multi_move, ee);
1375 evas_object_event_callback_add(ee->engine.buffer.image,
1377 _ecore_evas_extn_cb_free, ee);
1378 evas_object_event_callback_add(ee->engine.buffer.image,
1379 EVAS_CALLBACK_KEY_DOWN,
1380 _ecore_evas_extn_cb_key_down, ee);
1381 evas_object_event_callback_add(ee->engine.buffer.image,
1382 EVAS_CALLBACK_KEY_UP,
1383 _ecore_evas_extn_cb_key_up, ee);
1384 evas_object_event_callback_add(ee->engine.buffer.image,
1386 _ecore_evas_extn_cb_hold, ee);
1387 evas_object_event_callback_add(ee->engine.buffer.image,
1388 EVAS_CALLBACK_FOCUS_IN,
1389 _ecore_evas_extn_cb_focus_in, ee);
1390 evas_object_event_callback_add(ee->engine.buffer.image,
1391 EVAS_CALLBACK_FOCUS_OUT,
1392 _ecore_evas_extn_cb_focus_out, ee);
1393 evas_object_event_callback_add(ee->engine.buffer.image,
1395 _ecore_evas_extn_cb_show, ee);
1396 evas_object_event_callback_add(ee->engine.buffer.image,
1398 _ecore_evas_extn_cb_hide, ee);
1400 evas_object_event_callback_add(ee->engine.buffer.image,
1402 _ecore_evas_extn_plug_image_obj_del, ee);
1405 extn_ee_list = eina_list_append(extn_ee_list, ee);
1406 ee_target->sub_ecore_evas = eina_list_append(ee_target->sub_ecore_evas, ee);
1408 evas_event_callback_add(ee_target->evas, EVAS_CALLBACK_RENDER_PRE,
1409 _ecore_evas_extn_plug_targer_render_pre, ee);
1410 evas_event_callback_add(ee_target->evas, EVAS_CALLBACK_RENDER_POST,
1411 _ecore_evas_extn_plug_targer_render_post, ee);
1419 ecore_evas_extn_plug_connect(Evas_Object *obj, const char *svcname, int svcnum, Eina_Bool svcsys)
1421 #ifdef BUILD_ECORE_EVAS_EXTN
1423 Ecore_Evas *ee = NULL;
1425 if (!obj) return EINA_FALSE;
1427 ee = evas_object_data_get(obj, "Ecore_Evas");
1428 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS)) return EINA_FALSE;
1430 extn = calloc(1, sizeof(Extn));
1431 if (!extn) return EINA_FALSE;
1433 Ecore_Ipc_Type ipctype = ECORE_IPC_LOCAL_USER;
1436 extn->svc.name = eina_stringshare_add(svcname);
1437 extn->svc.num = svcnum;
1438 extn->svc.sys = svcsys;
1440 if (extn->svc.sys) ipctype = ECORE_IPC_LOCAL_SYSTEM;
1441 extn->ipc.server = ecore_ipc_server_connect(ipctype, (char *)extn->svc.name,
1443 if (!extn->ipc.server)
1445 eina_stringshare_del(extn->svc.name);
1447 ecore_ipc_shutdown();
1450 ee->engine.buffer.data = extn;
1451 extn->ipc.handlers = eina_list_append
1452 (extn->ipc.handlers,
1453 ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD,
1454 _ipc_server_add, ee));
1455 extn->ipc.handlers = eina_list_append
1456 (extn->ipc.handlers,
1457 ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL,
1458 _ipc_server_del, ee));
1459 extn->ipc.handlers = eina_list_append
1460 (extn->ipc.handlers,
1461 ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DATA,
1462 _ipc_server_data, ee));
1470 ecore_evas_extn_plug_object_data_lock(Evas_Object *obj)
1472 #ifdef BUILD_ECORE_EVAS_EXTN
1475 ee = ecore_evas_object_ecore_evas_get(obj);
1477 _ecore_evas_socket_lock(ee);
1482 ecore_evas_extn_plug_object_data_unlock(Evas_Object *obj)
1484 #ifdef BUILD_ECORE_EVAS_EXTN
1487 ee = ecore_evas_object_ecore_evas_get(obj);
1489 _ecore_evas_socket_unlock(ee);
1493 #ifdef BUILD_ECORE_EVAS_EXTN
1495 _ecore_evas_socket_resize(Ecore_Evas *ee, int w, int h)
1498 Evas_Engine_Info_Buffer *einfo;
1505 if ((w == ee->w) && (h == ee->h)) return;
1508 evas_output_size_set(ee->evas, ee->w, ee->h);
1509 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1510 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1511 extn = ee->engine.buffer.data;
1514 if (extn->file.shmfile)
1515 shmfile_free(extn->file.shmfile);
1516 ee->engine.buffer.pixels = NULL;
1517 extn->file.shmfile = shmfile_new(extn->svc.name, extn->svc.num,
1518 ee->w * ee->h * 4, extn->svc.sys);
1519 if (extn->file.shmfile)
1520 ee->engine.buffer.pixels = extn->file.shmfile->addr;
1523 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
1527 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
1529 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
1530 einfo->info.dest_buffer = ee->engine.buffer.pixels;
1531 einfo->info.dest_buffer_row_bytes = stride;
1532 einfo->info.use_color_key = 0;
1533 einfo->info.alpha_threshold = 0;
1534 einfo->info.func.new_update_region = NULL;
1535 einfo->info.func.free_update_region = NULL;
1536 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1538 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1542 if (extn->ipc.clients && extn->file.shmfile)
1544 Ipc_Data_Resize ipc;
1546 Ecore_Ipc_Client *client;
1548 EINA_LIST_FOREACH(extn->ipc.clients, l, client)
1549 ecore_ipc_client_send(client, MAJOR, OP_SHM_REF,
1550 ee->w, ee->h, ee->alpha,
1551 extn->file.shmfile->file,
1552 strlen(extn->file.shmfile->file) + 1);
1555 EINA_LIST_FOREACH(extn->ipc.clients, l, client)
1556 ecore_ipc_client_send(client, MAJOR, OP_RESIZE,
1557 0, 0, 0, &ipc, sizeof(ipc));
1560 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1564 _ecore_evas_socket_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int w, int h)
1566 _ecore_evas_socket_resize(ee, w, h);
1570 _ecore_evas_extn_socket_render(Ecore_Evas *ee)
1572 Eina_List *updates = NULL, *l, *ll;
1577 Ecore_Ipc_Client *client;
1579 extn = ee->engine.buffer.data;
1580 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
1582 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
1583 if (ee2->engine.func->fn_render)
1584 rend |= ee2->engine.func->fn_render(ee2);
1585 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
1587 if (ee->engine.buffer.pixels)
1589 _ecore_evas_socket_lock(ee);
1590 updates = evas_render_updates(ee->evas);
1591 _ecore_evas_socket_unlock(ee);
1593 EINA_LIST_FOREACH(updates, l, r)
1595 Ipc_Data_Update ipc;
1602 EINA_LIST_FOREACH(extn->ipc.clients, ll, client)
1603 ecore_ipc_client_send(client, MAJOR, OP_UPDATE, 0, 0, 0, &ipc, sizeof(ipc));
1607 evas_render_updates_free(updates);
1608 _ecore_evas_idle_timeout_update(ee);
1609 EINA_LIST_FOREACH(extn->ipc.clients, ll, client)
1610 ecore_ipc_client_send(client, MAJOR, OP_UPDATE_DONE, 0, 0, 0, NULL, 0);
1613 return updates ? 1 : rend;
1617 _ipc_client_add(void *data, int type __UNUSED__, void *event)
1619 Ecore_Ipc_Event_Client_Add *e = event;
1620 Ecore_Evas *ee = data;
1623 if (ee != ecore_ipc_server_data_get(ecore_ipc_client_server_get(e->client)))
1624 return ECORE_CALLBACK_PASS_ON;
1625 if (!eina_list_data_find(extn_ee_list, ee))
1626 return ECORE_CALLBACK_PASS_ON;
1627 extn = ee->engine.buffer.data;
1628 if (!extn) return ECORE_CALLBACK_PASS_ON;
1630 extn->ipc.clients = eina_list_append(extn->ipc.clients, e->client);
1631 ecore_ipc_client_send(e->client, MAJOR, OP_LOCK_FILE, 0, 0, 0, extn->file.lock, strlen(extn->file.lock) + 1);
1633 if (extn->file.shmfile)
1635 Ipc_Data_Resize ipc;
1637 ecore_ipc_client_send(e->client, MAJOR, OP_SHM_REF,
1638 ee->w, ee->h, ee->alpha,
1639 extn->file.shmfile->file,
1640 strlen(extn->file.shmfile->file) + 1);
1644 ecore_ipc_client_send(e->client, MAJOR, OP_RESIZE,
1645 0, 0, 0, &ipc, sizeof(ipc));
1647 _ecore_evas_extn_event(ee, ECORE_EVAS_EXTN_CLIENT_ADD);
1648 return ECORE_CALLBACK_PASS_ON;
1652 _ipc_client_del(void *data, int type __UNUSED__, void *event)
1654 Ecore_Ipc_Event_Client_Del *e = event;
1655 Ecore_Evas *ee = data;
1657 extn = ee->engine.buffer.data;
1658 if (!extn) return ECORE_CALLBACK_PASS_ON;
1659 if (!eina_list_data_find(extn->ipc.clients, e->client)) return ECORE_CALLBACK_PASS_ON;
1661 extn->ipc.clients = eina_list_remove(extn->ipc.clients, e->client);
1663 _ecore_evas_extn_event(ee, ECORE_EVAS_EXTN_CLIENT_DEL);
1664 return ECORE_CALLBACK_PASS_ON;
1668 _ipc_client_data(void *data, int type __UNUSED__, void *event)
1670 Ecore_Ipc_Event_Client_Data *e = event;
1671 Ecore_Evas *ee = data;
1674 if (ee != ecore_ipc_server_data_get(ecore_ipc_client_server_get(e->client)))
1675 return ECORE_CALLBACK_PASS_ON;
1676 if (!eina_list_data_find(extn_ee_list, ee))
1677 return ECORE_CALLBACK_PASS_ON;
1678 extn = ee->engine.buffer.data;
1679 if (!extn) return ECORE_CALLBACK_PASS_ON;
1680 if (e->major != MAJOR)
1681 return ECORE_CALLBACK_PASS_ON;
1685 if ((e->data) && (e->size >= (int)sizeof(Ipc_Data_Resize)))
1688 Ipc_Data_Resize *ipc = e->data;
1689 /* create callbacke data size changed */
1690 _ecore_evas_socket_resize(ee, ipc->w, ipc->h);
1697 if (ee->func.fn_show) ee->func.fn_show(ee);
1704 if (ee->func.fn_hide) ee->func.fn_hide(ee);
1708 if (!ee->prop.focused)
1710 ee->prop.focused = 1;
1711 evas_focus_in(ee->evas);
1712 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
1716 if (ee->prop.focused)
1718 ee->prop.focused = 0;
1719 evas_focus_out(ee->evas);
1720 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
1723 case OP_EV_MOUSE_IN:
1724 if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_In))
1726 Ipc_Data_Ev_Mouse_In *ipc = e->data;
1727 Evas_Event_Flags flags;
1729 flags = evas_event_default_flags_get(ee->evas);
1730 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1731 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1732 evas_event_feed_mouse_in(ee->evas, ipc->timestamp, NULL);
1733 evas_event_default_flags_set(ee->evas, flags);
1736 case OP_EV_MOUSE_OUT:
1737 if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Out))
1739 Ipc_Data_Ev_Mouse_Out *ipc = e->data;
1740 Evas_Event_Flags flags;
1742 flags = evas_event_default_flags_get(ee->evas);
1743 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1744 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1745 evas_event_feed_mouse_out(ee->evas, ipc->timestamp, NULL);
1746 evas_event_default_flags_set(ee->evas, flags);
1749 case OP_EV_MOUSE_UP:
1750 if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Up))
1752 Ipc_Data_Ev_Mouse_Up *ipc = e->data;
1753 Evas_Event_Flags flags;
1755 flags = evas_event_default_flags_get(ee->evas);
1756 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1757 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1758 evas_event_feed_mouse_up(ee->evas, ipc->b, ipc->flags, ipc->timestamp, NULL);
1759 evas_event_default_flags_set(ee->evas, flags);
1762 case OP_EV_MOUSE_DOWN:
1763 if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Down))
1765 Ipc_Data_Ev_Mouse_Up *ipc = e->data;
1766 Evas_Event_Flags flags;
1768 flags = evas_event_default_flags_get(ee->evas);
1769 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1770 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1771 evas_event_feed_mouse_down(ee->evas, ipc->b, ipc->flags, ipc->timestamp, NULL);
1772 evas_event_default_flags_set(ee->evas, flags);
1775 case OP_EV_MOUSE_MOVE:
1776 if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Move))
1778 Ipc_Data_Ev_Mouse_Move *ipc = e->data;
1779 Evas_Event_Flags flags;
1781 flags = evas_event_default_flags_get(ee->evas);
1782 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1783 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1784 evas_event_feed_mouse_move(ee->evas, ipc->x, ipc->y, ipc->timestamp, NULL);
1785 evas_event_default_flags_set(ee->evas, flags);
1788 case OP_EV_MOUSE_WHEEL:
1789 if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Wheel))
1791 Ipc_Data_Ev_Mouse_Wheel *ipc = e->data;
1792 Evas_Event_Flags flags;
1794 flags = evas_event_default_flags_get(ee->evas);
1795 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1796 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1797 evas_event_feed_mouse_wheel(ee->evas, ipc->direction, ipc->z, ipc->timestamp, NULL);
1798 evas_event_default_flags_set(ee->evas, flags);
1801 case OP_EV_MULTI_UP:
1802 if (e->size >= (int)sizeof(Ipc_Data_Ev_Multi_Up))
1804 Ipc_Data_Ev_Multi_Up *ipc = e->data;
1805 Evas_Event_Flags flags;
1807 flags = evas_event_default_flags_get(ee->evas);
1808 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1809 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1810 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);
1811 evas_event_default_flags_set(ee->evas, flags);
1814 case OP_EV_MULTI_DOWN:
1815 if (e->size >= (int)sizeof(Ipc_Data_Ev_Multi_Down))
1817 Ipc_Data_Ev_Multi_Down *ipc = e->data;
1818 Evas_Event_Flags flags;
1820 flags = evas_event_default_flags_get(ee->evas);
1821 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1822 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1823 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);
1824 evas_event_default_flags_set(ee->evas, flags);
1827 case OP_EV_MULTI_MOVE:
1828 if (e->size >= (int)sizeof(Ipc_Data_Ev_Multi_Move))
1830 Ipc_Data_Ev_Multi_Move *ipc = e->data;
1831 Evas_Event_Flags flags;
1833 flags = evas_event_default_flags_get(ee->evas);
1834 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1835 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1836 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);
1837 evas_event_default_flags_set(ee->evas, flags);
1841 #define STRGET(val) \
1843 if ((ipc->val) && (ipc->val < (char *)(long)(e->size - 1))) \
1844 ipc->val = ((char *)ipc) + (long)ipc->val; \
1850 if (e->size >= (int)sizeof(Ipc_Data_Ev_Key_Up))
1852 if ((e->data) && (e->size > 0) &&
1853 (((unsigned char *)e->data)[e->size - 1] == 0))
1855 Ipc_Data_Ev_Key_Up *ipc = e->data;
1856 Evas_Event_Flags flags;
1862 flags = evas_event_default_flags_get(ee->evas);
1863 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1864 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1865 evas_event_feed_key_up(ee->evas, ipc->keyname, ipc->key, ipc->string, ipc->compose, ipc->timestamp, NULL);
1866 evas_event_default_flags_set(ee->evas, flags);
1870 case OP_EV_KEY_DOWN:
1871 if (e->size >= (int)sizeof(Ipc_Data_Ev_Key_Down))
1873 if ((e->data) && (e->size > 0) &&
1874 (((unsigned char *)e->data)[e->size - 1] == 0))
1876 Ipc_Data_Ev_Key_Down *ipc = e->data;
1877 Evas_Event_Flags flags;
1883 flags = evas_event_default_flags_get(ee->evas);
1884 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1885 _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
1886 evas_event_feed_key_down(ee->evas, ipc->keyname, ipc->key, ipc->string, ipc->compose, ipc->timestamp, NULL);
1887 evas_event_default_flags_set(ee->evas, flags);
1892 if (e->size >= (int)sizeof(Ipc_Data_Ev_Hold))
1894 Ipc_Data_Ev_Hold *ipc = e->data;
1895 Evas_Event_Flags flags;
1897 flags = evas_event_default_flags_get(ee->evas);
1898 evas_event_default_flags_set(ee->evas, ipc->event_flags);
1899 evas_event_feed_hold(ee->evas, ipc->hold, ipc->timestamp, NULL);
1900 evas_event_default_flags_set(ee->evas, flags);
1906 return ECORE_CALLBACK_PASS_ON;
1910 _ecore_evas_extn_socket_alpha_set(Ecore_Evas *ee, int alpha)
1914 Ecore_Ipc_Client *client;
1916 if (((ee->alpha) && (alpha)) || ((!ee->alpha) && (!alpha))) return;
1919 extn = ee->engine.buffer.data;
1922 Evas_Engine_Info_Buffer *einfo;
1924 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
1928 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
1930 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
1931 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
1932 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1934 EINA_LIST_FOREACH(extn->ipc.clients, l, client)
1935 ecore_ipc_client_send(client, MAJOR, OP_SHM_REF,
1936 ee->w, ee->h, ee->alpha,
1937 extn->file.shmfile->file,
1938 strlen(extn->file.shmfile->file) + 1);
1942 static const Ecore_Evas_Engine_Func _ecore_extn_socket_engine_func =
1944 _ecore_evas_extn_free,
1961 _ecore_evas_socket_resize,
1962 _ecore_evas_socket_move_resize,
1988 _ecore_evas_extn_socket_alpha_set,
1998 _ecore_evas_extn_socket_render, // render
1999 NULL // screen_geometry_get
2005 ecore_evas_extn_socket_new(int w, int h)
2007 #ifdef BUILD_ECORE_EVAS_EXTN
2008 Evas_Engine_Info_Buffer *einfo;
2012 rmethod = evas_render_method_lookup("buffer");
2013 if (!rmethod) return NULL;
2014 ee = calloc(1, sizeof(Ecore_Evas));
2015 if (!ee) return NULL;
2017 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
2019 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_extn_socket_engine_func;
2021 ee->driver = "extn_socket";
2033 ee->prop.focused = 0;
2034 ee->prop.borderless = 1;
2035 ee->prop.override = 1;
2036 ee->prop.maximized = 0;
2037 ee->prop.fullscreen = 0;
2038 ee->prop.withdrawn = 0;
2039 ee->prop.sticky = 0;
2041 /* init evas here */
2042 ee->evas = evas_new();
2043 evas_data_attach_set(ee->evas, ee);
2044 evas_output_method_set(ee->evas, rmethod);
2045 evas_output_size_set(ee->evas, w, h);
2046 evas_output_viewport_set(ee->evas, 0, 0, w, h);
2048 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
2052 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
2054 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
2055 einfo->info.dest_buffer = NULL;
2056 einfo->info.dest_buffer_row_bytes = 0;
2057 einfo->info.use_color_key = 0;
2058 einfo->info.alpha_threshold = 0;
2059 einfo->info.func.new_update_region = NULL;
2060 einfo->info.func.free_update_region = NULL;
2061 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2063 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2064 ecore_evas_free(ee);
2070 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
2071 ecore_evas_free(ee);
2074 evas_key_modifier_add(ee->evas, "Shift");
2075 evas_key_modifier_add(ee->evas, "Control");
2076 evas_key_modifier_add(ee->evas, "Alt");
2077 evas_key_modifier_add(ee->evas, "Meta");
2078 evas_key_modifier_add(ee->evas, "Hyper");
2079 evas_key_modifier_add(ee->evas, "Super");
2080 evas_key_lock_add(ee->evas, "Caps_Lock");
2081 evas_key_lock_add(ee->evas, "Num_Lock");
2082 evas_key_lock_add(ee->evas, "Scroll_Lock");
2084 extn_ee_list = eina_list_append(extn_ee_list, ee);
2086 _ecore_evas_register(ee);
2095 ecore_evas_extn_socket_listen(Ecore_Evas *ee, const char *svcname, int svcnum, Eina_Bool svcsys)
2097 #ifdef BUILD_ECORE_EVAS_EXTN
2100 extn = calloc(1, sizeof(Extn));
2107 Ecore_Ipc_Type ipctype = ECORE_IPC_LOCAL_USER;
2111 extn->svc.name = eina_stringshare_add(svcname);
2112 extn->svc.num = svcnum;
2113 extn->svc.sys = svcsys;
2115 snprintf(buf, sizeof(buf), "/tmp/ee-lock-XXXXXX");
2116 extn->file.lockfd = mkstemp(buf);
2117 if (extn->file.lockfd >= 0)
2118 extn->file.lock = eina_stringshare_add(buf);
2119 if ((extn->file.lockfd < 0) || (!extn->file.lock))
2121 if (extn->file.lockfd)
2123 close(extn->file.lockfd);
2126 eina_stringshare_del(extn->svc.name);
2127 if (extn->file.lock) eina_stringshare_del(extn->file.lock);
2129 ecore_ipc_shutdown();
2133 if (extn->svc.sys) ipctype = ECORE_IPC_LOCAL_SYSTEM;
2134 extn->ipc.am_server = EINA_TRUE;
2135 extn->ipc.server = ecore_ipc_server_add(ipctype,
2136 (char *)extn->svc.name,
2138 if (!extn->ipc.server)
2140 if (extn->file.lockfd)
2142 close(extn->file.lockfd);
2143 if (extn->file.lock) unlink(extn->file.lock);
2145 eina_stringshare_del(extn->svc.name);
2146 eina_stringshare_del(extn->file.lock);
2148 ecore_ipc_shutdown();
2151 ee->engine.buffer.data = extn;
2152 extn->ipc.handlers = eina_list_append
2153 (extn->ipc.handlers,
2154 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD,
2155 _ipc_client_add, ee));
2156 extn->ipc.handlers = eina_list_append
2157 (extn->ipc.handlers,
2158 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL,
2159 _ipc_client_del, ee));
2160 extn->ipc.handlers = eina_list_append
2161 (extn->ipc.handlers,
2162 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA,
2163 _ipc_client_data, ee));