2 * Copyright © 2012 Intel Corporation
3 * Copyright © 2013 TOYOTA MOTOR CORPORATION
5 * Permission to use, copy, modify, distribute, and sell this software and its
6 * documentation for any purpose is hereby granted without fee, provided that
7 * the above copyright notice appear in all copies and that both that copyright
8 * notice and this permission notice appear in supporting documentation, and
9 * that the name of the copyright holders not be used in advertising or
10 * publicity pertaining to distribution of the software without specific,
11 * written prior permission. The copyright holders make no representations
12 * about the suitability of this software for any purpose. It is provided "as
13 * is" without express or implied warranty.
15 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
17 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
18 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
19 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
20 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
24 * @brief HomeScreen for unit test of Weston(Wayland) IVI plugins
36 #include <sys/ioctl.h>
40 #include <sys/types.h>
45 #include <linux/input.h>
46 #include <wayland-client.h>
47 #include "ico_window_mgr-client-protocol.h"
48 #include "ico_input_mgr-client-protocol.h"
49 #include "ico_input_mgr.h"
50 #include "test-common.h"
53 #define SHM_SIZE (16*1024*1024)
54 #define MAX_CON_NAME 127
58 struct surface_name *next;
61 char appid[MAX_APPID];
71 struct wl_display *display;
72 struct wl_registry *registry;
73 struct wl_compositor *compositor;
74 struct wl_shell *shell;
75 struct ico_window_mgr *ico_window_mgr;
76 struct ico_input_mgr_control *ico_input_mgr;
77 struct ico_input_mgr_device *ico_input_device;
78 struct ico_exinput *ico_exinput;
81 struct output *output[MAX_OUTPUT];
82 struct surface *surface;
83 struct surface_name *surface_name;
84 struct surface_name *bgsurface_name;
90 int surface_destroyed;
92 int visible_on_create;
93 char connect[MAX_CON_NAME+1];
97 struct display *display;
99 struct wl_pointer *pointer;
100 struct wl_keyboard *keyboard;
101 struct wl_touch *touch;
103 uint32_t button_mask;
104 struct surface *pointer_focus;
105 struct surface *keyboard_focus;
106 uint32_t last_key, last_key_state;
110 struct display *display;
111 struct wl_output *output;
117 struct display *display;
118 struct wl_surface *surface;
119 struct wl_shell_surface *shell_surface;
120 struct output *output;
124 EGLSurface egl_surface;
127 static void clear_surface(struct display *display);
130 pointer_handle_enter(void *data, struct wl_pointer *pointer,
131 uint32_t serial, struct wl_surface *surface,
132 wl_fixed_t x, wl_fixed_t y)
134 struct input *input = data;
136 input->pointer_focus = wl_surface_get_user_data(surface);
137 input->x = wl_fixed_to_double(x);
138 input->y = wl_fixed_to_double(y);
139 print_log("HOMESCREEN: got pointer enter (%d,%d), surface %p",
140 (int)input->x, (int)input->y, surface);
144 pointer_handle_leave(void *data, struct wl_pointer *pointer,
145 uint32_t serial, struct wl_surface *surface)
147 struct input *input = data;
149 input->pointer_focus = NULL;
151 print_log("HOMESCREEN: got pointer leave, surface %p", surface);
155 pointer_handle_motion(void *data, struct wl_pointer *pointer,
156 uint32_t time, wl_fixed_t x, wl_fixed_t y)
158 struct input *input = data;
160 input->x = wl_fixed_to_double(x);
161 input->y = wl_fixed_to_double(y);
163 print_log("HOMESCREEN: got pointer motion (%d,%d)", (int)input->x, (int)input->y);
167 pointer_handle_button(void *data, struct wl_pointer *pointer,
168 uint32_t serial, uint32_t time, uint32_t button, uint32_t state_w)
170 struct input *input = data;
172 enum wl_pointer_button_state state = state_w;
174 bit = 1 << (button - BTN_LEFT);
175 if (state == WL_POINTER_BUTTON_STATE_PRESSED)
176 input->button_mask |= bit;
178 input->button_mask &= ~bit;
179 print_log("HOMESCREEN: got pointer button %u %u", button, state_w);
183 pointer_handle_axis(void *data, struct wl_pointer *pointer,
184 uint32_t time, uint32_t axis, wl_fixed_t value)
186 print_log("HOMESCREEN: got pointer axis %u %d", axis, value);
190 keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard,
191 uint32_t format, int fd, uint32_t size)
194 print_log("HOMESCREEN: got keyboard keymap");
198 keyboard_handle_enter(void *data, struct wl_keyboard *keyboard,
199 uint32_t serial, struct wl_surface *surface, struct wl_array *keys)
201 struct input *input = data;
203 input->keyboard_focus = wl_surface_get_user_data(surface);
204 print_log("HOMESCREEN: got keyboard enter, surface %p", surface);
208 keyboard_handle_leave(void *data, struct wl_keyboard *keyboard,
209 uint32_t serial, struct wl_surface *surface)
211 struct input *input = data;
213 input->keyboard_focus = NULL;
214 print_log("HOMESCREEN: got keyboard leave, surface %p", surface);
218 keyboard_handle_key(void *data, struct wl_keyboard *keyboard,
219 uint32_t serial, uint32_t time, uint32_t key, uint32_t state)
221 struct input *input = data;
223 input->last_key = key;
224 input->last_key_state = state;
226 print_log("HOMESCREEN: got keyboard key %u %u", key, state);
230 keyboard_handle_modifiers(void *data, struct wl_keyboard *keyboard,
231 uint32_t serial, uint32_t mods_depressed,
232 uint32_t mods_latched, uint32_t mods_locked, uint32_t group)
234 print_log("HOMESCREEN: got keyboard modifier");
238 touch_handle_down(void *data, struct wl_touch *wl_touch, uint32_t serial, uint32_t time,
239 struct wl_surface *surface, int32_t id, wl_fixed_t x, wl_fixed_t y)
241 print_log("HOMESCREEN: got touch down %d (%d,%d)", id, x/256, y/256);
245 touch_handle_up(void *data, struct wl_touch *wl_touch, uint32_t serial, uint32_t time,
248 print_log("HOMESCREEN: got touch up %d", id);
252 touch_handle_motion(void *data, struct wl_touch *wl_touch, uint32_t time,
253 int32_t id, wl_fixed_t x, wl_fixed_t y)
255 print_log("HOMESCREEN: got touch motion %d (%d,%d)", id, x/256, y/256);
259 touch_handle_frame(void *data, struct wl_touch *wl_touch)
261 print_log("HOMESCREEN: got touch frame");
265 touch_handle_cancel(void *data, struct wl_touch *wl_touch)
267 print_log("HOMESCREEN: got touch cancel");
270 static const struct wl_pointer_listener pointer_listener = {
271 pointer_handle_enter,
272 pointer_handle_leave,
273 pointer_handle_motion,
274 pointer_handle_button,
278 static const struct wl_keyboard_listener keyboard_listener = {
279 keyboard_handle_keymap,
280 keyboard_handle_enter,
281 keyboard_handle_leave,
283 keyboard_handle_modifiers,
286 static const struct wl_touch_listener touch_listener = {
295 seat_handle_capabilities(void *data, struct wl_seat *seat,
296 enum wl_seat_capability caps)
298 struct input *input = data;
300 print_log("HOMESCREEN: seat_handle_capabilities caps=%x", caps);
302 if ((caps & WL_SEAT_CAPABILITY_POINTER) && !input->pointer) {
303 input->pointer = wl_seat_get_pointer(seat);
304 print_log("HOMESCREEN: seat_handle_capabilities add pointer=%x", (int)input->pointer);
305 wl_pointer_set_user_data(input->pointer, input);
306 wl_pointer_add_listener(input->pointer, &pointer_listener, input);
308 else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && input->pointer) {
309 print_log("HOMESCREEN: seat_handle_capabilities delete pointer");
310 wl_pointer_destroy(input->pointer);
311 input->pointer = NULL;
314 if ((caps & WL_SEAT_CAPABILITY_KEYBOARD) && !input->keyboard) {
315 input->keyboard = wl_seat_get_keyboard(seat);
316 print_log("HOMESCREEN: seat_handle_capabilities add keyboard=%x", (int)input->keyboard);
317 wl_keyboard_set_user_data(input->keyboard, input);
318 wl_keyboard_add_listener(input->keyboard, &keyboard_listener, input);
320 else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && input->keyboard) {
321 print_log("HOMESCREEN: seat_handle_capabilities delete keyboard");
322 wl_keyboard_destroy(input->keyboard);
323 input->keyboard = NULL;
326 if ((caps & WL_SEAT_CAPABILITY_TOUCH) && !input->touch) {
327 input->touch = wl_seat_get_touch(seat);
328 print_log("HOMESCREEN: seat_handle_capabilities add touch=%x", (int)input->touch);
329 wl_touch_set_user_data(input->touch, input);
330 wl_touch_add_listener(input->touch, &touch_listener, input);
332 else if (!(caps & WL_SEAT_CAPABILITY_TOUCH) && input->touch) {
333 print_log("HOMESCREEN: seat_handle_capabilities delete touch");
334 wl_touch_destroy(input->touch);
339 static const struct wl_seat_listener seat_listener = {
340 seat_handle_capabilities,
344 surface_enter(void *data, struct wl_surface *wl_surface, struct wl_output *output)
346 struct surface *surface = data;
348 surface->output = wl_output_get_user_data(output);
350 print_log("HOMESCREEN: got surface enter, output %p", surface->output);
354 surface_leave(void *data, struct wl_surface *wl_surface, struct wl_output *output)
356 struct surface *surface = data;
358 surface->output = NULL;
360 print_log("HOMESCREEN: got surface leave, output %p",
361 wl_output_get_user_data(output));
364 static const struct wl_surface_listener surface_listener = {
370 create_surface(struct display *display, const char *title)
372 struct surface *surface;
375 surface = malloc(sizeof *surface);
377 surface->display = display;
378 display->surface = surface;
379 surface->surface = wl_compositor_create_surface(display->compositor);
380 wl_surface_add_listener(surface->surface, &surface_listener, surface);
382 if (display->shell) {
383 surface->shell_surface =
384 wl_shell_get_shell_surface(display->shell, surface->surface);
385 if (surface->shell_surface) {
386 wl_shell_surface_set_toplevel(surface->shell_surface);
387 wl_shell_surface_set_title(surface->shell_surface, title);
390 wl_display_flush(display->display);
392 id = wl_proxy_get_id((struct wl_proxy *) surface->surface);
393 print_log("HOMESCREEN: create surface = %d", id);
395 poll(NULL, 0, 100); /* Wait for next frame where we'll get events. */
397 wl_display_roundtrip(display->display);
399 surface->dpy = opengl_init(display->display, &surface->conf, &surface->ctx);
401 surface->egl_surface = opengl_create_window(display->display, surface->surface,
402 surface->dpy, surface->conf,
403 surface->ctx, display->init_width,
404 display->init_height,
405 display->init_color);
406 clear_surface(display);
407 print_log("HOMESCREEN: created egl_surface %08x", (int)surface->egl_surface);
412 clear_surface(struct display *display)
414 if (! display->surface) {
415 create_surface(display, "HomeScreen-BG");
418 opengl_clear_window(display->init_color);
419 opengl_swap_buffer(display->display,
420 display->surface->dpy, display->surface->egl_surface);
425 output_handle_geometry(void *data, struct wl_output *wl_output, int x, int y,
426 int physical_width, int physical_height, int subpixel,
427 const char *make, const char *model, int32_t transform)
429 struct output *output = data;
431 print_log("HOMESCREEN: Event[handle_geometry] %08x x/y=%d/%d p.w/h=%d/%d trans=%d",
432 (int)wl_output, x, y, physical_width, physical_height, transform);
439 output_handle_mode(void *data, struct wl_output *wl_output, uint32_t flags,
440 int width, int height, int refresh)
442 struct output *output = data;
444 print_log("HOMESCREEN: Event[handle_mode] %08x x/y=%d/%d flags=%08x refresh=%d",
445 (int)wl_output, width, height, flags, refresh);
447 if (flags & WL_OUTPUT_MODE_CURRENT) {
448 struct display *display = output->display;
450 output->width = width;
451 output->height = height;
453 display->init_width = width;
454 display->init_height = height;
456 if (display->bgsurface_name) {
457 ico_window_mgr_set_positionsize(display->ico_window_mgr,
458 display->bgsurface_name->surfaceid,
459 0, 0, 0, 0, width, height);
461 else if (display->bg_created == 0) {
462 display->bg_created = 9;
463 create_surface(display, "HomeScreen-BG");
468 static const struct wl_output_listener output_listener = {
469 output_handle_geometry,
474 search_surface(struct display *display, const char *surfname)
476 struct surface_name *p;
478 p = display->surface_name;
480 if (strcmp(p->appid, surfname) == 0) break;
488 if ((strcasecmp(surfname, "all") == 0) ||
489 (strcasecmp(surfname, "main") == 0)) {
490 return ICO_WINDOW_MGR_V_MAINSURFACE;
496 static struct surface_name *
497 search_surfacename(struct display *display, const char *surfname)
499 struct surface_name *p;
501 p = display->surface_name;
503 if (strcmp(p->appid, surfname) == 0) break;
507 print_log("HOMESCREEN: app(%s) dose not exist", surfname);
512 static struct surface_name *
513 search_surfaceid(struct display *display, const int surfaceid)
515 struct surface_name *p;
517 p = display->surface_name;
519 if (p->surfaceid == surfaceid) {
528 window_created(void *data, struct ico_window_mgr *ico_window_mgr,
529 uint32_t surfaceid, const char *winname, int32_t pid, const char *appid)
531 struct display *display = data;
532 struct surface_name *p;
533 struct surface_name *fp;
535 display->surface_created = 1;
536 p = display->surface_name;
539 if (p->surfaceid == (int)surfaceid) break;
544 print_log("HOMESCREEN: Event[window_created] surface=%08x(app=%s,name=%s) exist",
545 (int)surfaceid, appid, winname);
548 print_log("HOMESCREEN: Event[window_created] new surface=%08x(app=%s) winname=%s",
549 (int)surfaceid, appid, winname);
550 p = malloc(sizeof(struct surface_name));
554 memset(p, 0, sizeof(struct surface_name));
559 display->surface_name = p;
562 p->surfaceid = surfaceid;
564 strncpy(p->appid, appid, MAX_APPID-1);
566 /* Set default size and show */
568 ico_window_mgr_set_positionsize(display->ico_window_mgr, surfaceid,
569 0, p->x, p->y, p->width, p->height, 0);
572 print_log("HOMESCREEN: Created window[%08x] (app=%s)", (int)surfaceid, appid);
574 if (strncasecmp(appid, "test-homescreen", 15) == 0) {
575 display->bgsurface_name = p;
576 if (display->bg_created == 1) {
577 display->bg_created = 9;
578 ico_window_mgr_set_positionsize(display->ico_window_mgr, surfaceid,
580 display->init_width, display->init_height, 0);
582 ico_window_mgr_set_visible(display->ico_window_mgr, surfaceid, 1, 0, 0);
583 print_log("HOMESCREEN: Created window[%08x] (app=%s) Visible",
584 (int)surfaceid, appid);
590 window_name(void *data, struct ico_window_mgr *ico_window_mgr,
591 uint32_t surfaceid, const char *winname)
593 print_log("HOMESCREEN: Window Name[%08x] (name=%s)", (int)surfaceid, winname);
597 window_destroyed(void *data, struct ico_window_mgr *ico_window_mgr, uint32_t surfaceid)
599 struct display *display = data;
600 struct surface_name *p;
601 struct surface_name *fp;
603 display->surface_destroyed = 1;
604 p = search_surfaceid(display, (int)surfaceid);
606 print_log("HOMESCREEN: Event[window_destroyed] surface=%08x dose not exist",
610 print_log("HOMESCREEN: Event[window_destroyed] surface=%08x", (int)surfaceid);
611 if (p == display->surface_name) {
612 display->surface_name = p->next;
615 fp = display->surface_name;
629 window_visible(void *data, struct ico_window_mgr *ico_window_mgr,
630 uint32_t surfaceid, int32_t visible, int32_t raise, int32_t hint)
632 struct display *display = data;
633 struct surface_name *p;
635 p = search_surfaceid(display, (int)surfaceid);
637 print_log("HOMESCREEN: Event[window_visible] surface=%08x dose not exist",
641 print_log("HOMESCREEN: Event[window_visible] surface=%08x "
642 "visible=%d raise=%d hint=%d", (int)surfaceid, visible, raise, hint);
643 p->visible = visible;
645 ico_window_mgr_set_visible(display->ico_window_mgr, surfaceid,
646 visible, ICO_WINDOW_MGR_V_NOCHANGE, 0);
652 window_configure(void *data, struct ico_window_mgr *ico_window_mgr,
653 uint32_t surfaceid, uint32_t node, uint32_t layer,
654 int32_t x, int32_t y, int32_t width, int32_t height, int32_t hint)
656 struct display *display = data;
657 struct surface_name *p;
659 print_log("HOMESCREEN: Event[window_configure] surface=%08x "
660 "node=%x x/y=%d/%d w/h=%d/%d hint=%d",
661 (int)surfaceid, node, x, y, width, height, hint);
663 p = search_surfaceid(display, (int)surfaceid);
665 print_log("HOMESCREEN: Event[window_configure] surface=%08x dose not exist",
674 window_layer_visible(void *data, struct ico_window_mgr *ico_window_mgr,
675 uint32_t layer, int32_t visible)
677 print_log("HOMESCREEN: Event[layer_visible]layer=%x visible=%d",
678 (int)layer, visible);
682 window_active(void *data, struct ico_window_mgr *ico_window_mgr,
683 uint32_t surfaceid, const int32_t active)
685 print_log("HOMESCREEN: Event[window_active] surface=%08x acive=%d",
686 (int)surfaceid, (int)active);
687 if ((surfaceid & 0x0000ffff) == 0x0001) {
688 ico_window_mgr_set_visible(ico_window_mgr, surfaceid,
689 ICO_WINDOW_MGR_V_NOCHANGE, 0, 0);
694 window_surfaces(void *data, struct ico_window_mgr *ico_window_mgr,
695 const char *appid, struct wl_array *surfaces)
697 print_log("HOMESCREEN: Event[app_surfaces] app=%s", appid);
701 window_map(void *data, struct ico_window_mgr *ico_window_mgr,
702 int32_t event, uint32_t surfaceid, uint32_t type, uint32_t target,
703 int32_t width, int32_t height, int32_t stride, uint32_t format)
705 struct display *display = data;
709 case ICO_WINDOW_MGR_MAP_SURFACE_EVENT_CONTENTS:
710 strcpy(sevt, "Contents"); break;
711 case ICO_WINDOW_MGR_MAP_SURFACE_EVENT_RESIZE:
712 strcpy(sevt, "Resize"); break;
713 case ICO_WINDOW_MGR_MAP_SURFACE_EVENT_MAP:
714 strcpy(sevt, "Map"); break;
715 case ICO_WINDOW_MGR_MAP_SURFACE_EVENT_UNMAP:
716 strcpy(sevt, "Unmap"); break;
717 case ICO_WINDOW_MGR_MAP_SURFACE_EVENT_ERROR:
718 sprintf(sevt, "Error %d", type); break;
720 sprintf(sevt, "??%d??", event); break;
722 print_log("HOMESCREEN: Event[map_surface] ev=%s(%d) surf=%08x type=%d target=%x "
723 "w/h/s/f=%d/%d/%d/%x",
724 sevt, event, (int)surfaceid, type, target, width, height, stride, format);
725 if ((event == ICO_WINDOW_MGR_MAP_SURFACE_EVENT_MAP) ||
726 (event == ICO_WINDOW_MGR_MAP_SURFACE_EVENT_CONTENTS)) {
727 opengl_thumbnail(display->display, surfaceid, display->surface->dpy,
728 display->surface->conf, display->surface->egl_surface,
729 display->surface->ctx, target, width, height, stride, format);
733 static const struct ico_window_mgr_listener window_mgr_listener = {
740 window_layer_visible,
746 cb_input_capabilities(void *data, struct ico_exinput *ico_exinput,
747 const char *device, int32_t type, const char *swname, int32_t input,
748 const char *codename, int32_t code)
750 print_log("HOMESCREEN: Event[input_capabilities] device=%s type=%d sw=%s input=%d "
751 "code=%s[%d]", device, type, swname, input, codename, code);
755 cb_input_code(void *data, struct ico_exinput *ico_exinput,
756 const char *device, int32_t input, const char *codename, int32_t code)
758 print_log("HOMESCREEN: Event[input_code] device=%s input=%d code=%s[%d]",
759 device, input, codename, code);
763 cb_input_input(void *data, struct ico_exinput *ico_exinput, uint32_t time,
764 const char *device, int32_t input, int32_t code, int32_t state)
766 print_log("HOMESCREEN: Event[input_input] device=%s input=%d code=%d state=%d",
767 device, input, code, state);
770 static const struct ico_exinput_listener exinput_listener = {
771 cb_input_capabilities,
777 cb_input_regions(void *data, struct ico_input_mgr_device *ico_input_mgr_device,
778 struct wl_array *regions)
780 struct ico_uifw_input_region *region;
786 wl_array_for_each(region, regions) {
788 print_log("HOMESCREEN: Event[input_regions] number of regions=%d", n);
791 wl_array_for_each(region, regions) {
793 switch (region->change) {
794 case ICO_INPUT_MGR_DEVICE_REGION_ADD:
795 strcpy(schange, "Add");
797 case ICO_INPUT_MGR_DEVICE_REGION_REMOVE:
798 strcpy(schange, "Remove");
800 case ICO_INPUT_MGR_DEVICE_REGION_REMOVEALL:
801 strcpy(schange, "RemoveAll");
804 sprintf(schange, "?%d?", region->change);
807 print_log("HOMESCREEN:%2d. %s %d.%08(%d/%d) &d/%d-%d/%d "
808 "hot=%d/%d cur=%d/%d-%d/%d attr=%x",
809 n, schange, region->node, region->surfaceid, region->surface_x,
810 region->surface_y, region->x, region->y, region->width,
811 region->height, region->hotspot_x, region->hotspot_y,
812 region->cursor_x, region->cursor_y, region->cursor_width,
813 region->cursor_height, region->attr);
817 print_log("HOMESCREEN: Event[input_regions] no region");
821 static const struct ico_input_mgr_device_listener device_listener = {
827 handle_global(void *data, struct wl_registry *registry, uint32_t id,
828 const char *interface, uint32_t version)
830 struct display *display = data;
832 struct output *output;
834 print_log("HOMESCREEN: handle_global: interface=<%s> id=%d", interface, (int)id);
836 if (strcmp(interface, "wl_compositor") == 0) {
837 display->compositor =
838 wl_registry_bind(display->registry, id, &wl_compositor_interface, 1);
840 else if (strcmp(interface, "wl_seat") == 0) {
841 input = calloc(1, sizeof *input);
842 input->display = display;
843 input->seat = wl_registry_bind(display->registry, id, &wl_seat_interface, 1);
844 input->pointer_focus = NULL;
845 input->keyboard_focus = NULL;
847 wl_seat_add_listener(input->seat, &seat_listener, input);
848 display->input = input;
850 else if (strcmp(interface, "wl_output") == 0) {
851 if (display->num_output < MAX_OUTPUT) {
852 output = malloc(sizeof *output);
853 output->display = display;
854 output->output = wl_registry_bind(display->registry, id, &wl_output_interface, 1);
855 wl_output_add_listener(output->output, &output_listener, output);
856 display->output[display->num_output] = output;
858 print_log("HOMESCREEN: created output[%d] global %p",
859 display->num_output, display->output[display->num_output]);
860 display->num_output ++;
863 else if (strcmp(interface, "wl_shell") == 0) {
865 wl_registry_bind(display->registry, id, &wl_shell_interface, 1);
867 else if (strcmp(interface, "ico_window_mgr") == 0) {
868 display->ico_window_mgr =
869 wl_registry_bind(display->registry, id, &ico_window_mgr_interface, 1);
870 ico_window_mgr_add_listener(display->ico_window_mgr, &window_mgr_listener, display);
871 print_log("HOMESCREEN: created window_mgr global %p", display->ico_window_mgr);
873 ico_window_mgr_declare_manager(display->ico_window_mgr, 1);
875 else if (strcmp(interface, "ico_input_mgr_control") == 0) {
876 display->ico_input_mgr = wl_registry_bind(display->registry, id,
877 &ico_input_mgr_control_interface, 1);
878 print_log("HOMESCREEN: created input_mgr global %p", display->ico_input_mgr);
880 else if (strcmp(interface, "ico_input_mgr_device") == 0) {
881 display->ico_input_device = wl_registry_bind(display->registry, id,
882 &ico_input_mgr_device_interface, 1);
883 ico_input_mgr_device_add_listener(display->ico_input_device,
884 &device_listener, display);
885 print_log("HOMESCREEN: created input_device global %p", display->ico_input_device);
887 else if (strcmp(interface, "ico_exinput") == 0) {
888 display->ico_exinput =
889 wl_registry_bind(display->registry, id, &ico_exinput_interface, 1);
890 ico_exinput_add_listener(display->ico_exinput, &exinput_listener, display);
891 print_log("HOMESCREEN: created exinput global %p", display->ico_exinput);
893 ico_window_mgr_declare_manager(display->ico_window_mgr, 1);
895 display->bg_created = 1;
896 create_surface(display, "HomeScreen-BG");
900 static const struct wl_registry_listener registry_listener = {
905 launch_app(struct display *display, char *buf)
909 display->surface_created = 0;
910 display->surface_destroyed = 0;
911 snprintf(sbuf, sizeof(sbuf)-1, "%s &", skip_spaces(buf));
912 if (system(sbuf) < 0) {
913 print_log("HOMESCREEN: Can not launch application[%s]", sbuf);
916 sleep_with_wayland(display->display, 500);
921 kill_app(struct display *display, char *buf)
925 struct surface_name *p;
926 struct surface_name *fp;
928 narg = pars_command(buf, args, 10);
930 p = search_surfacename(display, args[0]);
932 print_log("HOMESCREEN: kill[%s] Application dose not exist", args[0]);
934 else if (kill(p->pid, SIGINT) < 0) {
935 print_log("HOMESCREEN: kill[%s.%d] Application dose not exist",
939 sleep_with_wayland(display->display, 300);
940 p = search_surfacename(display, args[0]);
941 if ((p != NULL) && (kill(p->pid, SIGTERM) >= 0)) {
942 sleep_with_wayland(display->display, 200);
943 p = search_surfacename(display, args[0]);
945 kill(p->pid, SIGKILL);
946 sleep_with_wayland(display->display, 200);
950 p = search_surfacename(display, args[0]);
952 if (p == display->surface_name) {
953 display->surface_name = p->next;
956 fp = display->surface_name;
968 print_log("HOMESCREEN: kill command[kill appid] has no argument");
973 layer_surface(struct display *display, char *buf)
980 narg = pars_command(buf, args, 10);
982 surfaceid = search_surface(display, args[0]);
983 layerid = strtol(args[1], (char **)0, 0);
984 if ((surfaceid >= 0) && (layerid >= 0)) {
985 print_log("HOMESCREEN: set_window_layer(%s,%08x)",
986 args[0], surfaceid, layerid);
987 ico_window_mgr_set_window_layer(display->ico_window_mgr, surfaceid, layerid);
990 print_log("HOMESCREEN: Unknown surface(%s) at layer command", args[0]);
994 print_log("HOMESCREEN: layer command[layer appid layerid] has no argument");
999 positionsize_surface(struct display *display, char *buf)
1002 struct surface_name *p;
1005 int x, y, width, height;
1009 narg = pars_command(buf, args, 10);
1011 surfaceid = search_surface(display, args[0]);
1012 p = search_surfacename(display, args[0]);
1013 x = strtol(args[1], (char **)0, 0);
1014 y = strtol(args[2], (char **)0, 0);
1015 width = strtol(args[3], (char **)0, 0);
1016 height = strtol(args[4], (char **)0, 0);
1018 node = strtol(args[5], (char **)0, 0);
1027 anima = strtol(args[6], (char **)0, 0);
1029 if ((surfaceid >= 0) && (x >= 0) && (y >=0) && (width >= 0) && (height >=0)) {
1030 print_log("HOMESCREEN: set_positionsize(%s,%08x,%d,%d,%d,%d,%d)",
1031 args[0], surfaceid, node, x, y, width, height);
1032 ico_window_mgr_set_positionsize(display->ico_window_mgr, surfaceid,
1033 node, x, y, width, height, anima);
1036 print_log("HOMESCREEN: Unknown surface(%s) at positionsize command", args[0]);
1040 print_log("HOMESCREEN: positionsize command"
1041 "[positionsize appid x y width heigh node anima] has no argument");
1046 move_surface(struct display *display, char *buf)
1049 struct surface_name *p;
1056 narg = pars_command(buf, args, 10);
1058 surfaceid = search_surface(display, args[0]);
1059 p = search_surfacename(display, args[0]);
1060 x = strtol(args[1], (char **)0, 0);
1061 y = strtol(args[2], (char **)0, 0);
1063 node = strtol(args[3], (char **)0, 0);
1065 if (p) node = p->node;
1068 if (p) p->node = node;
1074 anima = strtol(args[4], (char **)0, 0);
1077 if ((surfaceid >= 0) && (x >= 0) && (y >=0)) {
1078 print_log("HOMESCREEN: move(%s,%08x,%d.%d,%d anima=%d)", args[0], surfaceid,
1080 ico_window_mgr_set_positionsize(display->ico_window_mgr, surfaceid,
1082 ICO_WINDOW_MGR_V_NOCHANGE,
1083 ICO_WINDOW_MGR_V_NOCHANGE, anima);
1086 print_log("HOMESCREEN: Unknown surface(%s) at move command", args[0]);
1090 print_log("HOMESCREEN: move command[positionsize appid x y node anima] has no argument");
1095 resize_surface(struct display *display, char *buf)
1098 struct surface_name *p;
1105 narg = pars_command(buf, args, 10);
1107 surfaceid = search_surface(display, args[0]);
1108 p = search_surfacename(display, args[0]);
1112 width = strtol(args[1], (char **)0, 0);
1113 height = strtol(args[2], (char **)0, 0);
1115 anima = strtol(args[3], (char **)0, 0);
1118 if ((surfaceid >= 0) && (width >= 0) && (height >=0)) {
1119 print_log("HOMESCREEN: resize(%s,%08x,%d.%d,%d,anima=%d)",
1120 args[0], surfaceid, node, width, height, anima);
1121 ico_window_mgr_set_positionsize(display->ico_window_mgr, surfaceid,
1122 node, ICO_WINDOW_MGR_V_NOCHANGE,
1123 ICO_WINDOW_MGR_V_NOCHANGE, width, height, anima);
1126 print_log("HOMESCREEN: Unknown surface(%s) at resize command", args[0]);
1130 print_log("HOMESCREEN: positionsize command"
1131 "[resize appid width heigh anima] has no argument");
1136 visible_surface(struct display *display, char *buf)
1145 narg = pars_command(buf, args, 10);
1147 surfaceid = search_surface(display, args[0]);
1148 visible = strtol(args[1], (char **)0, 0);
1149 raise = strtol(args[2], (char **)0, 0);
1151 anima = strtol(args[3], (char **)0, 0);
1153 if ((surfaceid >= 0) && (visible >= 0) && (raise >=0)) {
1154 print_log("HOMESCREEN: visible(%s,%08x,%d,%d,%d)",
1155 args[0], surfaceid, visible, raise, anima);
1156 ico_window_mgr_set_visible(display->ico_window_mgr, surfaceid,
1157 visible, raise, anima);
1160 print_log("HOMESCREEN: Unknown surface(%s) at visible command", args[0]);
1164 print_log("HOMESCREEN: visible command[visible appid visible raise] "
1170 show_surface(struct display *display, char *buf, const int show)
1181 narg = pars_command(buf, args, 10);
1183 surfaceid = search_surface(display, args[0]);
1185 anima = strtol(args[1], (char **)0, 0);
1191 if (narg >= 3) ax = strtol(args[2], (char **)0, 0);
1192 if (narg >= 4) ay = strtol(args[3], (char **)0, 0);
1193 if (narg >= 5) awidth = strtol(args[4], (char **)0, 0);
1194 if (narg >= 6) aheight = strtol(args[5], (char **)0, 0);
1197 if (surfaceid >= 0) {
1200 print_log("HOMESCREEN: show anima(%s,%08x,x/y=%d/%d,w/h=%d/%d)",
1201 args[0], surfaceid, ax, ay, awidth, aheight);
1202 ico_window_mgr_visible_animation(display->ico_window_mgr, surfaceid,
1203 1, ax, ay, awidth, aheight);
1206 print_log("HOMESCREEN: show(%s,%08x,anima=%d)",
1207 args[0], surfaceid, anima);
1208 ico_window_mgr_set_visible(display->ico_window_mgr, surfaceid,
1209 1, ICO_WINDOW_MGR_V_NOCHANGE, anima);
1214 print_log("HOMESCREEN: hide anima(%s,%08x,x/y=%d/%d,w/h=%d/%d)",
1215 args[0], surfaceid, ax, ay, awidth, aheight);
1216 ico_window_mgr_visible_animation(display->ico_window_mgr, surfaceid,
1217 0, ax, ay, awidth, aheight);
1220 print_log("HOMESCREEN: hide(%s,%08x,anima=%d)",
1221 args[0], surfaceid, anima);
1222 ico_window_mgr_set_visible(display->ico_window_mgr, surfaceid,
1223 0, ICO_WINDOW_MGR_V_NOCHANGE, anima);
1228 print_log("HOMESCREEN: Unknown surface(%s) at show/hide command", args[0]);
1232 print_log("HOMESCREEN: show command[show/hide appid anima x y width height]"
1233 " has no argument");
1238 raise_surface(struct display *display, char *buf, const int raise)
1245 narg = pars_command(buf, args, 10);
1247 surfaceid = search_surface(display, args[0]);
1249 anima = strtol(args[1], (char **)0, 0);
1251 if (surfaceid >= 0) {
1253 print_log("HOMESCREEN: raise(%s,%08x,anima=%d)", args[0], surfaceid, anima);
1254 ico_window_mgr_set_visible(display->ico_window_mgr, surfaceid,
1255 ICO_WINDOW_MGR_V_NOCHANGE, 1, anima);
1258 print_log("HOMESCREEN: lower(%s,%08x,anima=%d)", args[0], surfaceid, anima);
1259 ico_window_mgr_set_visible(display->ico_window_mgr, surfaceid,
1260 ICO_WINDOW_MGR_V_NOCHANGE, 0, anima);
1264 print_log("HOMESCREEN: Unknown surface(%s) at raise/lower command", args[0]);
1268 print_log("HOMESCREEN: show command[raise/lower appid anima] has no argument");
1273 active_window(struct display *display, char *buf)
1280 narg = pars_command(buf, args, 10);
1282 surfaceid = search_surface(display, args[0]);
1284 target = strtol(args[1], (char **)0, 0);
1287 target = ICO_WINDOW_MGR_ACTIVE_POINTER | ICO_WINDOW_MGR_ACTIVE_KEYBOARD;
1289 if (surfaceid >= 0) {
1290 print_log("HOMESCREEN: active(%s,%08x,target=%x)", args[0], surfaceid, target);
1291 ico_window_mgr_set_active(display->ico_window_mgr, surfaceid, target);
1294 print_log("HOMESCREEN: Unknown surface(%s) at active command", args[0]);
1298 print_log("HOMESCREEN: active command[active appid[target]] has no argument");
1304 animation_surface(struct display *display, char *buf)
1311 narg = pars_command(buf, args, 10);
1313 surfaceid = search_surface(display, args[0]);
1314 if (surfaceid >= 0) {
1316 time = strtol(args[2], (char **)0, 0);
1321 print_log("HOMESCREEN: animation(%s,%08x,%s,%d)",
1322 args[0], surfaceid, args[1], time);
1323 ico_window_mgr_set_animation(display->ico_window_mgr, surfaceid, 0x7fffffff,
1327 print_log("HOMESCREEN: Unknown surface(%s) at animation command", args[0]);
1331 print_log("HOMESCREEN: animation command"
1332 "[animation appid animation time] has no argument");
1337 map_surface(struct display *display, char *buf, int map)
1344 narg = pars_command(buf, args, 10);
1346 surfaceid = search_surface(display, args[0]);
1347 if (surfaceid >= 0) {
1349 fps = strtol(args[1], (char **)0, 0);
1355 print_log("HOMESCREEN: map surface(%s,%08x,%d)",
1356 args[0], surfaceid, fps);
1357 ico_window_mgr_map_surface(display->ico_window_mgr, surfaceid, fps);
1360 print_log("HOMESCREEN: unmap surface(%s,%08x)", args[0], surfaceid);
1361 ico_window_mgr_unmap_surface(display->ico_window_mgr, surfaceid);
1365 print_log("HOMESCREEN: Unknown surface(%s) at %s command", args[0],
1366 map ? "map" : "unmap");
1371 print_log("HOMESCREEN: map surface command"
1372 "[map surface framerate] has no argument");
1375 print_log("HOMESCREEN: unmap surface command"
1376 "[unmap surface] has no argument");
1382 visible_layer(struct display *display, char *buf)
1389 narg = pars_command(buf, args, 10);
1391 layer = strtol(args[0], (char **)0, 0);
1392 visible = strtol(args[1], (char **)0, 0);
1393 ico_window_mgr_set_layer_visible(display->ico_window_mgr, layer, visible);
1396 print_log("HOMESCREEN: layer_visible command"
1397 "[layer_visible layer visible] has no argument");
1402 input_add(struct display *display, char *buf)
1409 narg = pars_command(buf, args, 10);
1411 input = strtol(args[1], (char **)0, 0);
1413 fix = strtol(args[3], (char **)0, 0);
1418 if ((input >= 0) && (fix >=0)) {
1419 print_log("HOMESCREEN: input_add(%s.%d to %s[%d])",
1420 args[0], input, args[2], fix);
1421 ico_input_mgr_control_add_input_app(display->ico_input_mgr,
1422 args[2], args[0], input, fix, 0);
1425 print_log("HOMESCREEN: Unknown input(%s) at input_add command", args[1]);
1429 print_log("HOMESCREEN: input_add command[input_add device inputId appid fix] "
1435 input_del(struct display *display, char *buf)
1440 char wk1[32], wk2[32];
1442 narg = pars_command(buf, args, 10);
1444 input = strtol(args[1], (char **)0, 0);
1445 if (args[0][0] == '@') {
1449 if (args[2][0] == '@') {
1453 print_log("HOMESCREEN: input_del(%s.%d to %s)", args[0], input, args[2]);
1454 ico_input_mgr_control_del_input_app(display->ico_input_mgr,
1455 args[2], args[0], input);
1458 print_log("HOMESCREEN: input_del command[input_del device inputId appid] "
1464 input_send(struct display *display, char *buf)
1475 narg = pars_command(buf, args, 10);
1477 memset(appid, 0, sizeof(appid));
1478 if (args[0][0] == '@') {
1479 strncpy(appid, &args[0][1], sizeof(appid)-1);
1483 surfaceid = search_surface(display, args[0]);
1485 if (strcasecmp(args[1], "POINTER") == 0) {
1486 type = ICO_INPUT_MGR_DEVICE_TYPE_POINTER;
1488 else if (strcasecmp(args[1], "KEYBOARD") == 0) {
1489 type = ICO_INPUT_MGR_DEVICE_TYPE_KEYBOARD;
1491 else if (strcasecmp(args[1], "TOUCH") == 0) {
1492 type = ICO_INPUT_MGR_DEVICE_TYPE_TOUCH;
1494 else if (strcasecmp(args[1], "SWITCH") == 0) {
1495 type = ICO_INPUT_MGR_DEVICE_TYPE_SWITCH;
1497 else if (strcasecmp(args[1], "HAPTIC") == 0) {
1498 type = ICO_INPUT_MGR_DEVICE_TYPE_HAPTIC;
1501 type = strtol(args[1], (char **)0, 0);
1503 no = strtol(args[2], (char **)0, 0);
1504 if (strcasecmp(args[3], "ABS_X") == 0) {
1507 else if (strcasecmp(args[3], "ABS_Y") == 0) {
1510 else if (strcasecmp(args[3], "ABS_Z") == 0) {
1513 else if (strcasecmp(args[3], "REL_X") == 0) {
1514 code = REL_X | (EV_REL << 16);
1516 else if (strcasecmp(args[3], "REL_Y") == 0) {
1517 code = REL_Y | (EV_REL << 16);
1519 else if (strcasecmp(args[3], "REL_Z") == 0) {
1520 code = REL_Z | (EV_REL << 16);
1522 else if (strcasecmp(args[3], "BTN_TOUCH") == 0) {
1525 else if (strcasecmp(args[3], "BTN_LEFT") == 0) {
1528 else if (strcasecmp(args[3], "BTN_RIGHT") == 0) {
1531 else if (strcasecmp(args[3], "BTN_MIDDLE") == 0) {
1534 else if (strcasecmp(args[3], "BTN_RIGHT") == 0) {
1538 code = strtol(args[3], (char **)0, 0);
1540 value = strtol(args[4], (char **)0, 0);
1542 value = (value << 16) + strtol(args[5], (char **)0, 0);
1544 print_log("HOMESCREEN: input_send(%s.%x,%d,%d,%x,%d)",
1545 appid, surfaceid, type, no, code, value);
1546 ico_input_mgr_control_send_input_event(display->ico_input_mgr,
1547 appid, surfaceid, type, no, 0, code, value);
1550 print_log("HOMESCREEN: input_send command[input_send {@app/serface} type no code "
1551 "value [value2]] has no argument");
1556 input_conf(struct display *display, char *buf)
1563 char wk1[32], wk2[32];
1565 narg = pars_command(buf, args, 10);
1567 type = strtol(args[1], (char **)0, 0);
1568 input = strtol(args[3], (char **)0, 0);
1570 code = strtol(args[5], (char **)0, 0);
1575 strcpy(wk1, args[2]);
1579 if ((type >= 0) && (input >= 0) && (code >=0)) {
1580 ico_input_mgr_device_configure_input(display->ico_input_device, args[0], type,
1581 args[2], input, args[4], code);
1584 print_log("HOMESCREEN: Unknown type(%s),input(%s) or code(%s) "
1585 "at input_conf command", args[1], args[3], args[5]);
1589 print_log("HOMESCREEN: input_conf command[input_conf device type swname input "
1590 "codename code] has no argument");
1595 input_code(struct display *display, char *buf)
1602 narg = pars_command(buf, args, 10);
1604 input = strtol(args[1], (char **)0, 0);
1605 code = strtol(args[3], (char **)0, 0);
1606 if ((input >= 0) && (code >= 0)) {
1607 ico_input_mgr_device_configure_code(display->ico_input_device, args[0], input,
1611 print_log("HOMESCREEN: Unknown input(%s) or code(%s) "
1612 "at input_code command", args[1], args[3]);
1616 print_log("HOMESCREEN: input_conf command[input_code device input codename code] "
1622 input_sw(struct display *display, char *buf)
1632 narg = pars_command(buf, args, 10);
1634 input = strtol(args[1], (char **)0, 0);
1635 code = strtol(args[2], (char **)0, 0);
1636 state = strtol(args[3], (char **)0, 0);
1637 if ((input >= 0) && (state >= 0)) {
1638 gettimeofday(&stv, (struct timezone *)NULL);
1639 timems = (stv.tv_sec % 1000) * 1000 + (stv.tv_usec / 1000);
1640 ico_input_mgr_device_input_event(display->ico_input_device,
1641 timems, args[0], input, code, state);
1644 print_log("HOMESCREEN: Unknown input(%s),code(%s) or state(%s) "
1645 "at input_sw command", args[1], args[2], args[3]);
1649 print_log("HOMESCREEN: input_sw command[input_sw device input code, state] "
1655 send_event(const char *cmd)
1657 static int nmqinfo = 0;
1674 for (pt = 0; cmd[pt]; pt++) {
1675 if ((cmd[pt] >= '0') && (cmd[pt] <= '9')) {
1676 mqkey = mqkey * 10 + cmd[pt] - '0';
1682 for (; cmd[pt] == ' '; pt++) ;
1688 for (i = 0; i < nmqinfo; i++) {
1689 if (mqinfo[i].mqkey == mqkey) {
1690 mqid = mqinfo[i].mqid;
1695 if (nmqinfo >= 10) {
1696 fprintf(stderr, "HOMESCREEN: message queue(%d) overflow\n", mqkey);
1699 mqid = msgget(mqkey, 0);
1701 fprintf(stderr, "HOMESCREEN: message queue(%d(0x%x)) get error[%d]\n",
1702 mqkey, mqkey, errno);
1705 mqinfo[nmqinfo].mqkey = mqkey;
1706 mqinfo[nmqinfo].mqid = mqid;
1710 memset(&mqbuf, 0, sizeof(mqbuf));
1712 strncpy(mqbuf.buf, &cmd[pt], sizeof(mqbuf)-sizeof(long));
1714 if (msgsnd(mqid, &mqbuf, sizeof(mqbuf)-sizeof(long), 0) < 0) {
1715 fprintf(stderr, "HOMESCREEN: message queue(%d(0x%x)) send error[%d]\n",
1716 mqkey, mqkey, errno);
1722 set_region(struct display *display, char *buf)
1726 int x, y, width, height;
1728 int c_x, c_y, c_width, c_height;
1730 narg = pars_command(buf, args, 10);
1732 x = strtol(args[1], (char **)0, 0);
1733 y = strtol(args[2], (char **)0, 0);
1734 width = strtol(args[3], (char **)0, 0);
1735 height = strtol(args[4], (char **)0, 0);
1736 hot_x = x + (width / 2);
1737 hot_y = y + (height / 2);
1740 c_width = width - 10;
1741 if (c_width <= 0) c_width = 2;
1742 c_height = height - 10;
1743 if (c_height <= 0) c_height = 2;
1744 print_log("HOMESCREEN: ico_exinput_set_input_region(%s,%d,%d-%d,%d,"
1745 "hot=%d,%d,cur=%d,%d-%d,%d,attr=0)",
1746 args[0] ? args[0] : "(null)", x, y, width, height,
1747 hot_x, hot_y, c_x, c_y, c_width, c_height);
1748 if (strcasecmp(args[0], "NULL") == 0) {
1749 ico_exinput_set_input_region(display->ico_exinput, "", x, y,
1750 width, height, hot_x, hot_y, c_x, c_y,
1751 c_width, c_height, 0);
1754 ico_exinput_set_input_region(display->ico_exinput, args[0], x, y,
1755 width, height, hot_x, hot_y, c_x, c_y,
1756 c_width, c_height, 0);
1760 print_log("HOMESCREEN: set_region command[set_region winname@appid x y "
1761 "width height] has no argument");
1766 unset_region(struct display *display, char *buf)
1770 int x, y, width, height;
1772 narg = pars_command(buf, args, 10);
1775 x = strtol(args[1], (char **)0, 0);
1776 y = strtol(args[2], (char **)0, 0);
1777 width = strtol(args[3], (char **)0, 0);
1778 height = strtol(args[4], (char **)0, 0);
1786 print_log("HOMESCREEN: ico_exinput_unset_input_region(%s,08x,%d,%d-%d,%d)",
1787 args[0] ? args[0] : "(null)", x, y, width, height);
1788 if (strcasecmp(args[0], "NULL") == 0) {
1789 ico_exinput_unset_input_region(display->ico_exinput, "", x, y,
1793 ico_exinput_unset_input_region(display->ico_exinput, args[0],
1794 x, y, width, height);
1798 print_log("HOMESCREEN: unset_region command[unset_region winname@appid x y "
1799 "width height] has no argument");
1807 * test-homescreen < test-case-data-file > test-result-output
1809 int main(int argc, char *argv[])
1811 struct display *display;
1815 #if 1 /* use mkostemp */
1816 extern int mkostemp(char *template, int flags);
1817 #else /* use mkostemp */
1819 #endif /* use mkostemp */
1821 display = malloc(sizeof *display);
1823 memset((char *)display, 0, sizeof *display);
1825 display->init_width = 640;
1826 display->init_height = 480;
1827 display->init_color = 0xFF304010;
1829 for (fd = 1; fd < argc; fd++) {
1830 if (argv[fd][0] == '-') {
1831 if (strncasecmp(argv[fd], "-visible=", 9) == 0) {
1832 display->visible_on_create = argv[fd][9] & 1;
1834 else if (strncasecmp(argv[fd], "-display=", 9) == 0) {
1835 strncpy(display->connect, &argv[fd][9], MAX_CON_NAME);
1837 else if (strncasecmp(argv[fd], "-prompt=", 8) == 0) {
1838 display->prompt = argv[fd][8] & 1;
1843 if (display->connect[0]) {
1844 display->display = wl_display_connect(display->connect);
1847 display->display = wl_display_connect(NULL);
1849 assert(display->display);
1851 display->registry = wl_display_get_registry(display->display);
1852 wl_registry_add_listener(display->registry, ®istry_listener, display);
1853 wl_display_dispatch(display->display);
1858 sleep_with_wayland(display->display, 20);
1859 if (display->prompt) {
1860 printf("HOMESCREEN> "); fflush(stdout);
1862 ret = getdata(display->ico_window_mgr, "HOMESCREEN> ", fd, buf, sizeof(buf));
1864 fprintf(stderr, "HOMESCREEN: read error: fd %d, %m\n", fd);
1867 if (ret == 0) continue;
1868 wl_display_flush(display->display);
1870 if ((strncasecmp(buf, "bye", 3) == 0) ||
1871 (strncasecmp(buf, "quit", 4) == 0) ||
1872 (strncasecmp(buf, "end", 3) == 0)) {
1873 /* Exit, end of test */
1876 else if (strncasecmp(buf, "launch", 6) == 0) {
1877 /* Launch test application */
1878 launch_app(display, &buf[6]);
1880 else if (strncasecmp(buf, "kill", 4) == 0) {
1881 /* Launch test application */
1882 kill_app(display, &buf[4]);
1884 else if (strncasecmp(buf, "layer_visible", 13) == 0) {
1885 /* Change layer visiblety */
1886 visible_layer(display, &buf[13]);
1888 else if (strncasecmp(buf, "layer", 5) == 0) {
1889 /* layer change surface window */
1890 layer_surface(display, &buf[5]);
1892 else if (strncasecmp(buf, "positionsize", 12) == 0) {
1893 /* Move and Ressize surface window*/
1894 positionsize_surface(display, &buf[12]);
1896 else if (strncasecmp(buf, "move", 4) == 0) {
1897 /* Move surface window */
1898 move_surface(display, &buf[4]);
1900 else if (strncasecmp(buf, "resize", 6) == 0) {
1901 /* Resize surface window */
1902 resize_surface(display, &buf[6]);
1904 else if (strncasecmp(buf, "visible", 7) == 0) {
1905 /* Visible and Raise surface window*/
1906 visible_surface(display, &buf[7]);
1908 else if (strncasecmp(buf, "show", 4) == 0) {
1909 /* Show/Hide surface window */
1910 show_surface(display, &buf[4], 1);
1912 else if (strncasecmp(buf, "hide", 4) == 0) {
1913 /* Show/Hide surface window */
1914 show_surface(display, &buf[4], 0);
1916 else if (strncasecmp(buf, "raise", 5) == 0) {
1917 /* Raise/Lower surface window */
1918 raise_surface(display, &buf[5], 1);
1920 else if (strncasecmp(buf, "lower", 5) == 0) {
1921 /* Raise/Lower surface window */
1922 raise_surface(display, &buf[5], 0);
1924 else if (strncasecmp(buf, "active", 6) == 0) {
1925 /* Active surface window */
1926 active_window(display, &buf[6]);
1928 else if (strncasecmp(buf, "animation", 9) == 0) {
1929 /* Set animation surface window */
1930 animation_surface(display, &buf[9]);
1932 else if (strncasecmp(buf, "map", 3) == 0) {
1934 map_surface(display, &buf[3], 1);
1936 else if (strncasecmp(buf, "unmap", 5) == 0) {
1938 map_surface(display, &buf[5], 0);
1940 else if (strncasecmp(buf, "input_add", 9) == 0) {
1941 /* Set input switch to application */
1942 input_add(display, &buf[9]);
1944 else if (strncasecmp(buf, "input_del", 9) == 0) {
1945 /* Reset input switch to application*/
1946 input_del(display, &buf[9]);
1948 else if (strncasecmp(buf, "input_send", 10) == 0) {
1949 /* Input event send to application*/
1950 input_send(display, &buf[10]);
1952 else if (strncasecmp(buf, "input_conf", 10) == 0) {
1953 /* input switch configuration */
1954 input_conf(display, &buf[10]);
1956 else if (strncasecmp(buf, "input_code", 10) == 0) {
1957 /* input code configuration */
1958 input_code(display, &buf[10]);
1960 else if (strncasecmp(buf, "input_sw", 8) == 0) {
1961 /* input switch event */
1962 input_sw(display, &buf[8]);
1964 else if (strncasecmp(buf, "set_region", 10) == 0) {
1965 /* set input region */
1966 set_region(display, &buf[10]);
1968 else if (strncasecmp(buf, "unset_region", 12) == 0) {
1969 /* unset input region */
1970 unset_region(display, &buf[12]);
1972 else if (strncasecmp(buf, "input_sw", 8) == 0) {
1973 /* input switch event */
1974 input_sw(display, &buf[8]);
1976 else if (strncasecmp(buf, "sleep", 5) == 0) {
1978 msec = sec_str_2_value(&buf[6]);
1979 sleep_with_wayland(display->display, msec);
1981 else if (strncasecmp(buf, "waitcreate", 10) == 0) {
1982 /* Wait surface create */
1983 msec = sec_str_2_value(&buf[11]);
1984 wait_with_wayland(display->display, msec, &display->surface_created);
1986 else if (strncasecmp(buf, "waitdestroy", 11) == 0) {
1987 /* Wait surface destrpy */
1988 msec = sec_str_2_value(&buf[12]);
1989 wait_with_wayland(display->display, msec, &display->surface_destroyed);
1991 else if (strncasecmp(buf, "event", 5) == 0) {
1992 /* Send touch panel event to Weston */
1993 send_event(&buf[6]);
1996 print_log("HOMESCREEN: unknown command[%s]", buf);
2001 print_log("HOMESCREEN: end");