7f2af92ea245aff2c2b7e7285c0f328306abc319
[framework/uifw/ecore.git] / src / examples / ecore_evas_ews_example.c
1 /**
2  * Ecore example illustrating the ews of ecore evas 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  *
7  * @verbatim
8  * gcc -o ecore_evas_ews_example ecore_evas_ews_example.c `pkg-config --libs --cflags ecore-evas`
9  * @endverbatim
10  */
11
12 #include <Ecore.h>
13 #include <Ecore_Evas.h>
14 #include <unistd.h>
15 #include <stdio.h>
16 #include <ctype.h>
17
18 static Eina_Bool
19 _wm_win_add(void *data, int type, void *event_info)
20 {
21    Ecore_Evas *ee = event_info;
22    printf("WM: new window=%p\n", ee);
23    return EINA_TRUE;
24 }
25
26 static Eina_Bool
27 _wm_win_move(void *data, int type, void *event_info)
28 {
29    Ecore_Evas *ee = event_info;
30    int x, y;
31    ecore_evas_geometry_get(ee, &x, &y, NULL, NULL);
32    printf("WM: window=%p moved to %d,%d\n", ee, x, y);
33    return EINA_TRUE;
34 }
35
36 static Eina_Bool
37 _wm_win_resize(void *data, int type, void *event_info)
38 {
39    Ecore_Evas *ee = event_info;
40    int w, h;
41    ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
42    printf("WM: window=%p resized to %dx%d\n", ee, w, h);
43    return EINA_TRUE;
44 }
45
46 static Eina_Bool
47 _wm_win_show(void *data, int type, void *event_info)
48 {
49    Ecore_Evas *ee = event_info;
50    printf("WM: show window=%p\n", ee);
51    return EINA_TRUE;
52 }
53
54 static void
55 optional_ews_window_manager_setup(void)
56 {
57    ecore_event_handler_add(ECORE_EVAS_EWS_EVENT_ADD, _wm_win_add, NULL);
58    ecore_event_handler_add(ECORE_EVAS_EWS_EVENT_MOVE, _wm_win_move, NULL);
59    ecore_event_handler_add(ECORE_EVAS_EWS_EVENT_RESIZE, _wm_win_resize, NULL);
60    ecore_event_handler_add(ECORE_EVAS_EWS_EVENT_SHOW, _wm_win_show, NULL);
61
62    /* one may use any known unique identifier, like an app function pointer */
63    ecore_evas_ews_manager_set(optional_ews_window_manager_setup);
64 }
65
66 static void
67 optional_ews_setup(void)
68 {
69    Evas_Object *bg;
70    Evas *e;
71
72    ecore_evas_ews_setup(0, 0, 800, 600); /* "screen" size */
73    e = ecore_evas_ews_evas_get(); /* forces "screen" to be allocated */
74
75    bg = evas_object_rectangle_add(e);
76    evas_object_color_set(bg, 128, 32, 32, 255);
77    ecore_evas_ews_background_set(bg);
78 }
79
80 static Eina_Bool
81 _stdin_cb(void *data, Ecore_Fd_Handler *handler)
82 {
83    const Eina_List *l;
84    Ecore_Evas *ee;
85    char c = getchar();
86
87    if (c == EOF)
88      {
89         ecore_main_loop_quit();
90         return EINA_FALSE;
91      }
92
93    switch (c) {
94     case 'h':
95        printf("hide all windows\n");
96        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
97          ecore_evas_hide(ee);
98        break;
99     case 's':
100        printf("show all windows\n");
101        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
102          ecore_evas_show(ee);
103        break;
104     case 'l':
105        printf("move all windows left\n");
106        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
107          {
108             int x, y;
109             ecore_evas_geometry_get(ee, &x, &y, NULL, NULL);
110             ecore_evas_move(ee, x - 10, y);
111          }
112        break;
113     case 'r':
114        printf("move all windows right\n");
115        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
116          {
117             int x, y;
118             ecore_evas_geometry_get(ee, &x, &y, NULL, NULL);
119             ecore_evas_move(ee, x + 10, y);
120          }
121        break;
122     case 't':
123        printf("move all windows top\n");
124        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
125          {
126             int x, y;
127             ecore_evas_geometry_get(ee, &x, &y, NULL, NULL);
128             ecore_evas_move(ee, x, y - 10);
129          }
130        break;
131     case 'b':
132        printf("move all windows bottom\n");
133        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
134          {
135             int x, y;
136             ecore_evas_geometry_get(ee, &x, &y, NULL, NULL);
137             ecore_evas_move(ee, x, y + 10);
138          }
139        break;
140     case 'S':
141        printf("make all windows smaller\n");
142        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
143          {
144             int w, h;
145             ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
146             ecore_evas_resize(ee, w - 10, h - 10);
147          }
148        break;
149     case 'B':
150        printf("make all windows bigger\n");
151        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
152          {
153             int w, h;
154             ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
155             ecore_evas_resize(ee, w + 10, h + 10);
156          }
157        break;
158     case 'm':
159        printf("make all windows unmaximized\n");
160        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
161             ecore_evas_maximized_set(ee, EINA_FALSE);
162        break;
163     case 'M':
164        printf("make all windows maximized\n");
165        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
166             ecore_evas_maximized_set(ee, EINA_TRUE);
167        break;
168     case 'i':
169        printf("make all windows uniconified\n");
170        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
171             ecore_evas_iconified_set(ee, EINA_FALSE);
172        break;
173     case 'I':
174        printf("make all windows iconified\n");
175        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
176             ecore_evas_iconified_set(ee, EINA_TRUE);
177        break;
178     case 'f':
179        printf("make all windows unfullscreen\n");
180        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
181             ecore_evas_fullscreen_set(ee, EINA_FALSE);
182        break;
183     case 'F':
184        printf("make all windows fullscreen\n");
185        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
186             ecore_evas_fullscreen_set(ee, EINA_TRUE);
187        break;
188     case 'q':
189        printf("quit\n");
190        ecore_main_loop_quit();
191        break;
192     default:
193        if (!isspace(c))
194          printf("Unknown command: %c\n", c);
195    }
196    return ECORE_CALLBACK_RENEW;
197 }
198
199 static void
200 _on_delete(Ecore_Evas *ee)
201 {
202    free(ecore_evas_data_get(ee, "key"));
203    ecore_main_loop_quit();
204 }
205
206 int
207 main(void)
208 {
209    Ecore_Evas *ee;
210    Evas *canvas;
211    Evas_Object *bg;
212
213    if (ecore_evas_init() <= 0)
214       return 1;
215
216    optional_ews_setup();
217    optional_ews_window_manager_setup();
218
219    /* everything should look similar to ecore_evas_basic_example */
220    ee = ecore_evas_ews_new(0, 0, 200, 200);
221    ecore_evas_title_set(ee, "Ecore Evas EWS Example");
222    ecore_evas_show(ee);
223
224    ecore_evas_data_set(ee, "key", strdup("hello"));
225    ecore_evas_callback_delete_request_set(ee, _on_delete);
226
227    printf("Using %s engine!\n", ecore_evas_engine_name_get(ee));
228
229    canvas = ecore_evas_get(ee);
230    if (ecore_evas_ecore_evas_get(canvas) == ee)
231       printf("Everything is sane!\n");
232
233    bg = evas_object_rectangle_add(canvas);
234    evas_object_color_set(bg, 0, 0, 255, 255);
235    evas_object_resize(bg, 200, 200);
236    evas_object_show(bg);
237    ecore_evas_object_associate(ee, bg, ECORE_EVAS_OBJECT_ASSOCIATE_BASE);
238
239    /* moving the window should move it in the screen */
240    ecore_evas_move(ee, 50, 50);
241
242    ecore_main_fd_handler_add(STDIN_FILENO,
243               ECORE_FD_READ | ECORE_FD_ERROR,
244               _stdin_cb,
245               NULL, NULL, NULL);
246
247    ecore_main_loop_begin();
248
249    ecore_evas_free(ee);
250    ecore_evas_shutdown();
251
252    return 0;
253 }