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,
530 const char *appid, int32_t layertype)
532 struct display *display = data;
533 struct surface_name *p;
534 struct surface_name *fp;
536 display->surface_created = 1;
537 p = display->surface_name;
540 if (p->surfaceid == (int)surfaceid) break;
545 print_log("HOMESCREEN: Event[window_created] "
546 "surface=%08x(app=%s,name=%s,type=%x) exist",
547 (int)surfaceid, appid, winname, layertype);
550 print_log("HOMESCREEN: Event[window_created] "
551 "new surface=%08x(app=%s) winname=%s layertype=%x",
552 (int)surfaceid, appid, winname, layertype);
553 p = malloc(sizeof(struct surface_name));
557 memset(p, 0, sizeof(struct surface_name));
562 display->surface_name = p;
565 p->surfaceid = surfaceid;
567 strncpy(p->appid, appid, MAX_APPID-1);
569 /* Set default size and show */
571 ico_window_mgr_set_positionsize(display->ico_window_mgr, surfaceid,
572 0, p->x, p->y, p->width, p->height, 0);
575 print_log("HOMESCREEN: Created window[%08x] (app=%s)", (int)surfaceid, appid);
577 if (strncasecmp(appid, "test-homescreen", 15) == 0) {
578 display->bgsurface_name = p;
579 if (display->bg_created == 1) {
580 display->bg_created = 9;
581 ico_window_mgr_set_positionsize(display->ico_window_mgr, surfaceid,
583 display->init_width, display->init_height, 0);
585 ico_window_mgr_set_visible(display->ico_window_mgr, surfaceid, 1, 0, 0);
586 print_log("HOMESCREEN: Created window[%08x] (app=%s) Visible",
587 (int)surfaceid, appid);
593 window_name(void *data, struct ico_window_mgr *ico_window_mgr,
594 uint32_t surfaceid, const char *winname)
596 print_log("HOMESCREEN: Window Name[%08x] (name=%s)", (int)surfaceid, winname);
600 window_destroyed(void *data, struct ico_window_mgr *ico_window_mgr, uint32_t surfaceid)
602 struct display *display = data;
603 struct surface_name *p;
604 struct surface_name *fp;
606 display->surface_destroyed = 1;
607 p = search_surfaceid(display, (int)surfaceid);
609 print_log("HOMESCREEN: Event[window_destroyed] surface=%08x dose not exist",
613 print_log("HOMESCREEN: Event[window_destroyed] surface=%08x", (int)surfaceid);
614 if (p == display->surface_name) {
615 display->surface_name = p->next;
618 fp = display->surface_name;
632 window_visible(void *data, struct ico_window_mgr *ico_window_mgr,
633 uint32_t surfaceid, int32_t visible, int32_t raise, int32_t hint)
635 struct display *display = data;
636 struct surface_name *p;
638 p = search_surfaceid(display, (int)surfaceid);
640 print_log("HOMESCREEN: Event[window_visible] surface=%08x dose not exist",
644 print_log("HOMESCREEN: Event[window_visible] surface=%08x "
645 "visible=%d raise=%d hint=%d", (int)surfaceid, visible, raise, hint);
646 p->visible = visible;
648 ico_window_mgr_set_visible(display->ico_window_mgr, surfaceid,
649 visible, ICO_WINDOW_MGR_V_NOCHANGE, 0);
655 window_configure(void *data, struct ico_window_mgr *ico_window_mgr,
656 uint32_t surfaceid, uint32_t node, int32_t layertype, uint32_t layer,
657 int32_t x, int32_t y, int32_t width, int32_t height, int32_t hint)
659 struct display *display = data;
660 struct surface_name *p;
662 print_log("HOMESCREEN: Event[window_configure] surface=%08x "
663 "node=%x layer=%x.%x x/y=%d/%d w/h=%d/%d hint=%d",
664 (int)surfaceid, node, layertype, layer, x, y, width, height, hint);
666 p = search_surfaceid(display, (int)surfaceid);
668 print_log("HOMESCREEN: Event[window_configure] surface=%08x dose not exist",
677 window_layer_visible(void *data, struct ico_window_mgr *ico_window_mgr,
678 uint32_t layer, int32_t visible)
680 print_log("HOMESCREEN: Event[layer_visible]layer=%x visible=%d",
681 (int)layer, visible);
685 window_active(void *data, struct ico_window_mgr *ico_window_mgr,
686 uint32_t surfaceid, const int32_t active)
688 print_log("HOMESCREEN: Event[window_active] surface=%08x acive=%d",
689 (int)surfaceid, (int)active);
690 if ((surfaceid & 0x0000ffff) == 0x0001) {
691 ico_window_mgr_set_visible(ico_window_mgr, surfaceid,
692 ICO_WINDOW_MGR_V_NOCHANGE, 0, 0);
697 window_surfaces(void *data, struct ico_window_mgr *ico_window_mgr,
698 const char *appid, int32_t pid, struct wl_array *surfaces)
700 print_log("HOMESCREEN: Event[app_surfaces] app=%s pid=%d", appid, pid);
704 window_map(void *data, struct ico_window_mgr *ico_window_mgr,
705 int32_t event, uint32_t surfaceid, uint32_t type, uint32_t target,
706 int32_t width, int32_t height, int32_t stride, uint32_t format)
708 struct display *display = data;
712 case ICO_WINDOW_MGR_MAP_SURFACE_EVENT_CONTENTS:
713 strcpy(sevt, "Contents"); break;
714 case ICO_WINDOW_MGR_MAP_SURFACE_EVENT_RESIZE:
715 strcpy(sevt, "Resize"); break;
716 case ICO_WINDOW_MGR_MAP_SURFACE_EVENT_MAP:
717 strcpy(sevt, "Map"); break;
718 case ICO_WINDOW_MGR_MAP_SURFACE_EVENT_UNMAP:
719 strcpy(sevt, "Unmap"); break;
720 case ICO_WINDOW_MGR_MAP_SURFACE_EVENT_ERROR:
721 sprintf(sevt, "Error %d", type); break;
723 sprintf(sevt, "??%d??", event); break;
725 print_log("HOMESCREEN: Event[map_surface] ev=%s(%d) surf=%08x type=%d target=%x "
726 "w/h/s/f=%d/%d/%d/%x",
727 sevt, event, (int)surfaceid, type, target, width, height, stride, format);
728 if ((event == ICO_WINDOW_MGR_MAP_SURFACE_EVENT_MAP) ||
729 (event == ICO_WINDOW_MGR_MAP_SURFACE_EVENT_CONTENTS)) {
730 opengl_thumbnail(display->display, surfaceid, display->surface->dpy,
731 display->surface->conf, display->surface->egl_surface,
732 display->surface->ctx, target, width, height, stride, format);
736 static const struct ico_window_mgr_listener window_mgr_listener = {
743 window_layer_visible,
749 cb_input_capabilities(void *data, struct ico_exinput *ico_exinput,
750 const char *device, int32_t type, const char *swname, int32_t input,
751 const char *codename, int32_t code)
753 print_log("HOMESCREEN: Event[input_capabilities] device=%s type=%d sw=%s input=%d "
754 "code=%s[%d]", device, type, swname, input, codename, code);
758 cb_input_code(void *data, struct ico_exinput *ico_exinput,
759 const char *device, int32_t input, const char *codename, int32_t code)
761 print_log("HOMESCREEN: Event[input_code] device=%s input=%d code=%s[%d]",
762 device, input, codename, code);
766 cb_input_input(void *data, struct ico_exinput *ico_exinput, uint32_t time,
767 const char *device, int32_t input, int32_t code, int32_t state)
769 print_log("HOMESCREEN: Event[input_input] device=%s input=%d code=%d state=%d",
770 device, input, code, state);
773 static const struct ico_exinput_listener exinput_listener = {
774 cb_input_capabilities,
780 cb_input_regions(void *data, struct ico_input_mgr_device *ico_input_mgr_device,
781 struct wl_array *regions)
783 struct ico_uifw_input_region *region;
789 wl_array_for_each(region, regions) {
792 print_log("HOMESCREEN: Event[input_regions] number of regions=%d", n);
794 wl_array_for_each(region, regions) {
796 switch (region->change) {
797 case ICO_INPUT_MGR_DEVICE_REGION_ADD:
798 strcpy(schange, "Add");
800 case ICO_INPUT_MGR_DEVICE_REGION_REMOVE:
801 strcpy(schange, "Remove");
803 case ICO_INPUT_MGR_DEVICE_REGION_REMOVEALL:
804 strcpy(schange, "RemoveAll");
807 sprintf(schange, "?%d?", region->change);
810 print_log("HOMESCREEN:%2d. %s %d.%08x(%d/%d) %d/%d-%d/%d "
811 "hot=%d/%d cur=%d/%d-%d/%d attr=%x",
812 n, schange, region->node, region->surfaceid, region->surface_x,
813 region->surface_y, region->x, region->y, region->width,
814 region->height, region->hotspot_x, region->hotspot_y,
815 region->cursor_x, region->cursor_y, region->cursor_width,
816 region->cursor_height, region->attr);
820 print_log("HOMESCREEN: Event[input_regions] no region");
824 static const struct ico_input_mgr_device_listener device_listener = {
830 handle_global(void *data, struct wl_registry *registry, uint32_t id,
831 const char *interface, uint32_t version)
833 struct display *display = data;
835 struct output *output;
837 print_log("HOMESCREEN: handle_global: interface=<%s> id=%d", interface, (int)id);
839 if (strcmp(interface, "wl_compositor") == 0) {
840 display->compositor =
841 wl_registry_bind(display->registry, id, &wl_compositor_interface, 1);
843 else if (strcmp(interface, "wl_seat") == 0) {
844 input = calloc(1, sizeof *input);
845 input->display = display;
846 input->seat = wl_registry_bind(display->registry, id, &wl_seat_interface, 1);
847 input->pointer_focus = NULL;
848 input->keyboard_focus = NULL;
850 wl_seat_add_listener(input->seat, &seat_listener, input);
851 display->input = input;
853 else if (strcmp(interface, "wl_output") == 0) {
854 if (display->num_output < MAX_OUTPUT) {
855 output = malloc(sizeof *output);
856 output->display = display;
857 output->output = wl_registry_bind(display->registry, id, &wl_output_interface, 1);
858 wl_output_add_listener(output->output, &output_listener, output);
859 display->output[display->num_output] = output;
861 print_log("HOMESCREEN: created output[%d] global %p",
862 display->num_output, display->output[display->num_output]);
863 display->num_output ++;
866 else if (strcmp(interface, "wl_shell") == 0) {
868 wl_registry_bind(display->registry, id, &wl_shell_interface, 1);
870 else if (strcmp(interface, "ico_window_mgr") == 0) {
871 display->ico_window_mgr =
872 wl_registry_bind(display->registry, id, &ico_window_mgr_interface, 1);
873 ico_window_mgr_add_listener(display->ico_window_mgr, &window_mgr_listener, display);
874 print_log("HOMESCREEN: created window_mgr global %p", display->ico_window_mgr);
876 ico_window_mgr_declare_manager(display->ico_window_mgr, 1);
878 else if (strcmp(interface, "ico_input_mgr_control") == 0) {
879 display->ico_input_mgr = wl_registry_bind(display->registry, id,
880 &ico_input_mgr_control_interface, 1);
881 print_log("HOMESCREEN: created input_mgr global %p", display->ico_input_mgr);
883 else if (strcmp(interface, "ico_input_mgr_device") == 0) {
884 display->ico_input_device = wl_registry_bind(display->registry, id,
885 &ico_input_mgr_device_interface, 1);
886 ico_input_mgr_device_add_listener(display->ico_input_device,
887 &device_listener, display);
888 print_log("HOMESCREEN: created input_device global %p", display->ico_input_device);
890 else if (strcmp(interface, "ico_exinput") == 0) {
891 display->ico_exinput =
892 wl_registry_bind(display->registry, id, &ico_exinput_interface, 1);
893 ico_exinput_add_listener(display->ico_exinput, &exinput_listener, display);
894 print_log("HOMESCREEN: created exinput global %p", display->ico_exinput);
896 ico_window_mgr_declare_manager(display->ico_window_mgr, 1);
898 display->bg_created = 1;
899 create_surface(display, "HomeScreen-BG");
903 static const struct wl_registry_listener registry_listener = {
908 launch_app(struct display *display, char *buf)
912 display->surface_created = 0;
913 display->surface_destroyed = 0;
914 snprintf(sbuf, sizeof(sbuf)-1, "%s &", skip_spaces(buf));
915 if (system(sbuf) < 0) {
916 print_log("HOMESCREEN: Can not launch application[%s]", sbuf);
919 sleep_with_wayland(display->display, 500);
924 kill_app(struct display *display, char *buf)
928 struct surface_name *p;
929 struct surface_name *fp;
931 narg = pars_command(buf, args, 10);
933 p = search_surfacename(display, args[0]);
935 print_log("HOMESCREEN: kill[%s] Application dose not exist", args[0]);
937 else if (kill(p->pid, SIGINT) < 0) {
938 print_log("HOMESCREEN: kill[%s.%d] Application dose not exist",
942 sleep_with_wayland(display->display, 300);
943 p = search_surfacename(display, args[0]);
944 if ((p != NULL) && (kill(p->pid, SIGTERM) >= 0)) {
945 sleep_with_wayland(display->display, 200);
946 p = search_surfacename(display, args[0]);
948 kill(p->pid, SIGKILL);
949 sleep_with_wayland(display->display, 200);
953 p = search_surfacename(display, args[0]);
955 if (p == display->surface_name) {
956 display->surface_name = p->next;
959 fp = display->surface_name;
971 print_log("HOMESCREEN: kill command[kill appid] has no argument");
976 layer_surface(struct display *display, char *buf)
983 narg = pars_command(buf, args, 10);
985 surfaceid = search_surface(display, args[0]);
986 layerid = strtol(args[1], (char **)0, 0);
987 if ((surfaceid >= 0) && (layerid >= 0)) {
988 print_log("HOMESCREEN: set_window_layer(%s,%08x)",
989 args[0], surfaceid, layerid);
990 ico_window_mgr_set_window_layer(display->ico_window_mgr, surfaceid, layerid);
993 print_log("HOMESCREEN: Unknown surface(%s) at layer command", args[0]);
997 print_log("HOMESCREEN: layer command[layer appid layerid] has no argument");
1002 positionsize_surface(struct display *display, char *buf)
1005 struct surface_name *p;
1008 int x, y, width, height;
1012 narg = pars_command(buf, args, 10);
1014 surfaceid = search_surface(display, args[0]);
1015 p = search_surfacename(display, args[0]);
1016 x = strtol(args[1], (char **)0, 0);
1017 y = strtol(args[2], (char **)0, 0);
1018 width = strtol(args[3], (char **)0, 0);
1019 height = strtol(args[4], (char **)0, 0);
1021 node = strtol(args[5], (char **)0, 0);
1030 anima = strtol(args[6], (char **)0, 0);
1032 if ((surfaceid >= 0) && (x >= 0) && (y >=0) && (width >= 0) && (height >=0)) {
1033 print_log("HOMESCREEN: set_positionsize(%s,%08x,%d,%d,%d,%d,%d)",
1034 args[0], surfaceid, node, x, y, width, height);
1035 ico_window_mgr_set_positionsize(display->ico_window_mgr, surfaceid,
1036 node, x, y, width, height, anima);
1039 print_log("HOMESCREEN: Unknown surface(%s) at positionsize command", args[0]);
1043 print_log("HOMESCREEN: positionsize command"
1044 "[positionsize appid x y width heigh node anima] has no argument");
1049 move_surface(struct display *display, char *buf)
1052 struct surface_name *p;
1059 narg = pars_command(buf, args, 10);
1061 surfaceid = search_surface(display, args[0]);
1062 p = search_surfacename(display, args[0]);
1063 x = strtol(args[1], (char **)0, 0);
1064 y = strtol(args[2], (char **)0, 0);
1066 node = strtol(args[3], (char **)0, 0);
1068 if (p) node = p->node;
1071 if (p) p->node = node;
1077 anima = strtol(args[4], (char **)0, 0);
1080 if ((surfaceid >= 0) && (x >= 0) && (y >=0)) {
1081 print_log("HOMESCREEN: move(%s,%08x,%d.%d,%d anima=%d)", args[0], surfaceid,
1083 ico_window_mgr_set_positionsize(display->ico_window_mgr, surfaceid,
1085 ICO_WINDOW_MGR_V_NOCHANGE,
1086 ICO_WINDOW_MGR_V_NOCHANGE, anima);
1089 print_log("HOMESCREEN: Unknown surface(%s) at move command", args[0]);
1093 print_log("HOMESCREEN: move command[positionsize appid x y node anima] has no argument");
1098 resize_surface(struct display *display, char *buf)
1101 struct surface_name *p;
1108 narg = pars_command(buf, args, 10);
1110 surfaceid = search_surface(display, args[0]);
1111 p = search_surfacename(display, args[0]);
1115 width = strtol(args[1], (char **)0, 0);
1116 height = strtol(args[2], (char **)0, 0);
1118 anima = strtol(args[3], (char **)0, 0);
1121 if ((surfaceid >= 0) && (width >= 0) && (height >=0)) {
1122 print_log("HOMESCREEN: resize(%s,%08x,%d.%d,%d,anima=%d)",
1123 args[0], surfaceid, node, width, height, anima);
1124 ico_window_mgr_set_positionsize(display->ico_window_mgr, surfaceid,
1125 node, ICO_WINDOW_MGR_V_NOCHANGE,
1126 ICO_WINDOW_MGR_V_NOCHANGE, width, height, anima);
1129 print_log("HOMESCREEN: Unknown surface(%s) at resize command", args[0]);
1133 print_log("HOMESCREEN: positionsize command"
1134 "[resize appid width heigh anima] has no argument");
1139 visible_surface(struct display *display, char *buf)
1148 narg = pars_command(buf, args, 10);
1150 surfaceid = search_surface(display, args[0]);
1151 visible = strtol(args[1], (char **)0, 0);
1152 raise = strtol(args[2], (char **)0, 0);
1154 anima = strtol(args[3], (char **)0, 0);
1156 if ((surfaceid >= 0) && (visible >= 0) && (raise >=0)) {
1157 print_log("HOMESCREEN: visible(%s,%08x,%d,%d,%d)",
1158 args[0], surfaceid, visible, raise, anima);
1159 ico_window_mgr_set_visible(display->ico_window_mgr, surfaceid,
1160 visible, raise, anima);
1163 print_log("HOMESCREEN: Unknown surface(%s) at visible command", args[0]);
1167 print_log("HOMESCREEN: visible command[visible appid visible raise] "
1173 show_surface(struct display *display, char *buf, const int show)
1184 narg = pars_command(buf, args, 10);
1186 surfaceid = search_surface(display, args[0]);
1188 anima = strtol(args[1], (char **)0, 0);
1194 if (narg >= 3) ax = strtol(args[2], (char **)0, 0);
1195 if (narg >= 4) ay = strtol(args[3], (char **)0, 0);
1196 if (narg >= 5) awidth = strtol(args[4], (char **)0, 0);
1197 if (narg >= 6) aheight = strtol(args[5], (char **)0, 0);
1200 if (surfaceid >= 0) {
1203 print_log("HOMESCREEN: show anima(%s,%08x,x/y=%d/%d,w/h=%d/%d)",
1204 args[0], surfaceid, ax, ay, awidth, aheight);
1205 ico_window_mgr_visible_animation(display->ico_window_mgr, surfaceid,
1206 1, ax, ay, awidth, aheight);
1209 print_log("HOMESCREEN: show(%s,%08x,anima=%d)",
1210 args[0], surfaceid, anima);
1211 ico_window_mgr_set_visible(display->ico_window_mgr, surfaceid,
1212 1, ICO_WINDOW_MGR_V_NOCHANGE, anima);
1217 print_log("HOMESCREEN: hide anima(%s,%08x,x/y=%d/%d,w/h=%d/%d)",
1218 args[0], surfaceid, ax, ay, awidth, aheight);
1219 ico_window_mgr_visible_animation(display->ico_window_mgr, surfaceid,
1220 0, ax, ay, awidth, aheight);
1223 print_log("HOMESCREEN: hide(%s,%08x,anima=%d)",
1224 args[0], surfaceid, anima);
1225 ico_window_mgr_set_visible(display->ico_window_mgr, surfaceid,
1226 0, ICO_WINDOW_MGR_V_NOCHANGE, anima);
1231 print_log("HOMESCREEN: Unknown surface(%s) at show/hide command", args[0]);
1235 print_log("HOMESCREEN: show command[show/hide appid anima x y width height]"
1236 " has no argument");
1241 raise_surface(struct display *display, char *buf, const int raise)
1248 narg = pars_command(buf, args, 10);
1250 surfaceid = search_surface(display, args[0]);
1252 anima = strtol(args[1], (char **)0, 0);
1254 if (surfaceid >= 0) {
1256 print_log("HOMESCREEN: raise(%s,%08x,anima=%d)", args[0], surfaceid, anima);
1257 ico_window_mgr_set_visible(display->ico_window_mgr, surfaceid,
1258 ICO_WINDOW_MGR_V_NOCHANGE, 1, anima);
1261 print_log("HOMESCREEN: lower(%s,%08x,anima=%d)", args[0], surfaceid, anima);
1262 ico_window_mgr_set_visible(display->ico_window_mgr, surfaceid,
1263 ICO_WINDOW_MGR_V_NOCHANGE, 0, anima);
1267 print_log("HOMESCREEN: Unknown surface(%s) at raise/lower command", args[0]);
1271 print_log("HOMESCREEN: show command[raise/lower appid anima] has no argument");
1276 active_window(struct display *display, char *buf)
1283 narg = pars_command(buf, args, 10);
1285 surfaceid = search_surface(display, args[0]);
1287 target = strtol(args[1], (char **)0, 0);
1290 target = ICO_WINDOW_MGR_ACTIVE_POINTER | ICO_WINDOW_MGR_ACTIVE_KEYBOARD;
1292 if (surfaceid >= 0) {
1293 print_log("HOMESCREEN: active(%s,%08x,target=%x)", args[0], surfaceid, target);
1294 ico_window_mgr_set_active(display->ico_window_mgr, surfaceid, target);
1297 print_log("HOMESCREEN: Unknown surface(%s) at active command", args[0]);
1301 print_log("HOMESCREEN: active command[active appid[target]] has no argument");
1307 animation_surface(struct display *display, char *buf)
1314 narg = pars_command(buf, args, 10);
1316 surfaceid = search_surface(display, args[0]);
1317 if (surfaceid >= 0) {
1319 time = strtol(args[2], (char **)0, 0);
1324 print_log("HOMESCREEN: animation(%s,%08x,%s,%d)",
1325 args[0], surfaceid, args[1], time);
1326 ico_window_mgr_set_animation(display->ico_window_mgr, surfaceid, 0x7fffffff,
1330 print_log("HOMESCREEN: Unknown surface(%s) at animation command", args[0]);
1334 print_log("HOMESCREEN: animation command"
1335 "[animation appid animation time] has no argument");
1340 map_surface(struct display *display, char *buf, int map)
1347 narg = pars_command(buf, args, 10);
1349 surfaceid = search_surface(display, args[0]);
1350 if (surfaceid >= 0) {
1352 fps = strtol(args[1], (char **)0, 0);
1358 print_log("HOMESCREEN: map surface(%s,%08x,%d)",
1359 args[0], surfaceid, fps);
1360 ico_window_mgr_map_surface(display->ico_window_mgr, surfaceid, fps);
1363 print_log("HOMESCREEN: unmap surface(%s,%08x)", args[0], surfaceid);
1364 ico_window_mgr_unmap_surface(display->ico_window_mgr, surfaceid);
1368 print_log("HOMESCREEN: Unknown surface(%s) at %s command", args[0],
1369 map ? "map" : "unmap");
1374 print_log("HOMESCREEN: map surface command"
1375 "[map surface framerate] has no argument");
1378 print_log("HOMESCREEN: unmap surface command"
1379 "[unmap surface] has no argument");
1385 visible_layer(struct display *display, char *buf)
1392 narg = pars_command(buf, args, 10);
1394 layer = strtol(args[0], (char **)0, 0);
1395 visible = strtol(args[1], (char **)0, 0);
1396 ico_window_mgr_set_layer_visible(display->ico_window_mgr, layer, visible);
1399 print_log("HOMESCREEN: layer_visible command"
1400 "[layer_visible layer visible] has no argument");
1405 input_add(struct display *display, char *buf)
1412 narg = pars_command(buf, args, 10);
1414 input = strtol(args[1], (char **)0, 0);
1416 fix = strtol(args[3], (char **)0, 0);
1421 if ((input >= 0) && (fix >=0)) {
1422 print_log("HOMESCREEN: input_add(%s.%d to %s[%d])",
1423 args[0], input, args[2], fix);
1424 ico_input_mgr_control_add_input_app(display->ico_input_mgr,
1425 args[2], args[0], input, fix, 0);
1428 print_log("HOMESCREEN: Unknown input(%s) at input_add command", args[1]);
1432 print_log("HOMESCREEN: input_add command[input_add device inputId appid fix] "
1438 input_del(struct display *display, char *buf)
1443 char wk1[32], wk2[32];
1445 narg = pars_command(buf, args, 10);
1447 input = strtol(args[1], (char **)0, 0);
1448 if (args[0][0] == '@') {
1452 if (args[2][0] == '@') {
1456 print_log("HOMESCREEN: input_del(%s.%d to %s)", args[0], input, args[2]);
1457 ico_input_mgr_control_del_input_app(display->ico_input_mgr,
1458 args[2], args[0], input);
1461 print_log("HOMESCREEN: input_del command[input_del device inputId appid] "
1467 input_send(struct display *display, char *buf)
1478 narg = pars_command(buf, args, 10);
1480 memset(appid, 0, sizeof(appid));
1481 if (args[0][0] == '@') {
1482 strncpy(appid, &args[0][1], sizeof(appid)-1);
1486 surfaceid = search_surface(display, args[0]);
1488 if (strcasecmp(args[1], "POINTER") == 0) {
1489 type = ICO_INPUT_MGR_DEVICE_TYPE_POINTER;
1491 else if (strcasecmp(args[1], "KEYBOARD") == 0) {
1492 type = ICO_INPUT_MGR_DEVICE_TYPE_KEYBOARD;
1494 else if (strcasecmp(args[1], "TOUCH") == 0) {
1495 type = ICO_INPUT_MGR_DEVICE_TYPE_TOUCH;
1497 else if (strcasecmp(args[1], "SWITCH") == 0) {
1498 type = ICO_INPUT_MGR_DEVICE_TYPE_SWITCH;
1500 else if (strcasecmp(args[1], "HAPTIC") == 0) {
1501 type = ICO_INPUT_MGR_DEVICE_TYPE_HAPTIC;
1504 type = strtol(args[1], (char **)0, 0);
1506 no = strtol(args[2], (char **)0, 0);
1507 if (strcasecmp(args[3], "ABS_X") == 0) {
1510 else if (strcasecmp(args[3], "ABS_Y") == 0) {
1513 else if (strcasecmp(args[3], "ABS_Z") == 0) {
1516 else if (strcasecmp(args[3], "REL_X") == 0) {
1517 code = REL_X | (EV_REL << 16);
1519 else if (strcasecmp(args[3], "REL_Y") == 0) {
1520 code = REL_Y | (EV_REL << 16);
1522 else if (strcasecmp(args[3], "REL_Z") == 0) {
1523 code = REL_Z | (EV_REL << 16);
1525 else if (strcasecmp(args[3], "BTN_TOUCH") == 0) {
1528 else if (strcasecmp(args[3], "BTN_LEFT") == 0) {
1531 else if (strcasecmp(args[3], "BTN_RIGHT") == 0) {
1534 else if (strcasecmp(args[3], "BTN_MIDDLE") == 0) {
1537 else if (strcasecmp(args[3], "BTN_RIGHT") == 0) {
1541 code = strtol(args[3], (char **)0, 0);
1543 value = strtol(args[4], (char **)0, 0);
1545 value = (value << 16) + strtol(args[5], (char **)0, 0);
1547 print_log("HOMESCREEN: input_send(%s.%x,%d,%d,%x,%d)",
1548 appid, surfaceid, type, no, code, value);
1549 ico_input_mgr_control_send_input_event(display->ico_input_mgr,
1550 appid, surfaceid, type, no, 0, code, value);
1553 print_log("HOMESCREEN: input_send command[input_send {@app/serface} type no code "
1554 "value [value2]] has no argument");
1559 input_conf(struct display *display, char *buf)
1566 char wk1[32], wk2[32];
1568 narg = pars_command(buf, args, 10);
1570 type = strtol(args[1], (char **)0, 0);
1571 input = strtol(args[3], (char **)0, 0);
1573 code = strtol(args[5], (char **)0, 0);
1578 strcpy(wk1, args[2]);
1582 if ((type >= 0) && (input >= 0) && (code >=0)) {
1583 ico_input_mgr_device_configure_input(display->ico_input_device, args[0], type,
1584 args[2], input, args[4], code);
1587 print_log("HOMESCREEN: Unknown type(%s),input(%s) or code(%s) "
1588 "at input_conf command", args[1], args[3], args[5]);
1592 print_log("HOMESCREEN: input_conf command[input_conf device type swname input "
1593 "codename code] has no argument");
1598 input_code(struct display *display, char *buf)
1605 narg = pars_command(buf, args, 10);
1607 input = strtol(args[1], (char **)0, 0);
1608 code = strtol(args[3], (char **)0, 0);
1609 if ((input >= 0) && (code >= 0)) {
1610 ico_input_mgr_device_configure_code(display->ico_input_device, args[0], input,
1614 print_log("HOMESCREEN: Unknown input(%s) or code(%s) "
1615 "at input_code command", args[1], args[3]);
1619 print_log("HOMESCREEN: input_conf command[input_code device input codename code] "
1625 input_sw(struct display *display, char *buf)
1635 narg = pars_command(buf, args, 10);
1637 input = strtol(args[1], (char **)0, 0);
1638 code = strtol(args[2], (char **)0, 0);
1639 state = strtol(args[3], (char **)0, 0);
1640 if ((input >= 0) && (state >= 0)) {
1641 gettimeofday(&stv, (struct timezone *)NULL);
1642 timems = (stv.tv_sec % 1000) * 1000 + (stv.tv_usec / 1000);
1643 ico_input_mgr_device_input_event(display->ico_input_device,
1644 timems, args[0], input, code, state);
1647 print_log("HOMESCREEN: Unknown input(%s),code(%s) or state(%s) "
1648 "at input_sw command", args[1], args[2], args[3]);
1652 print_log("HOMESCREEN: input_sw command[input_sw device input code, state] "
1658 send_event(const char *cmd)
1660 static int nmqinfo = 0;
1677 for (pt = 0; cmd[pt]; pt++) {
1678 if ((cmd[pt] >= '0') && (cmd[pt] <= '9')) {
1679 mqkey = mqkey * 10 + cmd[pt] - '0';
1685 for (; cmd[pt] == ' '; pt++) ;
1691 for (i = 0; i < nmqinfo; i++) {
1692 if (mqinfo[i].mqkey == mqkey) {
1693 mqid = mqinfo[i].mqid;
1698 if (nmqinfo >= 10) {
1699 fprintf(stderr, "HOMESCREEN: message queue(%d) overflow\n", mqkey);
1702 mqid = msgget(mqkey, 0);
1704 fprintf(stderr, "HOMESCREEN: message queue(%d(0x%x)) get error[%d]\n",
1705 mqkey, mqkey, errno);
1708 mqinfo[nmqinfo].mqkey = mqkey;
1709 mqinfo[nmqinfo].mqid = mqid;
1713 memset(&mqbuf, 0, sizeof(mqbuf));
1715 strncpy(mqbuf.buf, &cmd[pt], sizeof(mqbuf)-sizeof(long));
1717 if (msgsnd(mqid, &mqbuf, sizeof(mqbuf)-sizeof(long), 0) < 0) {
1718 fprintf(stderr, "HOMESCREEN: message queue(%d(0x%x)) send error[%d]\n",
1719 mqkey, mqkey, errno);
1725 set_region(struct display *display, char *buf)
1729 int x, y, width, height;
1731 int c_x, c_y, c_width, c_height;
1733 narg = pars_command(buf, args, 10);
1735 x = strtol(args[1], (char **)0, 0);
1736 y = strtol(args[2], (char **)0, 0);
1737 width = strtol(args[3], (char **)0, 0);
1738 height = strtol(args[4], (char **)0, 0);
1739 hot_x = x + (width / 2);
1740 hot_y = y + (height / 2);
1743 c_width = width - 10;
1744 if (c_width <= 0) c_width = 2;
1745 c_height = height - 10;
1746 if (c_height <= 0) c_height = 2;
1747 print_log("HOMESCREEN: ico_exinput_set_input_region(%s,%d,%d-%d,%d,"
1748 "hot=%d,%d,cur=%d,%d-%d,%d,attr=0)",
1749 args[0] ? args[0] : "(null)", x, y, width, height,
1750 hot_x, hot_y, c_x, c_y, c_width, c_height);
1751 if (strcasecmp(args[0], "NULL") == 0) {
1752 ico_exinput_set_input_region(display->ico_exinput, "", x, y,
1753 width, height, hot_x, hot_y, c_x, c_y,
1754 c_width, c_height, 0);
1757 ico_exinput_set_input_region(display->ico_exinput, args[0], x, y,
1758 width, height, hot_x, hot_y, c_x, c_y,
1759 c_width, c_height, 0);
1763 print_log("HOMESCREEN: set_region command[set_region winname@appid x y "
1764 "width height] has no argument");
1769 unset_region(struct display *display, char *buf)
1773 int x, y, width, height;
1775 narg = pars_command(buf, args, 10);
1778 x = strtol(args[1], (char **)0, 0);
1779 y = strtol(args[2], (char **)0, 0);
1780 width = strtol(args[3], (char **)0, 0);
1781 height = strtol(args[4], (char **)0, 0);
1789 print_log("HOMESCREEN: ico_exinput_unset_input_region(%s,08x,%d,%d-%d,%d)",
1790 args[0] ? args[0] : "(null)", x, y, width, height);
1791 if (strcasecmp(args[0], "NULL") == 0) {
1792 ico_exinput_unset_input_region(display->ico_exinput, "", x, y,
1796 ico_exinput_unset_input_region(display->ico_exinput, args[0],
1797 x, y, width, height);
1801 print_log("HOMESCREEN: unset_region command[unset_region winname@appid x y "
1802 "width height] has no argument");
1810 * test-homescreen < test-case-data-file > test-result-output
1812 int main(int argc, char *argv[])
1814 struct display *display;
1818 #if 1 /* use mkostemp */
1819 extern int mkostemp(char *template, int flags);
1820 #else /* use mkostemp */
1822 #endif /* use mkostemp */
1824 display = malloc(sizeof *display);
1826 memset((char *)display, 0, sizeof *display);
1828 display->init_width = 640;
1829 display->init_height = 480;
1830 display->init_color = 0xFF304010;
1832 for (fd = 1; fd < argc; fd++) {
1833 if (argv[fd][0] == '-') {
1834 if (strncasecmp(argv[fd], "-visible=", 9) == 0) {
1835 display->visible_on_create = argv[fd][9] & 1;
1837 else if (strncasecmp(argv[fd], "-display=", 9) == 0) {
1838 strncpy(display->connect, &argv[fd][9], MAX_CON_NAME);
1840 else if (strncasecmp(argv[fd], "-prompt=", 8) == 0) {
1841 display->prompt = argv[fd][8] & 1;
1846 if (display->connect[0]) {
1847 display->display = wl_display_connect(display->connect);
1850 display->display = wl_display_connect(NULL);
1852 assert(display->display);
1854 display->registry = wl_display_get_registry(display->display);
1855 wl_registry_add_listener(display->registry, ®istry_listener, display);
1856 wl_display_dispatch(display->display);
1861 sleep_with_wayland(display->display, 20);
1862 if (display->prompt) {
1863 printf("HOMESCREEN> "); fflush(stdout);
1865 ret = getdata(display->ico_window_mgr, "HOMESCREEN> ", fd, buf, sizeof(buf));
1867 fprintf(stderr, "HOMESCREEN: read error: fd %d, %m\n", fd);
1870 if (ret == 0) continue;
1871 wl_display_flush(display->display);
1873 if ((strncasecmp(buf, "bye", 3) == 0) ||
1874 (strncasecmp(buf, "quit", 4) == 0) ||
1875 (strncasecmp(buf, "end", 3) == 0)) {
1876 /* Exit, end of test */
1879 else if (strncasecmp(buf, "launch", 6) == 0) {
1880 /* Launch test application */
1881 launch_app(display, &buf[6]);
1883 else if (strncasecmp(buf, "kill", 4) == 0) {
1884 /* Launch test application */
1885 kill_app(display, &buf[4]);
1887 else if (strncasecmp(buf, "layer_visible", 13) == 0) {
1888 /* Change layer visiblety */
1889 visible_layer(display, &buf[13]);
1891 else if (strncasecmp(buf, "layer", 5) == 0) {
1892 /* layer change surface window */
1893 layer_surface(display, &buf[5]);
1895 else if (strncasecmp(buf, "positionsize", 12) == 0) {
1896 /* Move and Ressize surface window*/
1897 positionsize_surface(display, &buf[12]);
1899 else if (strncasecmp(buf, "move", 4) == 0) {
1900 /* Move surface window */
1901 move_surface(display, &buf[4]);
1903 else if (strncasecmp(buf, "resize", 6) == 0) {
1904 /* Resize surface window */
1905 resize_surface(display, &buf[6]);
1907 else if (strncasecmp(buf, "visible", 7) == 0) {
1908 /* Visible and Raise surface window*/
1909 visible_surface(display, &buf[7]);
1911 else if (strncasecmp(buf, "show", 4) == 0) {
1912 /* Show/Hide surface window */
1913 show_surface(display, &buf[4], 1);
1915 else if (strncasecmp(buf, "hide", 4) == 0) {
1916 /* Show/Hide surface window */
1917 show_surface(display, &buf[4], 0);
1919 else if (strncasecmp(buf, "raise", 5) == 0) {
1920 /* Raise/Lower surface window */
1921 raise_surface(display, &buf[5], 1);
1923 else if (strncasecmp(buf, "lower", 5) == 0) {
1924 /* Raise/Lower surface window */
1925 raise_surface(display, &buf[5], 0);
1927 else if (strncasecmp(buf, "active", 6) == 0) {
1928 /* Active surface window */
1929 active_window(display, &buf[6]);
1931 else if (strncasecmp(buf, "animation", 9) == 0) {
1932 /* Set animation surface window */
1933 animation_surface(display, &buf[9]);
1935 else if (strncasecmp(buf, "map", 3) == 0) {
1937 map_surface(display, &buf[3], 1);
1939 else if (strncasecmp(buf, "unmap", 5) == 0) {
1941 map_surface(display, &buf[5], 0);
1943 else if (strncasecmp(buf, "input_add", 9) == 0) {
1944 /* Set input switch to application */
1945 input_add(display, &buf[9]);
1947 else if (strncasecmp(buf, "input_del", 9) == 0) {
1948 /* Reset input switch to application*/
1949 input_del(display, &buf[9]);
1951 else if (strncasecmp(buf, "input_send", 10) == 0) {
1952 /* Input event send to application*/
1953 input_send(display, &buf[10]);
1955 else if (strncasecmp(buf, "input_conf", 10) == 0) {
1956 /* input switch configuration */
1957 input_conf(display, &buf[10]);
1959 else if (strncasecmp(buf, "input_code", 10) == 0) {
1960 /* input code configuration */
1961 input_code(display, &buf[10]);
1963 else if (strncasecmp(buf, "input_sw", 8) == 0) {
1964 /* input switch event */
1965 input_sw(display, &buf[8]);
1967 else if (strncasecmp(buf, "set_region", 10) == 0) {
1968 /* set input region */
1969 set_region(display, &buf[10]);
1971 else if (strncasecmp(buf, "unset_region", 12) == 0) {
1972 /* unset input region */
1973 unset_region(display, &buf[12]);
1975 else if (strncasecmp(buf, "input_sw", 8) == 0) {
1976 /* input switch event */
1977 input_sw(display, &buf[8]);
1979 else if (strncasecmp(buf, "sleep", 5) == 0) {
1981 msec = sec_str_2_value(&buf[6]);
1982 sleep_with_wayland(display->display, msec);
1984 else if (strncasecmp(buf, "waitcreate", 10) == 0) {
1985 /* Wait surface create */
1986 msec = sec_str_2_value(&buf[11]);
1987 wait_with_wayland(display->display, msec, &display->surface_created);
1989 else if (strncasecmp(buf, "waitdestroy", 11) == 0) {
1990 /* Wait surface destrpy */
1991 msec = sec_str_2_value(&buf[12]);
1992 wait_with_wayland(display->display, msec, &display->surface_destroyed);
1994 else if (strncasecmp(buf, "event", 5) == 0) {
1995 /* Send touch panel event to Weston */
1996 send_event(&buf[6]);
1999 print_log("HOMESCREEN: unknown command[%s]", buf);
2004 print_log("HOMESCREEN: end");