1 /**
2 * Ecore example illustrating the basics of ecore evas extn socket usage.
3 *
4 * You'll need at least one Evas engine built for it (excluding the
5 * buffer one). See stdout/stderr for output.
6 * You can check functions of ecore extn socket if you use ecore extn plug together.
7 *
8 * @verbatim
9 * gcc -o ecore_evas_extn_socket_example ecore_evas_extn_socket_example.c `pkg-config --libs --cflags evas ecore ecore-evas`
10 * @endverbatim
11 */
12
13 #ifdef HAVE_CONFIG_H
14 #include "config.h"
15 #else
16 #define EINA_UNUSED
17 #endif
18
19 #include <Ecore.h>
20 #include <Ecore_Evas.h>
21 #include <unistd.h>
22
23 // protocol version - change this as needed
24 #define MSG_DOMAIN_CONTROL_OBJECT 0x1004
25 #define MSG_ID_BG_COLOR 0x1005
26 #define MSG_ID_TEXT 0x1006
27 static int num = 0;
28 typedef struct _Msg_Color Msg_Color;
29
30 struct _Msg_Color
31 {
32 int r;
33 int g;
34 int b;
35 int a;
36 };
37
38 static void
_on_delete(Ecore_Evas * ee)39 _on_delete(Ecore_Evas *ee)
40 {
41 Ecore_Evas *ee_socket = NULL;
42 char *text = NULL;
43 ee_socket = ecore_evas_data_get(ee, "sock");
44 if (ee_socket)
45 {
46 text = ecore_evas_data_get(ee_socket, "text");
47 if (text) free(text);
48 }
49 ecore_main_loop_quit();
50 }
51
52 static void
_ecore_evas_msg_parent_handle(Ecore_Evas * ee,int msg_domain,int msg_id,void * data,int size)53 _ecore_evas_msg_parent_handle(Ecore_Evas *ee, int msg_domain, int msg_id, void *data, int size)
54 {
55 printf("Receive msg from clien msg_domain=%x msg_id=%x size=%d\n", msg_domain, msg_id, size);
56 if (!data) return;
57
58 if (msg_domain == MSG_DOMAIN_CONTROL_OBJECT)
59 {
60 if (msg_id == MSG_ID_BG_COLOR)
61 {
62 Evas_Object *bg = NULL;
63 Msg_Color *color = NULL;
64 int r = 0, g = 0, b = 0, a = 0;
65
66 bg = ecore_evas_data_get(ee, "bg");
67 if (bg && (size == sizeof(Msg_Color)))
68 {
69 color = data;
70 r = color->r;
71 g = color->g;
72 b = color->b;
73 a = color->a;
74 printf("Receive msg is color r=%x g=%x b=%x a=%x\n", r, g, b, a);
75 evas_object_color_set(bg, color->r, color->g, color->b, color->a);
76 }
77 }
78 }
79 }
80
81 static void
_mouse_up(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)82 _mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
83 {
84 Ecore_Evas *ee = data;
85 size_t len = 0;
86 char *buf = NULL;
87
88 num++;
89
90 if (!ee) return;
91 buf = ecore_evas_data_get(ee, "text");
92 if (!buf) free(buf);
93
94 buf = (char *)malloc(40);
95 memset(buf, 0, 40);
96 sprintf(buf, "Hello. I'm server!! number=%d!!", num);
97 len = strlen(buf);
98 ecore_evas_data_set(ee, "text", buf);
99
100 printf("ecore extn socket txt = \"%s\" len=%zu.", buf, len);
101 ecore_evas_msg_send(ee, MSG_DOMAIN_CONTROL_OBJECT, MSG_ID_TEXT, buf, len);
102 }
103
104 int
main(void)105 main(void)
106 {
107 Ecore_Evas *ee;
108 Ecore_Evas *ee_socket = NULL;
109 Evas *canvas;
110 Evas_Object *bg, *text;
111 Evas_Object *sock_bg;
112 int w, h;
113 int socket_w, socket_h;
114
115 if (ecore_evas_init() <= 0)
116 return 1;
117
118 w = 480;
119 h = 200;
120
121 ee = ecore_evas_new(NULL, 0, 0, w, h, NULL);
122 ecore_evas_title_set(ee, "Ecore Evas Extn Socket Example");
123 ecore_evas_show(ee);
124
125 ecore_evas_callback_delete_request_set(ee, _on_delete);
126
127 printf("Using %s engine! ee=%p\n", ecore_evas_engine_name_get(ee), ee);
128
129 //create ecore evas to show info
130 canvas = ecore_evas_get(ee);
131 if (ecore_evas_ecore_evas_get(canvas) == ee)
132 printf("Everything is sane!\n");
133
134 bg = evas_object_rectangle_add(canvas);
135 evas_object_color_set(bg, 255, 255, 0, 255);
136 evas_object_resize(bg, w, h);
137 evas_object_show(bg);
138
139 text = evas_object_text_add(canvas);
140 evas_object_color_set(text, 0, 0, 0, 255);
141 evas_object_text_style_set(text, EVAS_TEXT_STYLE_PLAIN);
142 evas_object_text_font_set(text, "Sans", 15);
143 evas_object_text_text_set(text, "1. Run ecore_evas_extn_plug_examples!!");
144 evas_object_move(text, 40, 30);
145 evas_object_show(text);
146
147 text = evas_object_text_add(canvas);
148 evas_object_color_set(text, 0, 0, 0, 255);
149 evas_object_text_style_set(text, EVAS_TEXT_STYLE_PLAIN);
150 evas_object_text_font_set(text, "Sans", 15);
151 evas_object_text_text_set(text, "2. Press green rect to send msg to clients!!");
152 evas_object_move(text, 40, 60);
153 evas_object_show(text);
154
155 bg = evas_object_rectangle_add(canvas);
156 evas_object_color_set(bg, 0, 255, 0, 255);
157 evas_object_resize(bg, w/4, h/4);
158 evas_object_move(bg, w/4, h/2);
159 evas_object_show(bg);
160
161 //create ecore evas extn socket
162 socket_w = 460;
163 socket_h = 250;
164
165 ee_socket = ecore_evas_extn_socket_new(1, 1);
166 ecore_evas_data_set(ee, "sock", ee_socket);
167
168 if (!ee_socket)
169 {
170 printf("Fail to create ecore extn socket!\n");
171 return 0;
172 }
173
174 if(!ecore_evas_extn_socket_listen(ee_socket, "socket_exam_service", 0, EINA_FALSE))
175 {
176 printf("Fail to listen socket_exam_service!\n");
177 return 0;
178 }
179 ecore_evas_resize(ee_socket, socket_w, socket_h);
180 ecore_evas_show(ee_socket);
181
182 //callback to deal with cient extn's message
183 ecore_evas_callback_msg_parent_handle_set(ee_socket, _ecore_evas_msg_parent_handle);
184 //_mouse_up is function to send msg to client extn plug
185 evas_object_event_callback_add(bg, EVAS_CALLBACK_MOUSE_UP, _mouse_up, ee_socket);
186
187 canvas = ecore_evas_get(ee_socket);
188
189 sock_bg = evas_object_rectangle_add(canvas);
190 evas_object_color_set(sock_bg, 0, 0, 255, 255);
191 evas_object_resize(sock_bg, socket_w, socket_h);
192 evas_object_move(sock_bg, 0, 0);
193 evas_object_show(sock_bg);
194 ecore_evas_data_set(ee_socket, "bg", sock_bg);
195
196 ecore_evas_extn_socket_events_block_set(ee_socket, EINA_FALSE);
197
198 ecore_main_loop_begin();
199
200 ecore_evas_free(ee);
201 ecore_evas_shutdown();
202
203 return 0;
204 }
205