From 59fb43fa95a212af20009247332b4c5c34302b1f Mon Sep 17 00:00:00 2001 From: Manuel Bachmann Date: Wed, 13 Jan 2016 18:36:55 +0000 Subject: [PATCH] Migrate IVI-Shell backport to Weston 1.8.0 (Yocto 2.0) (NOTICE : this is the last patch necessary to fully migrate to Yocto 2.0) As newer Poky "Jethro" is now providing Weston 1.8.0, adapt IVI-Shell 1.9.0 backport to it. Remove unnecessary patches (touchscreen support for Qt, panel toggle) which are now upstreamed. Make the systemd service recipe name more generic. Change-Id: Icaad3f40b29617bcb33ac235bbe3c65f7f4bdbd7 Signed-off-by: Manuel Bachmann --- ...es-made-in-libinput-src-evdev.c-for-touch.patch | 65 - ...ll-add-option-to-avoid-creating-the-panel.patch | 99 - .../{weston_1.5.0.bbappend => weston_%.bbappend} | 2 - ...Shell-Backport-from-Weston-1.9.0-to-1.5.0.patch | 10478 ------------------- ...Shell-Backport-from-Weston-1.9.0-to-1.8.0.patch | 2392 +++++ .../wayland/weston-ivi-shell/data/background.png | Bin 245579 -> 0 bytes .../wayland/weston-ivi-shell/data/fullscreen.png | Bin 3406 -> 0 bytes .../wayland/weston-ivi-shell/data/home.png | Bin 4629 -> 0 bytes .../weston-ivi-shell/data/icon_ivi_clickdot.png | Bin 39523 -> 0 bytes .../weston-ivi-shell/data/icon_ivi_flower.png | Bin 24475 -> 0 bytes .../weston-ivi-shell/data/icon_ivi_simple-egl.png | Bin 29316 -> 0 bytes .../weston-ivi-shell/data/icon_ivi_simple-shm.png | Bin 71120 -> 0 bytes .../weston-ivi-shell/data/icon_ivi_smoke.png | Bin 46577 -> 0 bytes .../wayland/weston-ivi-shell/data/panel.png | Bin 41955 -> 0 bytes .../wayland/weston-ivi-shell/data/random.png | Bin 4891 -> 0 bytes .../wayland/weston-ivi-shell/data/sidebyside.png | Bin 3929 -> 0 bytes .../wayland/weston-ivi-shell/data/tiling.png | Bin 5620 -> 0 bytes .../recipes-graphics/wayland/weston_1.5.0.bbappend | 24 - .../recipes-graphics/wayland/weston_1.8.0.bbappend | 9 + 19 files changed, 2401 insertions(+), 10668 deletions(-) delete mode 100644 meta-agl/recipes-graphics/wayland/weston/0001-Adapt-changes-made-in-libinput-src-evdev.c-for-touch.patch delete mode 100644 meta-agl/recipes-graphics/wayland/weston/0001-desktop-shell-add-option-to-avoid-creating-the-panel.patch rename meta-agl/recipes-graphics/wayland/{weston_1.5.0.bbappend => weston_%.bbappend} (81%) delete mode 100644 meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/0001-IVI-Shell-Backport-from-Weston-1.9.0-to-1.5.0.patch create mode 100644 meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/0001-IVI-Shell-Backport-from-Weston-1.9.0-to-1.8.0.patch delete mode 100644 meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/background.png delete mode 100644 meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/fullscreen.png delete mode 100644 meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/home.png delete mode 100644 meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/icon_ivi_clickdot.png delete mode 100644 meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/icon_ivi_flower.png delete mode 100644 meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/icon_ivi_simple-egl.png delete mode 100644 meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/icon_ivi_simple-shm.png delete mode 100644 meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/icon_ivi_smoke.png delete mode 100644 meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/panel.png delete mode 100644 meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/random.png delete mode 100644 meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/sidebyside.png delete mode 100644 meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/tiling.png delete mode 100644 meta-ivi-common/recipes-graphics/wayland/weston_1.5.0.bbappend create mode 100644 meta-ivi-common/recipes-graphics/wayland/weston_1.8.0.bbappend diff --git a/meta-agl/recipes-graphics/wayland/weston/0001-Adapt-changes-made-in-libinput-src-evdev.c-for-touch.patch b/meta-agl/recipes-graphics/wayland/weston/0001-Adapt-changes-made-in-libinput-src-evdev.c-for-touch.patch deleted file mode 100644 index 1bb9253d4..000000000 --- a/meta-agl/recipes-graphics/wayland/weston/0001-Adapt-changes-made-in-libinput-src-evdev.c-for-touch.patch +++ /dev/null @@ -1,65 +0,0 @@ -From c4633014fff25d32926129a8b028124c6338bb2b Mon Sep 17 00:00:00 2001 -From: Louai Al-Khanji -Date: Wed, 19 Aug 2015 09:04:46 +0300 -Subject: [PATCH 1/1] Adapt changes made in libinput/src/evdev.c for touch - frame emission. - ---- - src/evdev.c | 27 +++++++++++++++++++++++++++ - 1 file changed, 27 insertions(+) - -diff --git a/src/evdev.c b/src/evdev.c -index 888dfbd..daa5d72 100644 ---- a/src/evdev.c -+++ b/src/evdev.c -@@ -359,12 +359,36 @@ evdev_process_absolute(struct evdev_device *device, - } - } - -+static inline int -+evdev_need_touch_frame(struct evdev_device *device) -+{ -+ if (!(device->seat_caps & EVDEV_SEAT_TOUCH)) -+ return 0; -+ -+ switch (device->pending_event) { -+ case EVDEV_NONE: -+ case EVDEV_RELATIVE_MOTION: -+ break; -+ case EVDEV_ABSOLUTE_MT_DOWN: -+ case EVDEV_ABSOLUTE_MT_MOTION: -+ case EVDEV_ABSOLUTE_MT_UP: -+ case EVDEV_ABSOLUTE_TOUCH_DOWN: -+ case EVDEV_ABSOLUTE_TOUCH_UP: -+ case EVDEV_ABSOLUTE_MOTION: -+ return 1; -+ } -+ -+ return 0; -+} -+ - static void - fallback_process(struct evdev_dispatch *dispatch, - struct evdev_device *device, - struct input_event *event, - uint32_t time) - { -+ int need_frame = 0; -+ - switch (event->type) { - case EV_REL: - evdev_process_relative(device, event, time); -@@ -376,7 +400,10 @@ fallback_process(struct evdev_dispatch *dispatch, - evdev_process_key(device, event, time); - break; - case EV_SYN: -+ need_frame = evdev_need_touch_frame(device); - evdev_flush_pending_event(device, time); -+ if (need_frame) -+ notify_touch_frame(device->seat); - break; - } - } --- -2.1.4 - diff --git a/meta-agl/recipes-graphics/wayland/weston/0001-desktop-shell-add-option-to-avoid-creating-the-panel.patch b/meta-agl/recipes-graphics/wayland/weston/0001-desktop-shell-add-option-to-avoid-creating-the-panel.patch deleted file mode 100644 index 5e8c3c9dc..000000000 --- a/meta-agl/recipes-graphics/wayland/weston/0001-desktop-shell-add-option-to-avoid-creating-the-panel.patch +++ /dev/null @@ -1,99 +0,0 @@ -From e67118c80ad411ac46b7096aae2635510c80ea6d Mon Sep 17 00:00:00 2001 -From: Jonny Lamb -Date: Tue, 12 Aug 2014 15:07:51 +0200 -Subject: desktop-shell: add option to avoid creating the panel - -This option is so we can disable showing any panel at all. The default -is to continue showing the panel and no example is added to weston.ini -because it's an uncommon request. - -Tested-by: Pekka Paalanen ---- - ---- a/clients/desktop-shell.c 2015-11-05 11:51:26.272052133 +0000 -+++ b/clients/desktop-shell.c 2015-11-05 11:56:19.666887702 +0000 -@@ -1130,7 +1130,8 @@ - output_destroy(struct output *output) - { - background_destroy(output->background); -- panel_destroy(output->panel); -+ if (output->panel) -+ panel_destroy(output->panel); - wl_output_destroy(output->output); - wl_list_remove(&output->link); - -@@ -1160,7 +1161,8 @@ - { - struct output *output = data; - -- window_set_buffer_transform(output->panel->window, transform); -+ if (output->panel) -+ window_set_buffer_transform(output->panel->window, transform); - window_set_buffer_transform(output->background->window, transform); - } - -@@ -1187,7 +1189,8 @@ - { - struct output *output = data; - -- window_set_buffer_scale(output->panel->window, scale); -+ if (output->panel) -+ window_set_buffer_scale(output->panel->window, scale); - window_set_buffer_scale(output->background->window, scale); - } - -@@ -1198,15 +1201,36 @@ - output_handle_scale - }; - -+static int -+want_panel(struct desktop *desktop) -+{ -+ struct weston_config_section *s; -+ char *location = NULL; -+ int ret = 1; -+ -+ s = weston_config_get_section(desktop->config, "shell", NULL, NULL); -+ weston_config_section_get_string(s, "panel-location", -+ &location, "top"); -+ -+ if (strcmp(location, "top") != 0) -+ ret = 0; -+ -+ free(location); -+ -+ return ret; -+} -+ - static void - output_init(struct output *output, struct desktop *desktop) - { - struct wl_surface *surface; - -- output->panel = panel_create(desktop); -- surface = window_get_wl_surface(output->panel->window); -- desktop_shell_set_panel(desktop->shell, -- output->output, surface); -+ if (want_panel(desktop)) { -+ output->panel = panel_create(desktop); -+ surface = window_get_wl_surface(output->panel->window); -+ desktop_shell_set_panel(desktop->shell, -+ output->output, surface); -+ } - - output->background = background_create(desktop); - surface = window_get_wl_surface(output->background->window); ---- a/man/weston.ini.man 2015-11-05 11:56:36.763111313 +0000 -+++ b/man/weston.ini.man 2015-11-05 12:06:57.097226512 +0000 -@@ -186,6 +186,11 @@ - .fi - .RE - .TP 7 -+.BI "panel-location=" top -+sets the location of the panel (string). Can be -+.B top, -+.B none. -+.TP 7 - .BI "locking=" true - enables screen locking (boolean). - .TP 7 diff --git a/meta-agl/recipes-graphics/wayland/weston_1.5.0.bbappend b/meta-agl/recipes-graphics/wayland/weston_%.bbappend similarity index 81% rename from meta-agl/recipes-graphics/wayland/weston_1.5.0.bbappend rename to meta-agl/recipes-graphics/wayland/weston_%.bbappend index 7167388d4..2ee7150e5 100644 --- a/meta-agl/recipes-graphics/wayland/weston_1.5.0.bbappend +++ b/meta-agl/recipes-graphics/wayland/weston_%.bbappend @@ -1,8 +1,6 @@ FILESEXTRAPATHS_append := ":${THISDIR}/${PN}" SRC_URI_append = "\ - file://0001-desktop-shell-add-option-to-avoid-creating-the-panel.patch \ - file://0001-Adapt-changes-made-in-libinput-src-evdev.c-for-touch.patch \ file://weston.service \ file://weston.ini \ " diff --git a/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/0001-IVI-Shell-Backport-from-Weston-1.9.0-to-1.5.0.patch b/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/0001-IVI-Shell-Backport-from-Weston-1.9.0-to-1.5.0.patch deleted file mode 100644 index 0e5a99f0b..000000000 --- a/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/0001-IVI-Shell-Backport-from-Weston-1.9.0-to-1.5.0.patch +++ /dev/null @@ -1,10478 +0,0 @@ -From 9e55f4f9c921782263b784e7f6e0e9b0fc9095ca Mon Sep 17 00:00:00 2001 -From: Manuel Bachmann -Date: Mon, 28 Sep 2015 04:45:19 +0200 -Subject: [PATCH] Backport IVI-Shell from Weston 1.9.0 to 1.5.0 - -IVI-Shell is the alternative Weston shell implementing the -eponymous protocol, and supported in client toolkits such -as EFL, Qt... - -We backport only the necessary, without touching the core -compositor if possible (was only necessary for surface -copying logic which had a patch in Tizen IVI). - -Signed-off-by: Manuel Bachmann ---- - Makefile.am | 113 +- - clients/ivi-shell-user-interface.c | 1312 ++++++++++++++++ - clients/simple-egl.c | 78 +- - clients/simple-shm.c | 37 + - clients/window.c | 57 +- - configure.ac | 9 + - data/background.png | Bin 0 -> 245579 bytes - data/fullscreen.png | Bin 0 -> 3406 bytes - data/home.png | Bin 0 -> 4629 bytes - data/icon_ivi_clickdot.png | Bin 0 -> 39523 bytes - data/icon_ivi_flower.png | Bin 0 -> 24475 bytes - data/icon_ivi_simple-egl.png | Bin 0 -> 29316 bytes - data/icon_ivi_simple-shm.png | Bin 0 -> 71120 bytes - data/icon_ivi_smoke.png | Bin 0 -> 46577 bytes - data/panel.png | Bin 0 -> 41955 bytes - data/random.png | Bin 0 -> 4891 bytes - data/sidebyside.png | Bin 0 -> 3929 bytes - data/tiling.png | Bin 0 -> 5620 bytes - ivi-shell/hmi-controller.c | 1814 ++++++++++++++++++++++ - ivi-shell/input-panel-ivi.c | 397 +++++ - ivi-shell/ivi-layout-export.h | 813 ++++++++++ - ivi-shell/ivi-layout-private.h | 229 +++ - ivi-shell/ivi-layout-transition.c | 871 +++++++++++ - ivi-shell/ivi-layout.c | 3011 ++++++++++++++++++++++++++++++++++++ - ivi-shell/ivi-shell.c | 469 ++++++ - ivi-shell/ivi-shell.h | 67 + - ivi-shell/weston.ini.in | 98 ++ - protocol/ivi-application.xml | 100 ++ - protocol/ivi-hmi-controller.xml | 98 ++ - shared/helpers.h | 96 ++ - src/compositor.c | 48 + - src/compositor.h | 20 + - src/gl-renderer.c | 150 ++ - src/pixman-renderer.c | 51 + - 34 files changed, 9915 insertions(+), 23 deletions(-) - create mode 100644 clients/ivi-shell-user-interface.c - create mode 100644 data/background.png - create mode 100644 data/fullscreen.png - create mode 100644 data/home.png - create mode 100644 data/icon_ivi_clickdot.png - create mode 100644 data/icon_ivi_flower.png - create mode 100644 data/icon_ivi_simple-egl.png - create mode 100644 data/icon_ivi_simple-shm.png - create mode 100644 data/icon_ivi_smoke.png - create mode 100644 data/panel.png - create mode 100644 data/random.png - create mode 100644 data/sidebyside.png - create mode 100644 data/tiling.png - create mode 100644 ivi-shell/hmi-controller.c - create mode 100644 ivi-shell/input-panel-ivi.c - create mode 100644 ivi-shell/ivi-layout-export.h - create mode 100644 ivi-shell/ivi-layout-private.h - create mode 100644 ivi-shell/ivi-layout-transition.c - create mode 100644 ivi-shell/ivi-layout.c - create mode 100644 ivi-shell/ivi-shell.c - create mode 100644 ivi-shell/ivi-shell.h - create mode 100644 ivi-shell/weston.ini.in - create mode 100644 protocol/ivi-application.xml - create mode 100644 protocol/ivi-hmi-controller.xml - create mode 100644 shared/helpers.h - -diff --git a/Makefile.am b/Makefile.am -index 343adc6..7649d7d 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -8,7 +8,7 @@ BUILT_SOURCES = - - DISTCHECK_CONFIGURE_FLAGS = --disable-setuid-install - --EXTRA_DIST = weston.ini.in -+EXTRA_DIST = weston.ini.in ivi-shell/weston.ini.in - - weston.ini : $(srcdir)/weston.ini.in - $(AM_V_GEN)$(SED) \ -@@ -17,7 +17,16 @@ weston.ini : $(srcdir)/weston.ini.in - -e 's|@libexecdir[@]|$(libexecdir)|g' \ - $< > $@ - --all-local : weston.ini -+ivi-shell/weston.ini : $(srcdir)/ivi-shell/weston.ini.in -+ $(AM_V_GEN)$(SED) \ -+ -e 's|@bindir[@]|$(bindir)|g' \ -+ -e 's|@abs_top_builddir[@]|$(abs_top_builddir)|g' \ -+ -e 's|@abs_top_srcdir[@]|$(abs_top_srcdir)|g' \ -+ -e 's|@libexecdir[@]|$(libexecdir)|g' \ -+ -e 's|@plugin_prefix[@]||g' \ -+ $< > $@ -+ -+all-local : weston.ini ivi-shell/weston.ini - - AM_CFLAGS = $(GCC_CFLAGS) - -@@ -33,7 +42,7 @@ AM_CPPFLAGS = \ - -DLIBEXECDIR='"$(libexecdir)"' \ - -DBINDIR='"$(bindir)"' - --CLEANFILES = weston.ini $(BUILT_SOURCES) -+CLEANFILES = weston.ini ivi-shell/weston.ini $(BUILT_SOURCES) - - bin_PROGRAMS += weston - -@@ -361,6 +370,11 @@ libexec_PROGRAMS += \ - weston-keyboard \ - weston-simple-im - -+if ENABLE_IVI_SHELL -+libexec_PROGRAMS += \ -+ weston-ivi-shell-user-interface -+endif -+ - demo_clients = \ - weston-flower \ - weston-image \ -@@ -394,7 +408,9 @@ nodist_weston_simple_shm_SOURCES = \ - protocol/xdg-shell-protocol.c \ - protocol/xdg-shell-client-protocol.h \ - protocol/fullscreen-shell-protocol.c \ -- protocol/fullscreen-shell-client-protocol.h -+ protocol/fullscreen-shell-client-protocol.h \ -+ protocol/ivi-application-protocol.c \ -+ protocol/ivi-application-client-protocol.h - weston_simple_shm_CFLAGS = $(AM_CFLAGS) $(SIMPLE_CLIENT_CFLAGS) - weston_simple_shm_LDADD = $(SIMPLE_CLIENT_LIBS) libshared.la - -@@ -412,7 +428,9 @@ demo_clients += weston-simple-egl - weston_simple_egl_SOURCES = clients/simple-egl.c - nodist_weston_simple_egl_SOURCES = \ - protocol/xdg-shell-protocol.c \ -- protocol/xdg-shell-client-protocol.h -+ protocol/xdg-shell-client-protocol.h \ -+ protocol/ivi-application-protocol.c \ -+ protocol/ivi-application-client-protocol.h - weston_simple_egl_CFLAGS = $(AM_CFLAGS) $(SIMPLE_EGL_CLIENT_CFLAGS) - weston_simple_egl_LDADD = $(SIMPLE_EGL_CLIENT_LIBS) -lm - endif -@@ -431,7 +449,9 @@ nodist_libtoytoolkit_la_SOURCES = \ - protocol/workspaces-protocol.c \ - protocol/workspaces-client-protocol.h \ - protocol/xdg-shell-protocol.c \ -- protocol/xdg-shell-client-protocol.h -+ protocol/xdg-shell-client-protocol.h \ -+ protocol/ivi-application-protocol.c \ -+ protocol/ivi-application-client-protocol.h - - BUILT_SOURCES += $(nodist_libtoytoolkit_la_SOURCES) - -@@ -570,6 +590,19 @@ nodist_weston_desktop_shell_SOURCES = \ - weston_desktop_shell_LDADD = libtoytoolkit.la - weston_desktop_shell_CFLAGS = $(AM_CFLAGS) $(CLIENT_CFLAGS) - -+if ENABLE_IVI_SHELL -+weston_ivi_shell_user_interface_SOURCES = \ -+ clients/ivi-shell-user-interface.c \ -+ shared/helpers.h -+nodist_weston_ivi_shell_user_interface_SOURCES = \ -+ protocol/ivi-hmi-controller-client-protocol.h \ -+ protocol/ivi-hmi-controller-protocol.c \ -+ protocol/ivi-application-client-protocol.h \ -+ protocol/ivi-application-protocol.c -+weston_ivi_shell_user_interface_LDADD = libtoytoolkit.la -+weston_ivi_shell_user_interface_CFLAGS = $(AM_CFLAGS) $(CLIENT_CFLAGS) -+endif -+ - if BUILD_FULL_GL_CLIENTS - demo_clients += weston-gears - weston_gears_SOURCES = clients/gears.c -@@ -616,8 +649,11 @@ BUILT_SOURCES += \ - protocol/fullscreen-shell-protocol.c \ - protocol/fullscreen-shell-client-protocol.h \ - protocol/xdg-shell-protocol.c \ -- protocol/xdg-shell-client-protocol.h -- -+ protocol/xdg-shell-client-protocol.h \ -+ protocol/ivi-hmi-controller-protocol.c \ -+ protocol/ivi-hmi-controller-client-protocol.h \ -+ protocol/ivi-application-protocol.c \ -+ protocol/ivi-application-client-protocol.h - - westondatadir = $(datadir)/weston - dist_westondata_DATA = \ -@@ -631,6 +667,21 @@ dist_westondata_DATA = \ - data/sign_maximize.png \ - data/sign_minimize.png - -+if ENABLE_IVI_SHELL -+dist_westondata_DATA += \ -+ data/background.png \ -+ data/tiling.png \ -+ data/fullscreen.png \ -+ data/panel.png \ -+ data/random.png \ -+ data/sidebyside.png \ -+ data/home.png \ -+ data/icon_ivi_clickdot.png \ -+ data/icon_ivi_flower.png \ -+ data/icon_ivi_simple-egl.png \ -+ data/icon_ivi_simple-shm.png \ -+ data/icon_ivi_smoke.png -+endif - - if BUILD_WCAP_TOOLS - bin_PROGRAMS += wcap-decode -@@ -700,6 +751,48 @@ nodist_fullscreen_shell_la_SOURCES = \ - BUILT_SOURCES += $(nodist_fullscreen_shell_la_SOURCES) - endif - -+if ENABLE_IVI_SHELL -+ -+module_LTLIBRARIES += \ -+ $(ivi_shell) \ -+ $(hmi_controller) -+ -+ivi_shell = ivi-shell.la -+ivi_shell_la_LDFLAGS = -module -avoid-version -+ivi_shell_la_LIBADD = $(COMPOSITOR_LIBS) libshared.la -+ivi_shell_la_CFLAGS = $(AM_CFLAGS) $(COMPOSITOR_CFLAGS) -+ivi_shell_la_SOURCES = \ -+ ivi-shell/ivi-layout-export.h \ -+ ivi-shell/ivi-layout-private.h \ -+ ivi-shell/ivi-layout.c \ -+ ivi-shell/ivi-layout-transition.c \ -+ ivi-shell/ivi-shell.h \ -+ ivi-shell/ivi-shell.c \ -+ ivi-shell/input-panel-ivi.c \ -+ shared/helpers.h -+nodist_ivi_shell_la_SOURCES = \ -+ protocol/ivi-application-protocol.c \ -+ protocol/ivi-application-server-protocol.h -+ -+BUILT_SOURCES += $(nodist_ivi_shell_la_SOURCES) -+ -+hmi_controller = hmi-controller.la -+hmi_controller_la_LDFLAGS = -module -avoid-version -+hmi_controller_la_LIBADD = $(COMPOSITOR_LIBS) libshared.la -+hmi_controller_la_CFLAGS = $(AM_CFLAGS) $(COMPOSITOR_CFLAGS) -+hmi_controller_la_SOURCES = \ -+ ivi-shell/ivi-layout-export.h \ -+ ivi-shell/hmi-controller.c \ -+ shared/helpers.h -+nodist_hmi_controller_la_SOURCES = \ -+ protocol/ivi-hmi-controller-protocol.c \ -+ protocol/ivi-hmi-controller-server-protocol.h -+ -+BUILT_SOURCES += $(nodist_hmi_controller_la_SOURCES) -+ -+endif -+ -+ - if ENABLE_SCREEN_SHARING - - module_LTLIBRARIES += screen-share.la -@@ -969,7 +1062,9 @@ EXTRA_DIST += \ - protocol/wayland-test.xml \ - protocol/xdg-shell.xml \ - protocol/fullscreen-shell.xml \ -- protocol/scaler.xml -+ protocol/scaler.xml \ -+ protocol/ivi-application.xml \ -+ protocol/ivi-hmi-controller.xml - - man_MANS = weston.1 weston.ini.5 - -diff --git a/clients/ivi-shell-user-interface.c b/clients/ivi-shell-user-interface.c -new file mode 100644 -index 0000000..dbe7a88 ---- /dev/null -+++ b/clients/ivi-shell-user-interface.c -@@ -0,0 +1,1312 @@ -+/* -+ * Copyright (C) 2013 DENSO CORPORATION -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining a -+ * copy of this software and associated documentation files (the "Software"), -+ * to deal in the Software without restriction, including without limitation -+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, -+ * and/or sell copies of the Software, and to permit persons to whom the -+ * Software is furnished to do so, subject to the following conditions: -+ * -+ * The above copyright notice and this permission notice (including the next -+ * paragraph) shall be included in all copies or substantial portions of the -+ * Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -+ * DEALINGS IN THE SOFTWARE. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "shared/cairo-util.h" -+#include "shared/config-parser.h" -+#include "shared/helpers.h" -+#include "shared/os-compatibility.h" -+#include "ivi-application-client-protocol.h" -+#include "ivi-hmi-controller-client-protocol.h" -+ -+/** -+ * A reference implementation how to use ivi-hmi-controller interface to -+ * interact with hmi-controller. This is launched from hmi-controller by using -+ * hmi_client_start and create a pthread. -+ * -+ * The basic flow is as followed, -+ * 1/ read configuration from weston.ini. -+ * 2/ draw png file to surface according to configuration of weston.ini -+ * 3/ set up UI by using ivi-hmi-controller protocol -+ * 4/ Enter event loop -+ * 5/ If a surface receives touch/pointer event, followings are invoked -+ * according to type of event and surface -+ * 5-1/ If a surface to launch ivi_application receive touch up, it execs -+ * ivi-application configured in weston.ini. -+ * 5-2/ If a surface to switch layout mode receive touch up, it sends a request, -+ * ivi_hmi_controller_switch_mode, to hmi-controller. -+ * 5-3/ If a surface to show workspace having launchers, it sends a request, -+ * ivi_hmi_controller_home, to hmi-controller. -+ * 5-4/ If touch down events happens in workspace, -+ * ivi_hmi_controller_workspace_control is sent to slide workspace. -+ * When control finished, event: ivi_hmi_controller_workspace_end_control -+ * is received. -+ */ -+ -+/***************************************************************************** -+ * structure, globals -+ ****************************************************************************/ -+enum cursor_type { -+ CURSOR_BOTTOM_LEFT, -+ CURSOR_BOTTOM_RIGHT, -+ CURSOR_BOTTOM, -+ CURSOR_DRAGGING, -+ CURSOR_LEFT_PTR, -+ CURSOR_LEFT, -+ CURSOR_RIGHT, -+ CURSOR_TOP_LEFT, -+ CURSOR_TOP_RIGHT, -+ CURSOR_TOP, -+ CURSOR_IBEAM, -+ CURSOR_HAND1, -+ CURSOR_WATCH, -+ -+ CURSOR_BLANK -+}; -+struct wlContextCommon { -+ struct wl_display *wlDisplay; -+ struct wl_registry *wlRegistry; -+ struct wl_compositor *wlCompositor; -+ struct wl_shm *wlShm; -+ uint32_t formats; -+ struct wl_seat *wlSeat; -+ struct wl_pointer *wlPointer; -+ struct wl_touch *wlTouch; -+ struct ivi_application *iviApplication; -+ struct ivi_hmi_controller *hmiCtrl; -+ struct hmi_homescreen_setting *hmi_setting; -+ struct wl_list list_wlContextStruct; -+ struct wl_surface *enterSurface; -+ int32_t is_home_on; -+ struct wl_cursor_theme *cursor_theme; -+ struct wl_cursor **cursors; -+ struct wl_surface *pointer_surface; -+ enum cursor_type current_cursor; -+ uint32_t enter_serial; -+}; -+ -+struct wlContextStruct { -+ struct wlContextCommon *cmm; -+ struct wl_surface *wlSurface; -+ struct wl_buffer *wlBuffer; -+ cairo_surface_t *ctx_image; -+ void *data; -+ uint32_t id_surface; -+ struct wl_list link; -+}; -+ -+struct -+hmi_homescreen_srf { -+ uint32_t id; -+ char *filePath; -+ uint32_t color; -+}; -+ -+struct -+hmi_homescreen_workspace { -+ struct wl_array launcher_id_array; -+ struct wl_list link; -+}; -+ -+struct -+hmi_homescreen_launcher { -+ uint32_t icon_surface_id; -+ uint32_t workspace_id; -+ char *icon; -+ char *path; -+ struct wl_list link; -+}; -+ -+struct -+hmi_homescreen_setting { -+ struct hmi_homescreen_srf background; -+ struct hmi_homescreen_srf panel; -+ struct hmi_homescreen_srf tiling; -+ struct hmi_homescreen_srf sidebyside; -+ struct hmi_homescreen_srf fullscreen; -+ struct hmi_homescreen_srf random; -+ struct hmi_homescreen_srf home; -+ struct hmi_homescreen_srf workspace_background; -+ -+ struct wl_list workspace_list; -+ struct wl_list launcher_list; -+ -+ char *cursor_theme; -+ int32_t cursor_size; -+ uint32_t transition_duration; -+}; -+ -+static void * -+fail_on_null(void *p, size_t size, char *file, int32_t line) -+{ -+ if (size && !p) { -+ fprintf(stderr, "%s(%d) %zd: out of memory\n", -+ file, line, size); -+ exit(EXIT_FAILURE); -+ } -+ -+ return p; -+} -+ -+static void * -+mem_alloc(size_t size, char *file, int32_t line) -+{ -+ return fail_on_null(calloc(1, size), size, file, line); -+} -+ -+#define MEM_ALLOC(s) mem_alloc((s),__FILE__,__LINE__) -+ -+/***************************************************************************** -+ * Event Handler -+ ****************************************************************************/ -+ -+static void -+shm_format(void *data, struct wl_shm *pWlShm, uint32_t format) -+{ -+ struct wlContextCommon *pCtx = data; -+ -+ pCtx->formats |= (1 << format); -+} -+ -+static struct wl_shm_listener shm_listenter = { -+ shm_format -+}; -+ -+static int32_t -+getIdOfWlSurface(struct wlContextCommon *pCtx, struct wl_surface *wlSurface) -+{ -+ struct wlContextStruct *pWlCtxSt = NULL; -+ -+ if (NULL == pCtx || NULL == wlSurface ) -+ return 0; -+ -+ wl_list_for_each(pWlCtxSt, &pCtx->list_wlContextStruct, link) { -+ if (pWlCtxSt->wlSurface == wlSurface) -+ return pWlCtxSt->id_surface; -+ } -+ -+ return -1; -+} -+ -+static void -+set_pointer_image(struct wlContextCommon *pCtx, uint32_t index) -+{ -+ struct wl_cursor *cursor = NULL; -+ struct wl_cursor_image *image = NULL; -+ struct wl_buffer *buffer = NULL; -+ -+ if (!pCtx->wlPointer || !pCtx->cursors) -+ return; -+ -+ if (CURSOR_BLANK == pCtx->current_cursor) { -+ wl_pointer_set_cursor(pCtx->wlPointer, pCtx->enter_serial, -+ NULL, 0, 0); -+ return; -+ } -+ -+ cursor = pCtx->cursors[pCtx->current_cursor]; -+ if (!cursor) -+ return; -+ -+ if (cursor->image_count <= index) { -+ fprintf(stderr, "cursor index out of range\n"); -+ return; -+ } -+ -+ image = cursor->images[index]; -+ buffer = wl_cursor_image_get_buffer(image); -+ -+ if (!buffer) -+ return; -+ -+ wl_pointer_set_cursor(pCtx->wlPointer, pCtx->enter_serial, -+ pCtx->pointer_surface, -+ image->hotspot_x, image->hotspot_y); -+ -+ wl_surface_attach(pCtx->pointer_surface, buffer, 0, 0); -+ -+ wl_surface_damage(pCtx->pointer_surface, 0, 0, -+ image->width, image->height); -+ -+ wl_surface_commit(pCtx->pointer_surface); -+} -+ -+static void -+PointerHandleEnter(void *data, struct wl_pointer *wlPointer, uint32_t serial, -+ struct wl_surface *wlSurface, wl_fixed_t sx, wl_fixed_t sy) -+{ -+ struct wlContextCommon *pCtx = data; -+ -+ pCtx->enter_serial = serial; -+ pCtx->enterSurface = wlSurface; -+ set_pointer_image(pCtx, 0); -+#ifdef _DEBUG -+ printf("ENTER PointerHandleEnter: x(%d), y(%d)\n", sx, sy); -+#endif -+} -+ -+static void -+PointerHandleLeave(void *data, struct wl_pointer *wlPointer, uint32_t serial, -+ struct wl_surface *wlSurface) -+{ -+ struct wlContextCommon *pCtx = data; -+ -+ pCtx->enterSurface = NULL; -+ -+#ifdef _DEBUG -+ printf("ENTER PointerHandleLeave: serial(%d)\n", serial); -+#endif -+} -+ -+static void -+PointerHandleMotion(void *data, struct wl_pointer *wlPointer, uint32_t time, -+ wl_fixed_t sx, wl_fixed_t sy) -+{ -+#ifdef _DEBUG -+ printf("ENTER PointerHandleMotion: x(%d), y(%d)\n", sx, sy); -+#endif -+} -+ -+/** -+ * if a surface assigned as launcher receives touch-off event, invoking -+ * ivi-application which configured in weston.ini with path to binary. -+ */ -+extern char **environ; /*defied by libc */ -+ -+static pid_t -+execute_process(char *path, char *argv[]) -+{ -+ pid_t pid = fork(); -+ if (pid < 0) -+ fprintf(stderr, "Failed to fork\n"); -+ -+ if (pid) -+ return pid; -+ -+ if (-1 == execve(path, argv, environ)) { -+ fprintf(stderr, "Failed to execve %s\n", path); -+ exit(1); -+ } -+ -+ return pid; -+} -+ -+static int32_t -+launcher_button(uint32_t surfaceId, struct wl_list *launcher_list) -+{ -+ struct hmi_homescreen_launcher *launcher = NULL; -+ -+ wl_list_for_each(launcher, launcher_list, link) { -+ char *argv[] = { NULL }; -+ -+ if (surfaceId != launcher->icon_surface_id) -+ continue; -+ -+ execute_process(launcher->path, argv); -+ -+ return 1; -+ } -+ -+ return 0; -+} -+ -+/** -+ * is-method to identify a surface set as launcher in workspace or workspace -+ * itself. This is-method is used to decide whether request; -+ * ivi_hmi_controller_workspace_control is sent or not. -+ */ -+static int32_t -+isWorkspaceSurface(uint32_t id, struct hmi_homescreen_setting *hmi_setting) -+{ -+ struct hmi_homescreen_launcher *launcher = NULL; -+ -+ if (id == hmi_setting->workspace_background.id) -+ return 1; -+ -+ wl_list_for_each(launcher, &hmi_setting->launcher_list, link) { -+ if (id == launcher->icon_surface_id) -+ return 1; -+ } -+ -+ return 0; -+} -+ -+/** -+ * Decide which request is sent to hmi-controller -+ */ -+static void -+touch_up(struct ivi_hmi_controller *hmi_ctrl, uint32_t id_surface, -+ int32_t *is_home_on, struct hmi_homescreen_setting *hmi_setting) -+{ -+ if (launcher_button(id_surface, &hmi_setting->launcher_list)) { -+ *is_home_on = 0; -+ ivi_hmi_controller_home(hmi_ctrl, IVI_HMI_CONTROLLER_HOME_OFF); -+ } else if (id_surface == hmi_setting->tiling.id) { -+ ivi_hmi_controller_switch_mode(hmi_ctrl, -+ IVI_HMI_CONTROLLER_LAYOUT_MODE_TILING); -+ } else if (id_surface == hmi_setting->sidebyside.id) { -+ ivi_hmi_controller_switch_mode(hmi_ctrl, -+ IVI_HMI_CONTROLLER_LAYOUT_MODE_SIDE_BY_SIDE); -+ } else if (id_surface == hmi_setting->fullscreen.id) { -+ ivi_hmi_controller_switch_mode(hmi_ctrl, -+ IVI_HMI_CONTROLLER_LAYOUT_MODE_FULL_SCREEN); -+ } else if (id_surface == hmi_setting->random.id) { -+ ivi_hmi_controller_switch_mode(hmi_ctrl, -+ IVI_HMI_CONTROLLER_LAYOUT_MODE_RANDOM); -+ } else if (id_surface == hmi_setting->home.id) { -+ *is_home_on = !(*is_home_on); -+ if (*is_home_on) { -+ ivi_hmi_controller_home(hmi_ctrl, -+ IVI_HMI_CONTROLLER_HOME_ON); -+ } else { -+ ivi_hmi_controller_home(hmi_ctrl, -+ IVI_HMI_CONTROLLER_HOME_OFF); -+ } -+ } -+} -+ -+/** -+ * Even handler of Pointer event. IVI system is usually manipulated by touch -+ * screen. However, some systems also have pointer device. -+ * Release is the same behavior as touch off -+ * Pressed is the same behavior as touch on -+ */ -+static void -+PointerHandleButton(void *data, struct wl_pointer *wlPointer, uint32_t serial, -+ uint32_t time, uint32_t button, uint32_t state) -+{ -+ struct wlContextCommon *pCtx = data; -+ struct ivi_hmi_controller *hmi_ctrl = pCtx->hmiCtrl; -+ const uint32_t id_surface = getIdOfWlSurface(pCtx, pCtx->enterSurface); -+ -+ if (BTN_RIGHT == button) -+ return; -+ -+ switch (state) { -+ case WL_POINTER_BUTTON_STATE_RELEASED: -+ touch_up(hmi_ctrl, id_surface, &pCtx->is_home_on, -+ pCtx->hmi_setting); -+ break; -+ -+ case WL_POINTER_BUTTON_STATE_PRESSED: -+ -+ if (isWorkspaceSurface(id_surface, pCtx->hmi_setting)) { -+ ivi_hmi_controller_workspace_control(hmi_ctrl, -+ pCtx->wlSeat, -+ serial); -+ } -+ -+ break; -+ } -+#ifdef _DEBUG -+ printf("ENTER PointerHandleButton: button(%d), state(%d)\n", -+ button, state); -+#endif -+} -+ -+static void -+PointerHandleAxis(void *data, struct wl_pointer *wlPointer, uint32_t time, -+ uint32_t axis, wl_fixed_t value) -+{ -+#ifdef _DEBUG -+ printf("ENTER PointerHandleAxis: axis(%d), value(%d)\n", axis, value); -+#endif -+} -+ -+static struct wl_pointer_listener pointer_listener = { -+ PointerHandleEnter, -+ PointerHandleLeave, -+ PointerHandleMotion, -+ PointerHandleButton, -+ PointerHandleAxis -+}; -+ -+/** -+ * Even handler of touch event -+ */ -+static void -+TouchHandleDown(void *data, struct wl_touch *wlTouch, uint32_t serial, -+ uint32_t time, struct wl_surface *surface, int32_t id, -+ wl_fixed_t x_w, wl_fixed_t y_w) -+{ -+ struct wlContextCommon *pCtx = data; -+ struct ivi_hmi_controller *hmi_ctrl = pCtx->hmiCtrl; -+ uint32_t id_surface = 0; -+ -+ if (0 == id) -+ pCtx->enterSurface = surface; -+ -+ id_surface = getIdOfWlSurface(pCtx, pCtx->enterSurface); -+ -+ /** -+ * When touch down happens on surfaces of workspace, ask -+ * hmi-controller to start control workspace to select page of -+ * workspace. After sending seat to hmi-controller by -+ * ivi_hmi_controller_workspace_control, -+ * hmi-controller-homescreen doesn't receive any event till -+ * hmi-controller sends back it. -+ */ -+ if (isWorkspaceSurface(id_surface, pCtx->hmi_setting)) { -+ ivi_hmi_controller_workspace_control(hmi_ctrl, pCtx->wlSeat, -+ serial); -+ } -+} -+ -+static void -+TouchHandleUp(void *data, struct wl_touch *wlTouch, uint32_t serial, -+ uint32_t time, int32_t id) -+{ -+ struct wlContextCommon *pCtx = data; -+ struct ivi_hmi_controller *hmi_ctrl = pCtx->hmiCtrl; -+ -+ const uint32_t id_surface = getIdOfWlSurface(pCtx, pCtx->enterSurface); -+ -+ /** -+ * triggering event according to touch-up happening on which surface. -+ */ -+ if (id == 0){ -+ touch_up(hmi_ctrl, id_surface, &pCtx->is_home_on, -+ pCtx->hmi_setting); -+ } -+} -+ -+static void -+TouchHandleMotion(void *data, struct wl_touch *wlTouch, uint32_t time, -+ int32_t id, wl_fixed_t x_w, wl_fixed_t y_w) -+{ -+} -+ -+static void -+TouchHandleFrame(void *data, struct wl_touch *wlTouch) -+{ -+} -+ -+static void -+TouchHandleCancel(void *data, struct wl_touch *wlTouch) -+{ -+} -+ -+static struct wl_touch_listener touch_listener = { -+ TouchHandleDown, -+ TouchHandleUp, -+ TouchHandleMotion, -+ TouchHandleFrame, -+ TouchHandleCancel, -+}; -+ -+/** -+ * Handler of capabilities -+ */ -+static void -+seat_handle_capabilities(void *data, struct wl_seat *seat, uint32_t caps) -+{ -+ struct wlContextCommon *p_wlCtx = (struct wlContextCommon*)data; -+ struct wl_seat *wlSeat = p_wlCtx->wlSeat; -+ struct wl_pointer *wlPointer = p_wlCtx->wlPointer; -+ struct wl_touch *wlTouch = p_wlCtx->wlTouch; -+ -+ if (p_wlCtx->hmi_setting->cursor_theme) { -+ if ((caps & WL_SEAT_CAPABILITY_POINTER) && !wlPointer){ -+ wlPointer = wl_seat_get_pointer(wlSeat); -+ wl_pointer_add_listener(wlPointer, -+ &pointer_listener, data); -+ } else -+ if (!(caps & WL_SEAT_CAPABILITY_POINTER) && wlPointer){ -+ wl_pointer_destroy(wlPointer); -+ wlPointer = NULL; -+ } -+ p_wlCtx->wlPointer = wlPointer; -+ } -+ -+ if ((caps & WL_SEAT_CAPABILITY_TOUCH) && !wlTouch){ -+ wlTouch = wl_seat_get_touch(wlSeat); -+ wl_touch_add_listener(wlTouch, &touch_listener, data); -+ } else -+ if (!(caps & WL_SEAT_CAPABILITY_TOUCH) && wlTouch){ -+ wl_touch_destroy(wlTouch); -+ wlTouch = NULL; -+ } -+ p_wlCtx->wlTouch = wlTouch; -+} -+ -+static struct wl_seat_listener seat_Listener = { -+ seat_handle_capabilities, -+}; -+ -+/** -+ * Registration of event -+ * This event is received when hmi-controller server finished controlling -+ * workspace. -+ */ -+static void -+ivi_hmi_controller_workspace_end_control(void *data, -+ struct ivi_hmi_controller *hmi_ctrl, -+ int32_t is_controlled) -+{ -+ struct wlContextCommon *pCtx = data; -+ const uint32_t id_surface = getIdOfWlSurface(pCtx, pCtx->enterSurface); -+ -+ if (is_controlled) -+ return; -+ -+ /** -+ * During being controlled by hmi-controller, any input event is not -+ * notified. So when control ends with touch up, it invokes launcher -+ * if up event happens on a launcher surface. -+ * -+ */ -+ if (launcher_button(id_surface, &pCtx->hmi_setting->launcher_list)) { -+ pCtx->is_home_on = 0; -+ ivi_hmi_controller_home(hmi_ctrl, IVI_HMI_CONTROLLER_HOME_OFF); -+ } -+} -+ -+static const struct ivi_hmi_controller_listener hmi_controller_listener = { -+ ivi_hmi_controller_workspace_end_control -+}; -+ -+/** -+ * Registration of interfaces -+ */ -+static void -+registry_handle_global(void *data, struct wl_registry *registry, uint32_t name, -+ const char *interface, uint32_t version) -+{ -+ struct wlContextCommon *p_wlCtx = (struct wlContextCommon*)data; -+ -+ if (!strcmp(interface, "wl_compositor")) { -+ p_wlCtx->wlCompositor = -+ wl_registry_bind(registry, name, -+ &wl_compositor_interface, 1); -+ } else if (!strcmp(interface, "wl_shm")) { -+ p_wlCtx->wlShm = -+ wl_registry_bind(registry, name, &wl_shm_interface, 1); -+ wl_shm_add_listener(p_wlCtx->wlShm, &shm_listenter, p_wlCtx); -+ } else if (!strcmp(interface, "wl_seat")) { -+ p_wlCtx->wlSeat = -+ wl_registry_bind(registry, name, &wl_seat_interface, 1); -+ wl_seat_add_listener(p_wlCtx->wlSeat, &seat_Listener, data); -+ } else if (!strcmp(interface, "ivi_application")) { -+ p_wlCtx->iviApplication = -+ wl_registry_bind(registry, name, -+ &ivi_application_interface, 1); -+ } else if (!strcmp(interface, "ivi_hmi_controller")) { -+ p_wlCtx->hmiCtrl = -+ wl_registry_bind(registry, name, -+ &ivi_hmi_controller_interface, 1); -+ -+ ivi_hmi_controller_add_listener(p_wlCtx->hmiCtrl, -+ &hmi_controller_listener, p_wlCtx); -+ } -+} -+ -+static void -+registry_handle_global_remove(void *data, struct wl_registry *registry, -+ uint32_t name) -+{ -+} -+ -+static const struct wl_registry_listener registry_listener = { -+ registry_handle_global, -+ registry_handle_global_remove -+}; -+ -+static void -+frame_listener_func(void *data, struct wl_callback *callback, uint32_t time) -+{ -+ if (callback) -+ wl_callback_destroy(callback); -+} -+ -+static const struct wl_callback_listener frame_listener = { -+ frame_listener_func -+}; -+ -+/* -+ * The following correspondences between file names and cursors was copied -+ * from: https://bugs.kde.org/attachment.cgi?id=67313 -+ */ -+static const char *bottom_left_corners[] = { -+ "bottom_left_corner", -+ "sw-resize", -+ "size_bdiag" -+}; -+ -+static const char *bottom_right_corners[] = { -+ "bottom_right_corner", -+ "se-resize", -+ "size_fdiag" -+}; -+ -+static const char *bottom_sides[] = { -+ "bottom_side", -+ "s-resize", -+ "size_ver" -+}; -+ -+static const char *grabbings[] = { -+ "grabbing", -+ "closedhand", -+ "208530c400c041818281048008011002" -+}; -+ -+static const char *left_ptrs[] = { -+ "left_ptr", -+ "default", -+ "top_left_arrow", -+ "left-arrow" -+}; -+ -+static const char *left_sides[] = { -+ "left_side", -+ "w-resize", -+ "size_hor" -+}; -+ -+static const char *right_sides[] = { -+ "right_side", -+ "e-resize", -+ "size_hor" -+}; -+ -+static const char *top_left_corners[] = { -+ "top_left_corner", -+ "nw-resize", -+ "size_fdiag" -+}; -+ -+static const char *top_right_corners[] = { -+ "top_right_corner", -+ "ne-resize", -+ "size_bdiag" -+}; -+ -+static const char *top_sides[] = { -+ "top_side", -+ "n-resize", -+ "size_ver" -+}; -+ -+static const char *xterms[] = { -+ "xterm", -+ "ibeam", -+ "text" -+}; -+ -+static const char *hand1s[] = { -+ "hand1", -+ "pointer", -+ "pointing_hand", -+ "e29285e634086352946a0e7090d73106" -+}; -+ -+static const char *watches[] = { -+ "watch", -+ "wait", -+ "0426c94ea35c87780ff01dc239897213" -+}; -+ -+struct cursor_alternatives { -+ const char **names; -+ size_t count; -+}; -+ -+static const struct cursor_alternatives cursors[] = { -+ { bottom_left_corners, ARRAY_LENGTH(bottom_left_corners) }, -+ { bottom_right_corners, ARRAY_LENGTH(bottom_right_corners) }, -+ { bottom_sides, ARRAY_LENGTH(bottom_sides) }, -+ { grabbings, ARRAY_LENGTH(grabbings) }, -+ { left_ptrs, ARRAY_LENGTH(left_ptrs) }, -+ { left_sides, ARRAY_LENGTH(left_sides) }, -+ { right_sides, ARRAY_LENGTH(right_sides) }, -+ { top_left_corners, ARRAY_LENGTH(top_left_corners) }, -+ { top_right_corners, ARRAY_LENGTH(top_right_corners) }, -+ { top_sides, ARRAY_LENGTH(top_sides) }, -+ { xterms, ARRAY_LENGTH(xterms) }, -+ { hand1s, ARRAY_LENGTH(hand1s) }, -+ { watches, ARRAY_LENGTH(watches) }, -+}; -+ -+static void -+create_cursors(struct wlContextCommon *cmm) -+{ -+ uint32_t i = 0; -+ uint32_t j = 0; -+ struct wl_cursor *cursor = NULL; -+ char *cursor_theme = cmm->hmi_setting->cursor_theme; -+ int32_t cursor_size = cmm->hmi_setting->cursor_size; -+ -+ cmm->cursor_theme = wl_cursor_theme_load(cursor_theme, cursor_size, -+ cmm->wlShm); -+ -+ cmm->cursors = -+ MEM_ALLOC(ARRAY_LENGTH(cursors) * sizeof(cmm->cursors[0])); -+ -+ for (i = 0; i < ARRAY_LENGTH(cursors); i++) { -+ cursor = NULL; -+ -+ for (j = 0; !cursor && j < cursors[i].count; ++j) { -+ cursor = wl_cursor_theme_get_cursor( -+ cmm->cursor_theme, cursors[i].names[j]); -+ } -+ -+ if (!cursor) { -+ fprintf(stderr, "could not load cursor '%s'\n", -+ cursors[i].names[0]); -+ } -+ -+ cmm->cursors[i] = cursor; -+ } -+} -+ -+static void -+destroy_cursors(struct wlContextCommon *cmm) -+{ -+ if (cmm->cursor_theme) -+ wl_cursor_theme_destroy(cmm->cursor_theme); -+ -+ free(cmm->cursors); -+} -+ -+/** -+ * Internal method to prepare parts of UI -+ */ -+static void -+createShmBuffer(struct wlContextStruct *p_wlCtx) -+{ -+ struct wl_shm_pool *pool; -+ -+ int fd = -1; -+ int size = 0; -+ int width = 0; -+ int height = 0; -+ int stride = 0; -+ -+ width = cairo_image_surface_get_width(p_wlCtx->ctx_image); -+ height = cairo_image_surface_get_height(p_wlCtx->ctx_image); -+ stride = cairo_image_surface_get_stride(p_wlCtx->ctx_image); -+ -+ size = stride * height; -+ -+ fd = os_create_anonymous_file(size); -+ if (fd < 0) { -+ fprintf(stderr, "creating a buffer file for %d B failed: %m\n", -+ size); -+ return ; -+ } -+ -+ p_wlCtx->data = -+ mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); -+ -+ if (MAP_FAILED == p_wlCtx->data) { -+ fprintf(stderr, "mmap failed: %m\n"); -+ close(fd); -+ return; -+ } -+ -+ pool = wl_shm_create_pool(p_wlCtx->cmm->wlShm, fd, size); -+ p_wlCtx->wlBuffer = wl_shm_pool_create_buffer(pool, 0, -+ width, -+ height, -+ stride, -+ WL_SHM_FORMAT_ARGB8888); -+ -+ if (NULL == p_wlCtx->wlBuffer) { -+ fprintf(stderr, "wl_shm_create_buffer failed: %m\n"); -+ close(fd); -+ return; -+ } -+ -+ wl_shm_pool_destroy(pool); -+ close(fd); -+} -+ -+static void -+destroyWLContextCommon(struct wlContextCommon *p_wlCtx) -+{ -+ destroy_cursors(p_wlCtx); -+ -+ if (p_wlCtx->pointer_surface) -+ wl_surface_destroy(p_wlCtx->pointer_surface); -+ -+ if (p_wlCtx->wlCompositor) -+ wl_compositor_destroy(p_wlCtx->wlCompositor); -+} -+ -+static void -+destroyWLContextStruct(struct wlContextStruct *p_wlCtx) -+{ -+ if (p_wlCtx->wlSurface) -+ wl_surface_destroy(p_wlCtx->wlSurface); -+ -+ if (p_wlCtx->ctx_image) { -+ cairo_surface_destroy(p_wlCtx->ctx_image); -+ p_wlCtx->ctx_image = NULL; -+ } -+} -+ -+static int -+createSurface(struct wlContextStruct *p_wlCtx) -+{ -+ p_wlCtx->wlSurface = -+ wl_compositor_create_surface(p_wlCtx->cmm->wlCompositor); -+ if (NULL == p_wlCtx->wlSurface) { -+ printf("Error: wl_compositor_create_surface failed.\n"); -+ destroyWLContextCommon(p_wlCtx->cmm); -+ abort(); -+ } -+ -+ return 0; -+} -+ -+static void -+drawImage(struct wlContextStruct *p_wlCtx) -+{ -+ struct wl_callback *callback; -+ -+ int width = 0; -+ int height = 0; -+ int stride = 0; -+ void *data = NULL; -+ -+ width = cairo_image_surface_get_width(p_wlCtx->ctx_image); -+ height = cairo_image_surface_get_height(p_wlCtx->ctx_image); -+ stride = cairo_image_surface_get_stride(p_wlCtx->ctx_image); -+ data = cairo_image_surface_get_data(p_wlCtx->ctx_image); -+ -+ memcpy(p_wlCtx->data, data, stride * height); -+ -+ wl_surface_attach(p_wlCtx->wlSurface, p_wlCtx->wlBuffer, 0, 0); -+ wl_surface_damage(p_wlCtx->wlSurface, 0, 0, width, height); -+ -+ callback = wl_surface_frame(p_wlCtx->wlSurface); -+ wl_callback_add_listener(callback, &frame_listener, NULL); -+ -+ wl_surface_commit(p_wlCtx->wlSurface); -+} -+ -+static void -+create_ivisurface(struct wlContextStruct *p_wlCtx, -+ uint32_t id_surface, -+ cairo_surface_t *surface) -+{ -+ struct ivi_surface *ivisurf = NULL; -+ -+ p_wlCtx->ctx_image = surface; -+ -+ p_wlCtx->id_surface = id_surface; -+ wl_list_init(&p_wlCtx->link); -+ wl_list_insert(&p_wlCtx->cmm->list_wlContextStruct, &p_wlCtx->link); -+ -+ createSurface(p_wlCtx); -+ createShmBuffer(p_wlCtx); -+ -+ ivisurf = ivi_application_surface_create(p_wlCtx->cmm->iviApplication, -+ id_surface, -+ p_wlCtx->wlSurface); -+ if (ivisurf == NULL) { -+ fprintf(stderr, "Failed to create ivi_client_surface\n"); -+ return; -+ } -+ -+ drawImage(p_wlCtx); -+} -+ -+static void -+create_ivisurfaceFromFile(struct wlContextStruct *p_wlCtx, -+ uint32_t id_surface, -+ const char *imageFile) -+{ -+ cairo_surface_t *surface = load_cairo_surface(imageFile); -+ -+ if (NULL == surface) { -+ fprintf(stderr, "Failed to load_cairo_surface %s\n", imageFile); -+ return; -+ } -+ -+ create_ivisurface(p_wlCtx, id_surface, surface); -+} -+ -+static void -+set_hex_color(cairo_t *cr, uint32_t color) -+{ -+ cairo_set_source_rgba(cr, -+ ((color >> 16) & 0xff) / 255.0, -+ ((color >> 8) & 0xff) / 255.0, -+ ((color >> 0) & 0xff) / 255.0, -+ ((color >> 24) & 0xff) / 255.0); -+} -+ -+static void -+create_ivisurfaceFromColor(struct wlContextStruct *p_wlCtx, -+ uint32_t id_surface, -+ uint32_t width, uint32_t height, -+ uint32_t color) -+{ -+ cairo_surface_t *surface = NULL; -+ cairo_t *cr = NULL; -+ -+ surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, -+ width, height); -+ -+ cr = cairo_create(surface); -+ cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); -+ cairo_rectangle(cr, 0, 0, width, height); -+ set_hex_color(cr, color); -+ cairo_fill(cr); -+ cairo_destroy(cr); -+ -+ create_ivisurface(p_wlCtx, id_surface, surface); -+} -+ -+static void -+UI_ready(struct ivi_hmi_controller *controller) -+{ -+ ivi_hmi_controller_UI_ready(controller); -+} -+ -+/** -+ * Internal method to set up UI by using ivi-hmi-controller -+ */ -+static void -+create_background(struct wlContextStruct *p_wlCtx, const uint32_t id_surface, -+ const char *imageFile) -+{ -+ create_ivisurfaceFromFile(p_wlCtx, id_surface, imageFile); -+} -+ -+static void -+create_panel(struct wlContextStruct *p_wlCtx, const uint32_t id_surface, -+ const char *imageFile) -+{ -+ create_ivisurfaceFromFile(p_wlCtx, id_surface, imageFile); -+} -+ -+static void -+create_button(struct wlContextStruct *p_wlCtx, const uint32_t id_surface, -+ const char *imageFile, uint32_t number) -+{ -+ create_ivisurfaceFromFile(p_wlCtx, id_surface, imageFile); -+} -+ -+static void -+create_home_button(struct wlContextStruct *p_wlCtx, const uint32_t id_surface, -+ const char *imageFile) -+{ -+ create_ivisurfaceFromFile(p_wlCtx, id_surface, imageFile); -+} -+ -+static void -+create_workspace_background(struct wlContextStruct *p_wlCtx, -+ struct hmi_homescreen_srf *srf) -+{ -+ create_ivisurfaceFromColor(p_wlCtx, srf->id, 1, 1, srf->color); -+} -+ -+static void -+create_launchers(struct wlContextCommon *cmm, struct wl_list *launcher_list) -+{ -+ struct hmi_homescreen_launcher **launchers; -+ struct hmi_homescreen_launcher *launcher = NULL; -+ -+ int launcher_count = wl_list_length(launcher_list); -+ int ii = 0; -+ int start = 0; -+ -+ if (0 == launcher_count) -+ return; -+ -+ launchers = MEM_ALLOC(launcher_count * sizeof(*launchers)); -+ -+ wl_list_for_each(launcher, launcher_list, link) { -+ launchers[ii] = launcher; -+ ii++; -+ } -+ -+ for (ii = 0; ii < launcher_count; ii++) { -+ int jj = 0; -+ -+ if (ii != launcher_count - 1 && -+ launchers[ii]->workspace_id == -+ launchers[ii + 1]->workspace_id) -+ continue; -+ -+ for (jj = start; jj <= ii; jj++) { -+ struct wlContextStruct *p_wlCtx; -+ -+ p_wlCtx = MEM_ALLOC(sizeof(*p_wlCtx)); -+ p_wlCtx->cmm = cmm; -+ create_ivisurfaceFromFile(p_wlCtx, -+ launchers[jj]->icon_surface_id, -+ launchers[jj]->icon); -+ } -+ -+ start = ii + 1; -+ } -+ -+ free(launchers); -+} -+ -+/** -+ * Internal method to read out weston.ini to get configuration -+ */ -+static struct hmi_homescreen_setting * -+hmi_homescreen_setting_create(void) -+{ -+ struct weston_config *config = NULL; -+ struct weston_config_section *shellSection = NULL; -+ struct hmi_homescreen_setting *setting = MEM_ALLOC(sizeof(*setting)); -+ struct weston_config_section *section = NULL; -+ const char *name = NULL; -+ uint32_t workspace_layer_id; -+ uint32_t icon_surface_id = 0; -+ -+ wl_list_init(&setting->workspace_list); -+ wl_list_init(&setting->launcher_list); -+ -+ config = weston_config_parse("weston.ini"); -+ -+ shellSection = -+ weston_config_get_section(config, "ivi-shell", NULL, NULL); -+ -+ weston_config_section_get_string( -+ shellSection, "cursor-theme", &setting->cursor_theme, NULL); -+ -+ weston_config_section_get_int( -+ shellSection, "cursor-size", &setting->cursor_size, 32); -+ -+ weston_config_section_get_uint( -+ shellSection, "workspace-layer-id", &workspace_layer_id, 3000); -+ -+ weston_config_section_get_string( -+ shellSection, "background-image", &setting->background.filePath, -+ DATADIR "/weston/background.png"); -+ -+ weston_config_section_get_uint( -+ shellSection, "background-id", &setting->background.id, 1001); -+ -+ weston_config_section_get_string( -+ shellSection, "panel-image", &setting->panel.filePath, -+ DATADIR "/weston/panel.png"); -+ -+ weston_config_section_get_uint( -+ shellSection, "panel-id", &setting->panel.id, 1002); -+ -+ weston_config_section_get_string( -+ shellSection, "tiling-image", &setting->tiling.filePath, -+ DATADIR "/weston/tiling.png"); -+ -+ weston_config_section_get_uint( -+ shellSection, "tiling-id", &setting->tiling.id, 1003); -+ -+ weston_config_section_get_string( -+ shellSection, "sidebyside-image", &setting->sidebyside.filePath, -+ DATADIR "/weston/sidebyside.png"); -+ -+ weston_config_section_get_uint( -+ shellSection, "sidebyside-id", &setting->sidebyside.id, 1004); -+ -+ weston_config_section_get_string( -+ shellSection, "fullscreen-image", &setting->fullscreen.filePath, -+ DATADIR "/weston/fullscreen.png"); -+ -+ weston_config_section_get_uint( -+ shellSection, "fullscreen-id", &setting->fullscreen.id, 1005); -+ -+ weston_config_section_get_string( -+ shellSection, "random-image", &setting->random.filePath, -+ DATADIR "/weston/random.png"); -+ -+ weston_config_section_get_uint( -+ shellSection, "random-id", &setting->random.id, 1006); -+ -+ weston_config_section_get_string( -+ shellSection, "home-image", &setting->home.filePath, -+ DATADIR "/weston/home.png"); -+ -+ weston_config_section_get_uint( -+ shellSection, "home-id", &setting->home.id, 1007); -+ -+ weston_config_section_get_uint( -+ shellSection, "workspace-background-color", -+ &setting->workspace_background.color, 0x99000000); -+ -+ weston_config_section_get_uint( -+ shellSection, "workspace-background-id", -+ &setting->workspace_background.id, 2001); -+ -+ icon_surface_id = workspace_layer_id + 1; -+ -+ while (weston_config_next_section(config, §ion, &name)) { -+ struct hmi_homescreen_launcher *launcher; -+ -+ if (strcmp(name, "ivi-launcher") != 0) -+ continue; -+ -+ launcher = MEM_ALLOC(sizeof(*launcher)); -+ wl_list_init(&launcher->link); -+ -+ weston_config_section_get_string(section, "icon", -+ &launcher->icon, NULL); -+ weston_config_section_get_string(section, "path", -+ &launcher->path, NULL); -+ weston_config_section_get_uint(section, "workspace-id", -+ &launcher->workspace_id, 0); -+ weston_config_section_get_uint(section, "icon-id", -+ &launcher->icon_surface_id, -+ icon_surface_id); -+ icon_surface_id++; -+ -+ wl_list_insert(setting->launcher_list.prev, &launcher->link); -+ } -+ -+ weston_config_destroy(config); -+ return setting; -+} -+ -+/** -+ * Main thread -+ * -+ * The basic flow are as followed, -+ * 1/ read configuration from weston.ini by hmi_homescreen_setting_create -+ * 2/ draw png file to surface according to configuration of weston.ini and -+ * set up UI by using ivi-hmi-controller protocol by each create_* method -+ */ -+int main(int argc, char **argv) -+{ -+ struct wlContextCommon wlCtxCommon; -+ struct wlContextStruct wlCtx_BackGround; -+ struct wlContextStruct wlCtx_Panel; -+ struct wlContextStruct wlCtx_Button_1; -+ struct wlContextStruct wlCtx_Button_2; -+ struct wlContextStruct wlCtx_Button_3; -+ struct wlContextStruct wlCtx_Button_4; -+ struct wlContextStruct wlCtx_HomeButton; -+ struct wlContextStruct wlCtx_WorkSpaceBackGround; -+ struct wl_list launcher_wlCtxList; -+ int ret = 0; -+ struct hmi_homescreen_setting *hmi_setting; -+ struct wlContextStruct *pWlCtxSt = NULL; -+ -+ hmi_setting = hmi_homescreen_setting_create(); -+ -+ memset(&wlCtxCommon, 0x00, sizeof(wlCtxCommon)); -+ memset(&wlCtx_BackGround, 0x00, sizeof(wlCtx_BackGround)); -+ memset(&wlCtx_Panel, 0x00, sizeof(wlCtx_Panel)); -+ memset(&wlCtx_Button_1, 0x00, sizeof(wlCtx_Button_1)); -+ memset(&wlCtx_Button_2, 0x00, sizeof(wlCtx_Button_2)); -+ memset(&wlCtx_Button_3, 0x00, sizeof(wlCtx_Button_3)); -+ memset(&wlCtx_Button_4, 0x00, sizeof(wlCtx_Button_4)); -+ memset(&wlCtx_HomeButton, 0x00, sizeof(wlCtx_HomeButton)); -+ memset(&wlCtx_WorkSpaceBackGround, 0x00, -+ sizeof(wlCtx_WorkSpaceBackGround)); -+ wl_list_init(&launcher_wlCtxList); -+ wl_list_init(&wlCtxCommon.list_wlContextStruct); -+ -+ wlCtxCommon.hmi_setting = hmi_setting; -+ -+ wlCtxCommon.wlDisplay = wl_display_connect(NULL); -+ if (NULL == wlCtxCommon.wlDisplay) { -+ printf("Error: wl_display_connect failed.\n"); -+ return -1; -+ } -+ -+ /* get wl_registry */ -+ wlCtxCommon.formats = 0; -+ wlCtxCommon.wlRegistry = wl_display_get_registry(wlCtxCommon.wlDisplay); -+ wl_registry_add_listener(wlCtxCommon.wlRegistry, -+ ®istry_listener, &wlCtxCommon); -+ wl_display_roundtrip(wlCtxCommon.wlDisplay); -+ -+ if (wlCtxCommon.wlShm == NULL) { -+ fprintf(stderr, "No wl_shm global\n"); -+ exit(1); -+ } -+ -+ wl_display_roundtrip(wlCtxCommon.wlDisplay); -+ -+ if (!(wlCtxCommon.formats & (1 << WL_SHM_FORMAT_XRGB8888))) { -+ fprintf(stderr, "WL_SHM_FORMAT_XRGB32 not available\n"); -+ exit(1); -+ } -+ -+ if (wlCtxCommon.hmi_setting->cursor_theme) { -+ create_cursors(&wlCtxCommon); -+ -+ wlCtxCommon.pointer_surface = -+ wl_compositor_create_surface(wlCtxCommon.wlCompositor); -+ -+ wlCtxCommon.current_cursor = CURSOR_LEFT_PTR; -+ } -+ -+ wlCtx_BackGround.cmm = &wlCtxCommon; -+ wlCtx_Panel.cmm = &wlCtxCommon; -+ wlCtx_Button_1.cmm = &wlCtxCommon; -+ wlCtx_Button_2.cmm = &wlCtxCommon; -+ wlCtx_Button_3.cmm = &wlCtxCommon; -+ wlCtx_Button_4.cmm = &wlCtxCommon; -+ wlCtx_HomeButton.cmm = &wlCtxCommon; -+ wlCtx_WorkSpaceBackGround.cmm = &wlCtxCommon; -+ -+ /* create desktop widgets */ -+ create_background(&wlCtx_BackGround, hmi_setting->background.id, -+ hmi_setting->background.filePath); -+ -+ create_panel(&wlCtx_Panel, hmi_setting->panel.id, -+ hmi_setting->panel.filePath); -+ -+ create_button(&wlCtx_Button_1, hmi_setting->tiling.id, -+ hmi_setting->tiling.filePath, 0); -+ -+ create_button(&wlCtx_Button_2, hmi_setting->sidebyside.id, -+ hmi_setting->sidebyside.filePath, 1); -+ -+ create_button(&wlCtx_Button_3, hmi_setting->fullscreen.id, -+ hmi_setting->fullscreen.filePath, 2); -+ -+ create_button(&wlCtx_Button_4, hmi_setting->random.id, -+ hmi_setting->random.filePath, 3); -+ -+ create_workspace_background(&wlCtx_WorkSpaceBackGround, -+ &hmi_setting->workspace_background); -+ -+ create_launchers(&wlCtxCommon, &hmi_setting->launcher_list); -+ -+ create_home_button(&wlCtx_HomeButton, hmi_setting->home.id, -+ hmi_setting->home.filePath); -+ -+ UI_ready(wlCtxCommon.hmiCtrl); -+ -+ while (ret != -1) -+ ret = wl_display_dispatch(wlCtxCommon.wlDisplay); -+ -+ wl_list_for_each(pWlCtxSt, &wlCtxCommon.list_wlContextStruct, link) { -+ destroyWLContextStruct(pWlCtxSt); -+ } -+ -+ destroyWLContextCommon(&wlCtxCommon); -+ -+ return 0; -+} -diff --git a/clients/simple-egl.c b/clients/simple-egl.c -index 0d4673b..8634075 100644 ---- a/clients/simple-egl.c -+++ b/clients/simple-egl.c -@@ -28,6 +28,7 @@ - #include - #include - #include -+#include - #include - - #include -@@ -41,6 +42,8 @@ - #include - - #include "xdg-shell-client-protocol.h" -+#include "ivi-application-client-protocol.h" -+#define IVI_SURFACE_ID 9000 - - #ifndef EGL_EXT_swap_buffers_with_damage - #define EGL_EXT_swap_buffers_with_damage 1 -@@ -74,6 +77,7 @@ struct display { - EGLConfig conf; - } egl; - struct window *window; -+ struct ivi_application *ivi_application; - - PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC swap_buffers_with_damage; - }; -@@ -95,6 +99,7 @@ struct window { - struct wl_egl_window *native; - struct wl_surface *surface; - struct xdg_surface *xdg_surface; -+ struct ivi_surface *ivi_surface; - EGLSurface egl_surface; - struct wl_callback *callback; - int fullscreen, opaque, buffer_size, frame_sync; -@@ -329,18 +334,61 @@ static const struct xdg_surface_listener xdg_surface_listener = { - }; - - static void --create_surface(struct window *window) -+handle_ivi_surface_configure(void *data, struct ivi_surface *ivi_surface, -+ int32_t width, int32_t height) -+{ -+ struct window *window = data; -+ -+ wl_egl_window_resize(window->native, width, height, 0, 0); -+ -+ window->geometry.width = width; -+ window->geometry.height = height; -+ -+ if (!window->fullscreen) -+ window->window_size = window->geometry; -+} -+ -+static const struct ivi_surface_listener ivi_surface_listener = { -+ handle_ivi_surface_configure, -+}; -+ -+static void -+create_xdg_surface(struct window *window, struct display *display) - { -- struct display *display = window->display; -- EGLBoolean ret; -- -- window->surface = wl_compositor_create_surface(display->compositor); - window->xdg_surface = xdg_shell_get_xdg_surface(display->shell, - window->surface); - - xdg_surface_add_listener(window->xdg_surface, - &xdg_surface_listener, window); - -+ xdg_surface_set_title(window->xdg_surface, "simple-egl"); -+} -+ -+static void -+create_ivi_surface(struct window *window, struct display *display) -+{ -+ uint32_t id_ivisurf = IVI_SURFACE_ID + (uint32_t)getpid(); -+ window->ivi_surface = -+ ivi_application_surface_create(display->ivi_application, -+ id_ivisurf, window->surface); -+ -+ if (window->ivi_surface == NULL) { -+ fprintf(stderr, "Failed to create ivi_client_surface\n"); -+ abort(); -+ } -+ -+ ivi_surface_add_listener(window->ivi_surface, -+ &ivi_surface_listener, window); -+} -+ -+static void -+create_surface(struct window *window) -+{ -+ struct display *display = window->display; -+ EGLBoolean ret; -+ -+ window->surface = wl_compositor_create_surface(display->compositor); -+ - window->native = - wl_egl_window_create(window->surface, - window->window_size.width, -@@ -350,7 +398,13 @@ create_surface(struct window *window) - display->egl.conf, - window->native, NULL); - -- xdg_surface_set_title(window->xdg_surface, "simple-egl"); -+ if (display->shell) { -+ create_xdg_surface(window, display); -+ } else if (display->ivi_application) { -+ create_ivi_surface(window, display); -+ } else { -+ assert(0); -+ } - - ret = eglMakeCurrent(window->display->egl.dpy, window->egl_surface, - window->egl_surface, window->display->egl.ctx); -@@ -375,7 +429,10 @@ destroy_surface(struct window *window) - eglDestroySurface(window->display->egl.dpy, window->egl_surface); - wl_egl_window_destroy(window->native); - -- xdg_surface_destroy(window->xdg_surface); -+ if (window->xdg_surface) -+ xdg_surface_destroy(window->xdg_surface); -+ if (window->display->ivi_application) -+ ivi_surface_destroy(window->ivi_surface); - wl_surface_destroy(window->surface); - - if (window->callback) -@@ -729,6 +786,10 @@ registry_handle_global(void *data, struct wl_registry *registry, - fprintf(stderr, "unable to load default left pointer\n"); - // TODO: abort ? - } -+ } else if (strcmp(interface, "ivi_application") == 0) { -+ d->ivi_application = -+ wl_registry_bind(registry, name, -+ &ivi_application_interface, 1); - } - } - -@@ -834,6 +895,9 @@ main(int argc, char **argv) - if (display.shell) - xdg_shell_destroy(display.shell); - -+ if (display.ivi_application) -+ ivi_application_destroy(display.ivi_application); -+ - if (display.compositor) - wl_compositor_destroy(display.compositor); - -diff --git a/clients/simple-shm.c b/clients/simple-shm.c -index 2087a0e..97c2da5 100644 ---- a/clients/simple-shm.c -+++ b/clients/simple-shm.c -@@ -36,6 +36,8 @@ - #include "../shared/os-compatibility.h" - #include "xdg-shell-client-protocol.h" - #include "fullscreen-shell-client-protocol.h" -+#include "ivi-application-client-protocol.h" -+#define IVI_SURFACE_ID 9000 - - struct display { - struct wl_display *display; -@@ -45,6 +47,7 @@ struct display { - struct _wl_fullscreen_shell *fshell; - struct wl_shm *shm; - uint32_t formats; -+ struct ivi_application *ivi_application; - }; - - struct buffer { -@@ -58,6 +61,7 @@ struct window { - int width, height; - struct wl_surface *surface; - struct xdg_surface *xdg_surface; -+ struct ivi_surface *ivi_surface; - struct buffer buffers[2]; - struct buffer *prev_buffer; - struct wl_callback *callback; -@@ -153,6 +157,17 @@ static const struct xdg_surface_listener xdg_surface_listener = { - handle_delete, - }; - -+static void -+handle_ivi_surface_configure(void *data, struct ivi_surface *ivi_surface, -+ int32_t width, int32_t height) -+{ -+ /* Simple-shm is resizable */ -+} -+ -+static const struct ivi_surface_listener ivi_surface_listener = { -+ handle_ivi_surface_configure, -+}; -+ - static struct window * - create_window(struct display *display, int width, int height) - { -@@ -184,6 +199,18 @@ create_window(struct display *display, int width, int height) - window->surface, - _WL_FULLSCREEN_SHELL_PRESENT_METHOD_DEFAULT, - NULL); -+ } else if (display->ivi_application) { -+ uint32_t id_ivisurf = IVI_SURFACE_ID + (uint32_t)getpid(); -+ window->ivi_surface = -+ ivi_application_surface_create(display->ivi_application, -+ id_ivisurf, window->surface); -+ if (window->ivi_surface == NULL) { -+ fprintf(stderr, "Failed to create ivi_client_surface\n"); -+ abort(); -+ } -+ -+ ivi_surface_add_listener(window->ivi_surface, -+ &ivi_surface_listener, window); - } else { - assert(0); - } -@@ -368,6 +395,10 @@ registry_handle_global(void *data, struct wl_registry *registry, - d->shm = wl_registry_bind(registry, - id, &wl_shm_interface, 1); - wl_shm_add_listener(d->shm, &shm_listener, d); -+ } else if (strcmp(interface, "ivi_application") == 0) { -+ d->ivi_application = -+ wl_registry_bind(registry, id, -+ &ivi_application_interface, 1); - } - } - -@@ -472,6 +503,12 @@ main(int argc, char **argv) - ret = wl_display_dispatch(display->display); - - fprintf(stderr, "simple-shm exiting\n"); -+ -+ if (window->display->ivi_application) { -+ ivi_surface_destroy(window->ivi_surface); -+ ivi_application_destroy(window->display->ivi_application); -+ } -+ - destroy_window(window); - destroy_display(display); - -diff --git a/clients/window.c b/clients/window.c -index 4592ef9..049093d 100644 ---- a/clients/window.c -+++ b/clients/window.c -@@ -72,6 +72,9 @@ typedef void *EGLContext; - - #include "window.h" - -+#include "ivi-application-client-protocol.h" -+#define IVI_SURFACE_ID 9000 -+ - struct shm_pool; - - struct global { -@@ -91,6 +94,7 @@ struct display { - struct text_cursor_position *text_cursor_position; - struct workspace_manager *workspace_manager; - struct xdg_shell *xdg_shell; -+ struct ivi_application *ivi_application; /* ivi style shell */ - EGLDisplay dpy; - EGLConfig argb_config; - EGLContext argb_ctx; -@@ -246,6 +250,8 @@ struct window { - - struct window *transient_for; - -+ struct ivi_surface *ivi_surface; -+ - struct window_frame *frame; - - /* struct surface::link, contains also main_surface */ -@@ -1368,6 +1374,19 @@ window_get_display(struct window *window) - } - - static void -+handle_ivi_surface_configure(void *data, struct ivi_surface *ivi_surface, -+ int32_t width, int32_t height) -+{ -+ struct window *window = data; -+ -+ window_schedule_resize(window, width, height); -+} -+ -+static const struct ivi_surface_listener ivi_surface_listener = { -+ handle_ivi_surface_configure, -+}; -+ -+static void - surface_create_surface(struct surface *surface, uint32_t flags) - { - struct display *display = surface->window->display; -@@ -1515,6 +1534,9 @@ window_destroy(struct window *window) - if (window->xdg_popup) - xdg_popup_destroy(window->xdg_popup); - -+ if (window->ivi_surface) -+ ivi_surface_destroy(window->ivi_surface); -+ - surface_destroy(window->main_surface); - - wl_list_remove(&window->link); -@@ -4386,7 +4408,7 @@ window_create_internal(struct display *display, int custom) - surface = surface_create(window); - window->main_surface = surface; - -- assert(custom || display->xdg_shell); -+ assert(custom || display->xdg_shell || display->ivi_application); - - window->custom = custom; - window->preferred_format = WINDOW_PREFERRED_FORMAT_NONE; -@@ -4406,17 +4428,31 @@ struct window * - window_create(struct display *display) - { - struct window *window; -+ uint32_t id_ivisurf; - - window = window_create_internal(display, 0); - -- window->xdg_surface = -- xdg_shell_get_xdg_surface(window->display->xdg_shell, -- window->main_surface->surface); -- fail_on_null(window->xdg_surface); -+ if (window->display->xdg_shell) { -+ window->xdg_surface = -+ xdg_shell_get_xdg_surface(window->display->xdg_shell, -+ window->main_surface->surface); -+ fail_on_null(window->xdg_surface); - -- xdg_surface_set_user_data(window->xdg_surface, window); -- xdg_surface_add_listener(window->xdg_surface, -+ xdg_surface_set_user_data(window->xdg_surface, window); -+ xdg_surface_add_listener(window->xdg_surface, - &xdg_surface_listener, window); -+ } else if (display->ivi_application) { -+ /* auto generation of ivi_id based on process id + basement of id */ -+ id_ivisurf = IVI_SURFACE_ID + (uint32_t)getpid(); -+ window->ivi_surface = -+ ivi_application_surface_create(display->ivi_application, -+ id_ivisurf, window->main_surface->surface); -+ -+ fail_on_null(window->ivi_surface); -+ -+ ivi_surface_add_listener(window->ivi_surface, -+ &ivi_surface_listener, window); -+ } - - return window; - } -@@ -5090,6 +5126,10 @@ registry_handle_global(void *data, struct wl_registry *registry, uint32_t id, - d->subcompositor = - wl_registry_bind(registry, id, - &wl_subcompositor_interface, 1); -+ } else if (strcmp(interface, "ivi_application") == 0) { -+ d->ivi_application = -+ wl_registry_bind(registry, id, -+ &ivi_application_interface, 1); - } - - if (d->global_handler) -@@ -5389,6 +5429,9 @@ display_destroy(struct display *display) - if (display->xdg_shell) - xdg_shell_destroy(display->xdg_shell); - -+ if (display->ivi_application) -+ ivi_application_destroy(display->ivi_application); -+ - if (display->shm) - wl_shm_destroy(display->shm); - -diff --git a/configure.ac b/configure.ac -index f55cea8..edaba3c 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -433,6 +433,13 @@ if test "x$enable_dbus" != "xno"; then - fi - AM_CONDITIONAL(ENABLE_DBUS, test "x$enable_dbus" = "xyes") - -+# ivi-shell support -+AC_ARG_ENABLE(ivi-shell, -+ AS_HELP_STRING([--disable-ivi-shell], -+ [do not build ivi-shell server plugin and client]),, -+ enable_ivi_shell=yes) -+AM_CONDITIONAL(ENABLE_IVI_SHELL, test "x$enable_ivi_shell" = "xyes") -+ - AC_ARG_ENABLE(wcap-tools, [ --disable-wcap-tools],, enable_wcap_tools=yes) - AM_CONDITIONAL(BUILD_WCAP_TOOLS, test x$enable_wcap_tools = xyes) - if test x$enable_wcap_tools = xyes; then -@@ -522,6 +529,8 @@ AC_MSG_RESULT([ - XWayland ${enable_xwayland} - dbus ${enable_dbus} - -+ ivi-shell ${enable_ivi_shell} -+ - Build wcap utility ${enable_wcap_tools} - Build Fullscreen Shell ${enable_fullscreen_shell} - - -diff --git a/ivi-shell/hmi-controller.c b/ivi-shell/hmi-controller.c -new file mode 100644 -index 0000000..7f3d5bf ---- /dev/null -+++ b/ivi-shell/hmi-controller.c -@@ -0,0 +1,1814 @@ -+/* -+ * Copyright (C) 2014 DENSO CORPORATION -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining -+ * a copy of this software and associated documentation files (the -+ * "Software"), to deal in the Software without restriction, including -+ * without limitation the rights to use, copy, modify, merge, publish, -+ * distribute, sublicense, and/or sell copies of the Software, and to -+ * permit persons to whom the Software is furnished to do so, subject to -+ * the following conditions: -+ * -+ * The above copyright notice and this permission notice (including the -+ * next paragraph) shall be included in all copies or substantial -+ * portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -+ * SOFTWARE. -+ */ -+ -+/** -+ * A reference implementation how to use ivi-layout APIs in order to manage -+ * layout of ivi_surfaces/ivi_layers. Layout change is triggered by -+ * ivi-hmi-controller protocol, ivi-hmi-controller.xml. A reference how to -+ * use the protocol, see hmi-controller-homescreen. -+ * -+ * In-Vehicle Infotainment system usually manage properties of -+ * ivi_surfaces/ivi_layers by only a central component which decide where -+ * ivi_surfaces/ivi_layers shall be. This reference show examples to -+ * implement the central component as a module of weston. -+ * -+ * Default Scene graph of UI is defined in hmi_controller_create. It -+ * consists of -+ * - In the bottom, a base ivi_layer to group ivi_surfaces of background, -+ * panel, and buttons -+ * - Next, a application ivi_layer to show application ivi_surfaces. -+ * - Workspace background ivi_layer to show a ivi_surface of background image. -+ * - Workspace ivi_layer to show launcher to launch application with icons. -+ * Paths to binary and icon are defined in weston.ini. The width of this -+ * ivi_layer is longer than the size of ivi_screen because a workspace has -+ * several pages and is controlled by motion of input. -+ * -+ * TODO: animation method shall be refined -+ * TODO: support fade-in when UI is ready -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "ivi-layout-export.h" -+#include "ivi-hmi-controller-server-protocol.h" -+#include "shared/helpers.h" -+ -+/***************************************************************************** -+ * structure, globals -+ ****************************************************************************/ -+struct hmi_controller_layer { -+ struct ivi_layout_layer *ivilayer; -+ uint32_t id_layer; -+ int32_t x; -+ int32_t y; -+ int32_t width; -+ int32_t height; -+}; -+ -+struct link_layer { -+ struct ivi_layout_layer *layout_layer; -+ struct wl_list link; -+}; -+ -+struct hmi_controller_fade { -+ uint32_t is_fade_in; -+ struct wl_list layer_list; -+}; -+ -+struct hmi_server_setting { -+ uint32_t base_layer_id; -+ uint32_t application_layer_id; -+ uint32_t workspace_background_layer_id; -+ uint32_t workspace_layer_id; -+ int32_t panel_height; -+ uint32_t transition_duration; -+ char *ivi_homescreen; -+}; -+ -+struct ui_setting { -+ uint32_t background_id; -+ uint32_t panel_id; -+ uint32_t tiling_id; -+ uint32_t sidebyside_id; -+ uint32_t fullscreen_id; -+ uint32_t random_id; -+ uint32_t home_id; -+ uint32_t workspace_background_id; -+}; -+ -+struct hmi_controller { -+ struct hmi_server_setting *hmi_setting; -+ struct hmi_controller_layer base_layer; -+ struct hmi_controller_layer application_layer; -+ struct hmi_controller_layer workspace_background_layer; -+ struct hmi_controller_layer workspace_layer; -+ enum ivi_hmi_controller_layout_mode layout_mode; -+ -+ struct hmi_controller_fade workspace_fade; -+ -+ int32_t workspace_count; -+ struct wl_array ui_widgets; -+ int32_t is_initialized; -+ -+ struct weston_compositor *compositor; -+ struct weston_process process; -+ struct wl_listener destroy_listener; -+ -+ struct wl_client *user_interface; -+ struct ui_setting ui_setting; -+}; -+ -+struct launcher_info { -+ uint32_t surface_id; -+ uint32_t workspace_id; -+ int32_t index; -+}; -+ -+const struct ivi_controller_interface *ivi_controller_interface; -+ -+int -+controller_module_init(struct weston_compositor *ec, -+ int *argc, char *argv[], -+ const struct ivi_controller_interface *interface, -+ size_t interface_version); -+ -+/***************************************************************************** -+ * local functions -+ ****************************************************************************/ -+static void * -+fail_on_null(void *p, size_t size, char *file, int32_t line) -+{ -+ if (size && !p) { -+ weston_log("%s(%d) %zd: out of memory\n", file, line, size); -+ exit(EXIT_FAILURE); -+ } -+ -+ return p; -+} -+ -+static void * -+mem_alloc(size_t size, char *file, int32_t line) -+{ -+ return fail_on_null(calloc(1, size), size, file, line); -+} -+ -+#define MEM_ALLOC(s) mem_alloc((s),__FILE__,__LINE__) -+ -+static int32_t -+is_surf_in_ui_widget(struct hmi_controller *hmi_ctrl, -+ struct ivi_layout_surface *ivisurf) -+{ -+ uint32_t id = ivi_controller_interface->get_id_of_surface(ivisurf); -+ -+ uint32_t *ui_widget_id = NULL; -+ wl_array_for_each(ui_widget_id, &hmi_ctrl->ui_widgets) { -+ if (*ui_widget_id == id) -+ return 1; -+ } -+ -+ return 0; -+} -+ -+static int -+compare_launcher_info(const void *lhs, const void *rhs) -+{ -+ const struct launcher_info *left = lhs; -+ const struct launcher_info *right = rhs; -+ -+ if (left->workspace_id < right->workspace_id) -+ return -1; -+ -+ if (left->workspace_id > right->workspace_id) -+ return 1; -+ -+ if (left->index < right->index) -+ return -1; -+ -+ if (left->index > right->index) -+ return 1; -+ -+ return 0; -+} -+ -+/** -+ * Internal methods called by mainly ivi_hmi_controller_switch_mode -+ * This reference shows 4 examples how to use ivi_layout APIs. -+ */ -+static void -+mode_divided_into_tiling(struct hmi_controller *hmi_ctrl, -+ struct ivi_layout_surface **pp_surface, -+ int32_t surface_length, -+ struct hmi_controller_layer *layer) -+{ -+ const float surface_width = (float)layer->width * 0.25; -+ const float surface_height = (float)layer->height * 0.5; -+ int32_t surface_x = 0; -+ int32_t surface_y = 0; -+ struct ivi_layout_surface *ivisurf = NULL; -+ struct ivi_layout_surface **surfaces; -+ struct ivi_layout_surface **new_order; -+ const uint32_t duration = hmi_ctrl->hmi_setting->transition_duration; -+ -+ int32_t i = 0; -+ int32_t surf_num = 0; -+ uint32_t num = 1; -+ -+ surfaces = MEM_ALLOC(sizeof(*surfaces) * surface_length); -+ new_order = MEM_ALLOC(sizeof(*surfaces) * surface_length); -+ -+ for (i = 0; i < surface_length; i++) { -+ ivisurf = pp_surface[i]; -+ -+ /* skip ui widgets */ -+ if (is_surf_in_ui_widget(hmi_ctrl, ivisurf)) -+ continue; -+ -+ surfaces[surf_num++] = ivisurf; -+ } -+ -+ for (i = 0; i < surf_num; i++) { -+ ivisurf = surfaces[i]; -+ new_order[i] = ivisurf; -+ -+ if (num <= 8) { -+ if (num < 5) { -+ surface_x = (int32_t)((num - 1) * (surface_width)); -+ surface_y = 0; -+ } else { -+ surface_x = (int32_t)((num - 5) * (surface_width)); -+ surface_y = (int32_t)surface_height; -+ } -+ -+ ivi_controller_interface->surface_set_transition(ivisurf, -+ IVI_LAYOUT_TRANSITION_VIEW_DEFAULT, -+ duration); -+ ivi_controller_interface->surface_set_visibility(ivisurf, true); -+ ivi_controller_interface->surface_set_destination_rectangle(ivisurf, -+ surface_x, surface_y, -+ (int32_t)surface_width, -+ (int32_t)surface_height); -+ -+ num++; -+ continue; -+ } -+ ivi_controller_interface->surface_set_visibility(ivisurf, false); -+ } -+ -+ if (surf_num > 0) { -+ ivi_controller_interface->layer_set_transition(layer->ivilayer, -+ IVI_LAYOUT_TRANSITION_LAYER_VIEW_ORDER, -+ duration); -+ } -+ -+ free(surfaces); -+ free(new_order); -+} -+ -+static void -+mode_divided_into_sidebyside(struct hmi_controller *hmi_ctrl, -+ struct ivi_layout_surface **pp_surface, -+ int32_t surface_length, -+ struct hmi_controller_layer *layer) -+{ -+ int32_t surface_width = layer->width / 2; -+ int32_t surface_height = layer->height; -+ struct ivi_layout_surface *ivisurf = NULL; -+ -+ const uint32_t duration = hmi_ctrl->hmi_setting->transition_duration; -+ int32_t i = 0; -+ int32_t num = 1; -+ -+ for (i = 0; i < surface_length; i++) { -+ ivisurf = pp_surface[i]; -+ -+ /* skip ui widgets */ -+ if (is_surf_in_ui_widget(hmi_ctrl, ivisurf)) -+ continue; -+ -+ if (num == 1) { -+ ivi_controller_interface->surface_set_transition(ivisurf, -+ IVI_LAYOUT_TRANSITION_VIEW_DEFAULT, -+ duration); -+ ivi_controller_interface->surface_set_visibility(ivisurf, true); -+ ivi_controller_interface->surface_set_destination_rectangle(ivisurf, -+ 0, 0, -+ surface_width, -+ surface_height); -+ -+ num++; -+ continue; -+ } else if (num == 2) { -+ ivi_controller_interface->surface_set_transition(ivisurf, -+ IVI_LAYOUT_TRANSITION_VIEW_DEFAULT, -+ duration); -+ ivi_controller_interface->surface_set_visibility(ivisurf, true); -+ ivi_controller_interface->surface_set_destination_rectangle(ivisurf, -+ surface_width, 0, -+ surface_width, -+ surface_height); -+ -+ num++; -+ continue; -+ } -+ ivi_controller_interface->surface_set_transition(ivisurf, -+ IVI_LAYOUT_TRANSITION_VIEW_FADE_ONLY, -+ duration); -+ ivi_controller_interface->surface_set_visibility(ivisurf, false); -+ } -+} -+ -+static void -+mode_fullscreen_someone(struct hmi_controller *hmi_ctrl, -+ struct ivi_layout_surface **pp_surface, -+ int32_t surface_length, -+ struct hmi_controller_layer *layer) -+{ -+ const int32_t surface_width = layer->width; -+ const int32_t surface_height = layer->height; -+ struct ivi_layout_surface *ivisurf = NULL; -+ int32_t i = 0; -+ const uint32_t duration = hmi_ctrl->hmi_setting->transition_duration; -+ -+ for (i = 0; i < surface_length; i++) { -+ ivisurf = pp_surface[i]; -+ -+ /* skip ui widgets */ -+ if (is_surf_in_ui_widget(hmi_ctrl, ivisurf)) -+ continue; -+ -+ ivi_controller_interface->surface_set_transition(ivisurf, -+ IVI_LAYOUT_TRANSITION_VIEW_DEFAULT, -+ duration); -+ ivi_controller_interface->surface_set_visibility(ivisurf, true); -+ ivi_controller_interface->surface_set_destination_rectangle(ivisurf, 0, 0, -+ surface_width, -+ surface_height); -+ } -+} -+ -+static void -+mode_random_replace(struct hmi_controller *hmi_ctrl, -+ struct ivi_layout_surface **pp_surface, -+ int32_t surface_length, -+ struct hmi_controller_layer *layer) -+{ -+ const int32_t surface_width = (int32_t)(layer->width * 0.25f); -+ const int32_t surface_height = (int32_t)(layer->height * 0.25f); -+ int32_t surface_x = 0; -+ int32_t surface_y = 0; -+ struct ivi_layout_surface *ivisurf = NULL; -+ const uint32_t duration = hmi_ctrl->hmi_setting->transition_duration; -+ int32_t i = 0; -+ -+ for (i = 0; i < surface_length; i++) { -+ ivisurf = pp_surface[i]; -+ -+ /* skip ui widgets */ -+ if (is_surf_in_ui_widget(hmi_ctrl, ivisurf)) -+ continue; -+ -+ ivi_controller_interface->surface_set_transition(ivisurf, -+ IVI_LAYOUT_TRANSITION_VIEW_DEFAULT, -+ duration); -+ ivi_controller_interface->surface_set_visibility(ivisurf, true); -+ surface_x = rand() % (layer->width - surface_width); -+ surface_y = rand() % (layer->height - surface_height); -+ -+ ivi_controller_interface->surface_set_destination_rectangle(ivisurf, -+ surface_x, -+ surface_y, -+ surface_width, -+ surface_height); -+ } -+} -+ -+static int32_t -+has_application_surface(struct hmi_controller *hmi_ctrl, -+ struct ivi_layout_surface **pp_surface, -+ int32_t surface_length) -+{ -+ struct ivi_layout_surface *ivisurf = NULL; -+ int32_t i = 0; -+ -+ for (i = 0; i < surface_length; i++) { -+ ivisurf = pp_surface[i]; -+ -+ /* skip ui widgets */ -+ if (is_surf_in_ui_widget(hmi_ctrl, ivisurf)) -+ continue; -+ -+ return 1; -+ } -+ -+ return 0; -+} -+ -+/** -+ * Supports 4 example to layout of application ivi_surfaces; -+ * tiling, side by side, fullscreen, and random. -+ */ -+static void -+switch_mode(struct hmi_controller *hmi_ctrl, -+ enum ivi_hmi_controller_layout_mode layout_mode) -+{ -+ struct hmi_controller_layer *layer = &hmi_ctrl->application_layer; -+ struct ivi_layout_surface **pp_surface = NULL; -+ int32_t surface_length = 0; -+ int32_t ret = 0; -+ -+ if (!hmi_ctrl->is_initialized) -+ return; -+ -+ hmi_ctrl->layout_mode = layout_mode; -+ -+ ret = ivi_controller_interface->get_surfaces(&surface_length, &pp_surface); -+ assert(!ret); -+ -+ if (!has_application_surface(hmi_ctrl, pp_surface, surface_length)) { -+ free(pp_surface); -+ pp_surface = NULL; -+ return; -+ } -+ -+ switch (layout_mode) { -+ case IVI_HMI_CONTROLLER_LAYOUT_MODE_TILING: -+ mode_divided_into_tiling(hmi_ctrl, pp_surface, surface_length, -+ layer); -+ break; -+ case IVI_HMI_CONTROLLER_LAYOUT_MODE_SIDE_BY_SIDE: -+ mode_divided_into_sidebyside(hmi_ctrl, pp_surface, -+ surface_length, layer); -+ break; -+ case IVI_HMI_CONTROLLER_LAYOUT_MODE_FULL_SCREEN: -+ mode_fullscreen_someone(hmi_ctrl, pp_surface, surface_length, -+ layer); -+ break; -+ case IVI_HMI_CONTROLLER_LAYOUT_MODE_RANDOM: -+ mode_random_replace(hmi_ctrl, pp_surface, surface_length, -+ layer); -+ break; -+ } -+ -+ ivi_controller_interface->commit_changes(); -+ free(pp_surface); -+} -+ -+/** -+ * Internal method for transition -+ */ -+static void -+hmi_controller_fade_run(struct hmi_controller *hmi_ctrl, uint32_t is_fade_in, -+ struct hmi_controller_fade *fade) -+{ -+ double tint = is_fade_in ? 1.0 : 0.0; -+ struct link_layer *linklayer = NULL; -+ const uint32_t duration = hmi_ctrl->hmi_setting->transition_duration; -+ -+ fade->is_fade_in = is_fade_in; -+ -+ wl_list_for_each(linklayer, &fade->layer_list, link) { -+ ivi_controller_interface->layer_set_transition(linklayer->layout_layer, -+ IVI_LAYOUT_TRANSITION_LAYER_FADE, -+ duration); -+ ivi_controller_interface->layer_set_fade_info(linklayer->layout_layer, -+ is_fade_in, 1.0 - tint, tint); -+ } -+} -+ -+/** -+ * Internal method to create ivi_layer with hmi_controller_layer and -+ * add to a ivi_screen -+ */ -+static void -+create_layer(struct ivi_layout_screen *iviscrn, -+ struct hmi_controller_layer *layer) -+{ -+ int32_t ret = 0; -+ -+ layer->ivilayer = -+ ivi_controller_interface->layer_create_with_dimension(layer->id_layer, -+ layer->width, -+ layer->height); -+ assert(layer->ivilayer != NULL); -+ -+ ret = ivi_controller_interface->screen_add_layer(iviscrn, layer->ivilayer); -+ assert(!ret); -+ -+ ret = ivi_controller_interface->layer_set_destination_rectangle(layer->ivilayer, -+ layer->x, layer->y, -+ layer->width, -+ layer->height); -+ assert(!ret); -+ -+ ret = ivi_controller_interface->layer_set_visibility(layer->ivilayer, true); -+ assert(!ret); -+} -+ -+/** -+ * Internal set notification -+ */ -+static void -+set_notification_create_surface(struct ivi_layout_surface *ivisurf, -+ void *userdata) -+{ -+ struct hmi_controller *hmi_ctrl = userdata; -+ struct ivi_layout_layer *application_layer = -+ hmi_ctrl->application_layer.ivilayer; -+ int32_t ret = 0; -+ -+ /* skip ui widgets */ -+ if (is_surf_in_ui_widget(hmi_ctrl, ivisurf)) -+ return; -+ -+ ret = ivi_controller_interface->layer_add_surface(application_layer, ivisurf); -+ assert(!ret); -+} -+ -+static void -+set_notification_remove_surface(struct ivi_layout_surface *ivisurf, -+ void *userdata) -+{ -+ struct hmi_controller *hmi_ctrl = userdata; -+ -+ switch_mode(hmi_ctrl, hmi_ctrl->layout_mode); -+} -+ -+static void -+set_notification_configure_surface(struct ivi_layout_surface *ivisurf, -+ void *userdata) -+{ -+ struct hmi_controller *hmi_ctrl = userdata; -+ struct ivi_layout_layer *application_layer = -+ hmi_ctrl->application_layer.ivilayer; -+ struct weston_surface *surface; -+ struct ivi_layout_surface **ivisurfs; -+ int32_t length = 0; -+ int32_t i; -+ -+ /* return if the surface is not application content */ -+ if (is_surf_in_ui_widget(hmi_ctrl, ivisurf)) { -+ return; -+ } -+ -+ /* -+ * if application changes size of wl_buffer. The source rectangle shall be -+ * fit to the size. -+ */ -+ surface = ivi_controller_interface->surface_get_weston_surface(ivisurf); -+ if (surface) { -+ ivi_controller_interface->surface_set_source_rectangle( -+ ivisurf, 0, 0, surface->width, -+ surface->height); -+ } -+ -+ /* -+ * search if the surface is already added to layer. -+ * If not yet, it is newly invoded application to go to switch_mode. -+ */ -+ ivi_controller_interface->get_surfaces_on_layer(application_layer, -+ &length, &ivisurfs); -+ for (i = 0; i < length; i++) { -+ if (ivisurf == ivisurfs[i]) { -+ /* -+ * if it is non new invoked application, just call -+ * commit_changes to apply source_rectangle. -+ */ -+ ivi_controller_interface->commit_changes(); -+ return; -+ } -+ } -+ -+ switch_mode(hmi_ctrl, hmi_ctrl->layout_mode); -+} -+ -+/** -+ * A hmi_controller used 4 ivi_layers to manage ivi_surfaces. The IDs of -+ * corresponding ivi_layer are defined in weston.ini. Default scene graph -+ * of ivi_layers are initialized in hmi_controller_create -+ */ -+static struct hmi_server_setting * -+hmi_server_setting_create(struct weston_compositor *ec) -+{ -+ struct hmi_server_setting *setting = MEM_ALLOC(sizeof(*setting)); -+ struct weston_config *config = ec->config; -+ struct weston_config_section *shell_section = NULL; -+ -+ shell_section = weston_config_get_section(config, "ivi-shell", -+ NULL, NULL); -+ -+ weston_config_section_get_uint(shell_section, "base-layer-id", -+ &setting->base_layer_id, 1000); -+ -+ weston_config_section_get_uint(shell_section, -+ "workspace-background-layer-id", -+ &setting->workspace_background_layer_id, -+ 2000); -+ -+ weston_config_section_get_uint(shell_section, "workspace-layer-id", -+ &setting->workspace_layer_id, 3000); -+ -+ weston_config_section_get_uint(shell_section, "application-layer-id", -+ &setting->application_layer_id, 4000); -+ -+ weston_config_section_get_uint(shell_section, "transition-duration", -+ &setting->transition_duration, 300); -+ -+ setting->panel_height = 70; -+ -+ weston_config_section_get_string(shell_section, -+ "ivi-shell-user-interface", -+ &setting->ivi_homescreen, NULL); -+ -+ return setting; -+} -+ -+static void -+hmi_controller_destroy(struct wl_listener *listener, void *data) -+{ -+ struct link_layer *link = NULL; -+ struct link_layer *next = NULL; -+ struct hmi_controller *hmi_ctrl = -+ container_of(listener, struct hmi_controller, destroy_listener); -+ -+ wl_list_for_each_safe(link, next, -+ &hmi_ctrl->workspace_fade.layer_list, link) { -+ wl_list_remove(&link->link); -+ free(link); -+ } -+ -+ wl_array_release(&hmi_ctrl->ui_widgets); -+ free(hmi_ctrl->hmi_setting); -+ free(hmi_ctrl); -+} -+ -+/** -+ * This is a starting method called from module_init. -+ * This sets up scene graph of ivi_layers; base, application, workspace -+ * background, and workspace. These ivi_layers are created/added to -+ * ivi_screen in create_layer -+ * -+ * base: to group ivi_surfaces of panel and background -+ * application: to group ivi_surfaces of ivi_applications -+ * workspace background: to group a ivi_surface of background in workspace -+ * workspace: to group ivi_surfaces for launching ivi_applications -+ * -+ * ivi_layers of workspace background and workspace is set to invisible at -+ * first. The properties of it is updated with animation when -+ * ivi_hmi_controller_home is requested. -+ */ -+static struct hmi_controller * -+hmi_controller_create(struct weston_compositor *ec) -+{ -+ struct ivi_layout_screen **pp_screen = NULL; -+ struct ivi_layout_screen *iviscrn = NULL; -+ int32_t screen_length = 0; -+ int32_t screen_width = 0; -+ int32_t screen_height = 0; -+ struct link_layer *tmp_link_layer = NULL; -+ int32_t panel_height = 0; -+ struct hmi_controller *hmi_ctrl = MEM_ALLOC(sizeof(*hmi_ctrl)); -+ -+ wl_array_init(&hmi_ctrl->ui_widgets); -+ hmi_ctrl->layout_mode = IVI_HMI_CONTROLLER_LAYOUT_MODE_TILING; -+ hmi_ctrl->hmi_setting = hmi_server_setting_create(ec); -+ hmi_ctrl->compositor = ec; -+ -+ ivi_controller_interface->get_screens(&screen_length, &pp_screen); -+ -+ iviscrn = pp_screen[0]; -+ -+ ivi_controller_interface->get_screen_resolution(iviscrn, &screen_width, -+ &screen_height); -+ -+ /* init base ivi_layer*/ -+ hmi_ctrl->base_layer.x = 0; -+ hmi_ctrl->base_layer.y = 0; -+ hmi_ctrl->base_layer.width = screen_width; -+ hmi_ctrl->base_layer.height = screen_height; -+ hmi_ctrl->base_layer.id_layer = hmi_ctrl->hmi_setting->base_layer_id; -+ -+ create_layer(iviscrn, &hmi_ctrl->base_layer); -+ -+ panel_height = hmi_ctrl->hmi_setting->panel_height; -+ -+ /* init application ivi_layer */ -+ hmi_ctrl->application_layer.x = 0; -+ hmi_ctrl->application_layer.y = 0; -+ hmi_ctrl->application_layer.width = screen_width; -+ hmi_ctrl->application_layer.height = screen_height - panel_height; -+ hmi_ctrl->application_layer.id_layer = -+ hmi_ctrl->hmi_setting->application_layer_id; -+ -+ create_layer(iviscrn, &hmi_ctrl->application_layer); -+ -+ /* init workspace background ivi_layer */ -+ hmi_ctrl->workspace_background_layer.x = 0; -+ hmi_ctrl->workspace_background_layer.y = 0; -+ hmi_ctrl->workspace_background_layer.width = screen_width; -+ hmi_ctrl->workspace_background_layer.height = -+ screen_height - panel_height; -+ -+ hmi_ctrl->workspace_background_layer.id_layer = -+ hmi_ctrl->hmi_setting->workspace_background_layer_id; -+ -+ create_layer(iviscrn, &hmi_ctrl->workspace_background_layer); -+ ivi_controller_interface->layer_set_opacity( -+ hmi_ctrl->workspace_background_layer.ivilayer, 0); -+ ivi_controller_interface->layer_set_visibility( -+ hmi_ctrl->workspace_background_layer.ivilayer, false); -+ -+ -+ wl_list_init(&hmi_ctrl->workspace_fade.layer_list); -+ tmp_link_layer = MEM_ALLOC(sizeof(*tmp_link_layer)); -+ tmp_link_layer->layout_layer = -+ hmi_ctrl->workspace_background_layer.ivilayer; -+ wl_list_insert(&hmi_ctrl->workspace_fade.layer_list, -+ &tmp_link_layer->link); -+ -+ ivi_controller_interface->add_notification_create_surface( -+ set_notification_create_surface, hmi_ctrl); -+ ivi_controller_interface->add_notification_remove_surface( -+ set_notification_remove_surface, hmi_ctrl); -+ ivi_controller_interface->add_notification_configure_surface( -+ set_notification_configure_surface, hmi_ctrl); -+ -+ hmi_ctrl->destroy_listener.notify = hmi_controller_destroy; -+ wl_signal_add(&hmi_ctrl->compositor->destroy_signal, -+ &hmi_ctrl->destroy_listener); -+ -+ free(pp_screen); -+ pp_screen = NULL; -+ -+ return hmi_ctrl; -+} -+ -+/** -+ * Implementations of ivi-hmi-controller.xml -+ */ -+ -+/** -+ * A ivi_surface drawing background is identified by id_surface. -+ * Properties of the ivi_surface is set by using ivi_layout APIs according to -+ * the scene graph of UI defined in hmi_controller_create. -+ * -+ * UI ivi_layer is used to add this ivi_surface. -+ */ -+static void -+ivi_hmi_controller_set_background(struct hmi_controller *hmi_ctrl, -+ uint32_t id_surface) -+{ -+ struct ivi_layout_surface *ivisurf = NULL; -+ struct ivi_layout_layer *ivilayer = hmi_ctrl->base_layer.ivilayer; -+ const int32_t dstx = hmi_ctrl->application_layer.x; -+ const int32_t dsty = hmi_ctrl->application_layer.y; -+ const int32_t width = hmi_ctrl->application_layer.width; -+ const int32_t height = hmi_ctrl->application_layer.height; -+ int32_t ret = 0; -+ -+ uint32_t *add_surface_id = wl_array_add(&hmi_ctrl->ui_widgets, -+ sizeof(*add_surface_id)); -+ *add_surface_id = id_surface; -+ -+ ivisurf = ivi_controller_interface->get_surface_from_id(id_surface); -+ assert(ivisurf != NULL); -+ -+ ret = ivi_controller_interface->layer_add_surface(ivilayer, ivisurf); -+ assert(!ret); -+ -+ ret = ivi_controller_interface->surface_set_destination_rectangle(ivisurf, -+ dstx, dsty, width, height); -+ assert(!ret); -+ -+ ret = ivi_controller_interface->surface_set_visibility(ivisurf, true); -+ assert(!ret); -+} -+ -+/** -+ * A ivi_surface drawing panel is identified by id_surface. -+ * Properties of the ivi_surface is set by using ivi_layout APIs according to -+ * the scene graph of UI defined in hmi_controller_create. -+ * -+ * UI ivi_layer is used to add this ivi_surface. -+ */ -+static void -+ivi_hmi_controller_set_panel(struct hmi_controller *hmi_ctrl, -+ uint32_t id_surface) -+{ -+ struct ivi_layout_surface *ivisurf = NULL; -+ struct ivi_layout_layer *ivilayer = hmi_ctrl->base_layer.ivilayer; -+ const int32_t width = hmi_ctrl->base_layer.width; -+ int32_t ret = 0; -+ int32_t panel_height = 0; -+ const int32_t dstx = 0; -+ int32_t dsty = 0; -+ -+ uint32_t *add_surface_id = wl_array_add(&hmi_ctrl->ui_widgets, -+ sizeof(*add_surface_id)); -+ *add_surface_id = id_surface; -+ -+ ivisurf = ivi_controller_interface->get_surface_from_id(id_surface); -+ assert(ivisurf != NULL); -+ -+ ret = ivi_controller_interface->layer_add_surface(ivilayer, ivisurf); -+ assert(!ret); -+ -+ panel_height = hmi_ctrl->hmi_setting->panel_height; -+ -+ dsty = hmi_ctrl->base_layer.height - panel_height; -+ -+ ret = ivi_controller_interface->surface_set_destination_rectangle( -+ ivisurf, dstx, dsty, width, panel_height); -+ assert(!ret); -+ -+ ret = ivi_controller_interface->surface_set_visibility(ivisurf, true); -+ assert(!ret); -+} -+ -+/** -+ * A ivi_surface drawing buttons in panel is identified by id_surface. -+ * It can set several buttons. Properties of the ivi_surface is set by -+ * using ivi_layout APIs according to the scene graph of UI defined in -+ * hmi_controller_create. Additionally, the position of it is shifted to -+ * right when new one is requested. -+ * -+ * UI ivi_layer is used to add these ivi_surfaces. -+ */ -+static void -+ivi_hmi_controller_set_button(struct hmi_controller *hmi_ctrl, -+ uint32_t id_surface, int32_t number) -+{ -+ struct ivi_layout_surface *ivisurf = NULL; -+ struct ivi_layout_layer *ivilayer = hmi_ctrl->base_layer.ivilayer; -+ const int32_t width = 48; -+ const int32_t height = 48; -+ int32_t ret = 0; -+ int32_t panel_height = 0; -+ int32_t dstx = 0; -+ int32_t dsty = 0; -+ uint32_t *add_surface_id = wl_array_add(&hmi_ctrl->ui_widgets, -+ sizeof(*add_surface_id)); -+ *add_surface_id = id_surface; -+ -+ ivisurf = ivi_controller_interface->get_surface_from_id(id_surface); -+ assert(ivisurf != NULL); -+ -+ ret = ivi_controller_interface->layer_add_surface(ivilayer, ivisurf); -+ assert(!ret); -+ -+ panel_height = hmi_ctrl->hmi_setting->panel_height; -+ -+ dstx = (60 * number) + 15; -+ dsty = (hmi_ctrl->base_layer.height - panel_height) + 5; -+ -+ ret = ivi_controller_interface->surface_set_destination_rectangle( -+ ivisurf,dstx, dsty, width, height); -+ assert(!ret); -+ -+ ret = ivi_controller_interface->surface_set_visibility(ivisurf, true); -+ assert(!ret); -+} -+ -+/** -+ * A ivi_surface drawing home button in panel is identified by id_surface. -+ * Properties of the ivi_surface is set by using ivi_layout APIs according to -+ * the scene graph of UI defined in hmi_controller_create. -+ * -+ * UI ivi_layer is used to add these ivi_surfaces. -+ */ -+static void -+ivi_hmi_controller_set_home_button(struct hmi_controller *hmi_ctrl, -+ uint32_t id_surface) -+{ -+ struct ivi_layout_surface *ivisurf = NULL; -+ struct ivi_layout_layer *ivilayer = hmi_ctrl->base_layer.ivilayer; -+ int32_t ret = 0; -+ int32_t size = 48; -+ int32_t panel_height = hmi_ctrl->hmi_setting->panel_height; -+ const int32_t dstx = (hmi_ctrl->base_layer.width - size) / 2; -+ const int32_t dsty = (hmi_ctrl->base_layer.height - panel_height) + 5; -+ -+ uint32_t *add_surface_id = wl_array_add(&hmi_ctrl->ui_widgets, -+ sizeof(*add_surface_id)); -+ *add_surface_id = id_surface; -+ -+ ivisurf = ivi_controller_interface->get_surface_from_id(id_surface); -+ assert(ivisurf != NULL); -+ -+ ret = ivi_controller_interface->layer_add_surface(ivilayer, ivisurf); -+ assert(!ret); -+ -+ ret = ivi_controller_interface->surface_set_destination_rectangle( -+ ivisurf, dstx, dsty, size, size); -+ assert(!ret); -+ -+ ret = ivi_controller_interface->surface_set_visibility(ivisurf, true); -+ assert(!ret); -+} -+ -+/** -+ * A ivi_surface drawing background of workspace is identified by id_surface. -+ * Properties of the ivi_surface is set by using ivi_layout APIs according to -+ * the scene graph of UI defined in hmi_controller_create. -+ * -+ * A ivi_layer of workspace_background is used to add this ivi_surface. -+ */ -+static void -+ivi_hmi_controller_set_workspacebackground(struct hmi_controller *hmi_ctrl, -+ uint32_t id_surface) -+{ -+ struct ivi_layout_surface *ivisurf = NULL; -+ struct ivi_layout_layer *ivilayer = NULL; -+ const int32_t width = hmi_ctrl->workspace_background_layer.width; -+ const int32_t height = hmi_ctrl->workspace_background_layer.height; -+ int32_t ret = 0; -+ -+ uint32_t *add_surface_id = wl_array_add(&hmi_ctrl->ui_widgets, -+ sizeof(*add_surface_id)); -+ *add_surface_id = id_surface; -+ ivilayer = hmi_ctrl->workspace_background_layer.ivilayer; -+ -+ ivisurf = ivi_controller_interface->get_surface_from_id(id_surface); -+ assert(ivisurf != NULL); -+ -+ ret = ivi_controller_interface->layer_add_surface(ivilayer, ivisurf); -+ assert(!ret); -+ -+ ret = ivi_controller_interface->surface_set_destination_rectangle(ivisurf, -+ 0, 0, width, height); -+ assert(!ret); -+ -+ ret = ivi_controller_interface->surface_set_visibility(ivisurf, true); -+ assert(!ret); -+} -+ -+/** -+ * A list of ivi_surfaces drawing launchers in workspace is identified by -+ * id_surfaces. Properties of the ivi_surface is set by using ivi_layout -+ * APIs according to the scene graph of UI defined in hmi_controller_create. -+ * -+ * The workspace can have several pages to group ivi_surfaces of launcher. -+ * Each call of this interface increments a number of page to add a group -+ * of ivi_surfaces -+ */ -+static void -+ivi_hmi_controller_add_launchers(struct hmi_controller *hmi_ctrl, -+ int32_t icon_size) -+{ -+ int32_t minspace_x = 10; -+ int32_t minspace_y = minspace_x; -+ -+ int32_t width = hmi_ctrl->workspace_background_layer.width; -+ int32_t height = hmi_ctrl->workspace_background_layer.height; -+ -+ int32_t x_count = (width - minspace_x) / (minspace_x + icon_size); -+ int32_t space_x = (int32_t)((width - x_count * icon_size) / (1.0 + x_count)); -+ float fcell_size_x = icon_size + space_x; -+ -+ int32_t y_count = (height - minspace_y) / (minspace_y + icon_size); -+ int32_t space_y = (int32_t)((height - y_count * icon_size) / (1.0 + y_count)); -+ float fcell_size_y = icon_size + space_y; -+ -+ struct weston_config *config = NULL; -+ struct weston_config_section *section = NULL; -+ const char *name = NULL; -+ int launcher_count = 0; -+ struct wl_array launchers; -+ int32_t nx = 0; -+ int32_t ny = 0; -+ int32_t prev = -1; -+ struct launcher_info *data = NULL; -+ -+ uint32_t surfaceid = 0; -+ uint32_t workspaceid = 0; -+ struct launcher_info *info = NULL; -+ -+ int32_t x = 0; -+ int32_t y = 0; -+ int32_t ret = 0; -+ struct ivi_layout_surface* layout_surface = NULL; -+ uint32_t *add_surface_id = NULL; -+ -+ struct ivi_layout_screen *iviscrn = NULL; -+ struct link_layer *tmp_link_layer = NULL; -+ struct ivi_layout_screen **pp_screen = NULL; -+ int32_t screen_length = 0; -+ -+ if (0 == x_count) -+ x_count = 1; -+ -+ if (0 == y_count) -+ y_count = 1; -+ -+ config = hmi_ctrl->compositor->config; -+ if (!config) -+ return; -+ -+ section = weston_config_get_section(config, "ivi-shell", NULL, NULL); -+ if (!section) -+ return; -+ -+ wl_array_init(&launchers); -+ -+ while (weston_config_next_section(config, §ion, &name)) { -+ surfaceid = 0; -+ workspaceid = 0; -+ info = NULL; -+ if (0 != strcmp(name, "ivi-launcher")) -+ continue; -+ -+ if (0 != weston_config_section_get_uint(section, "icon-id", -+ &surfaceid, 0)) -+ continue; -+ -+ if (0 != weston_config_section_get_uint(section, -+ "workspace-id", -+ &workspaceid, 0)) -+ continue; -+ -+ info = wl_array_add(&launchers, sizeof(*info)); -+ -+ if (info) { -+ info->surface_id = surfaceid; -+ info->workspace_id = workspaceid; -+ info->index = launcher_count; -+ ++launcher_count; -+ } -+ } -+ -+ qsort(launchers.data, launcher_count, sizeof(struct launcher_info), -+ compare_launcher_info); -+ -+ wl_array_for_each(data, &launchers) { -+ x = 0; -+ y = 0; -+ ret = 0; -+ layout_surface = NULL; -+ add_surface_id = wl_array_add(&hmi_ctrl->ui_widgets, -+ sizeof(*add_surface_id)); -+ -+ *add_surface_id = data->surface_id; -+ -+ if (0 > prev || (uint32_t)prev != data->workspace_id) { -+ nx = 0; -+ ny = 0; -+ prev = data->workspace_id; -+ -+ if (0 <= prev) -+ hmi_ctrl->workspace_count++; -+ } -+ -+ if (y_count == ny) { -+ ny = 0; -+ hmi_ctrl->workspace_count++; -+ } -+ -+ x = nx * fcell_size_x + (hmi_ctrl->workspace_count - 1) * width + space_x; -+ y = ny * fcell_size_y + space_y; -+ -+ layout_surface = -+ ivi_controller_interface->get_surface_from_id(data->surface_id); -+ assert(layout_surface); -+ -+ ret = ivi_controller_interface->surface_set_destination_rectangle( -+ layout_surface, x, y, icon_size, icon_size); -+ assert(!ret); -+ -+ nx++; -+ -+ if (x_count == nx) { -+ ny++; -+ nx = 0; -+ } -+ } -+ -+ /* init workspace ivi_layer */ -+ hmi_ctrl->workspace_layer.x = hmi_ctrl->workspace_background_layer.x; -+ hmi_ctrl->workspace_layer.y = hmi_ctrl->workspace_background_layer.y; -+ hmi_ctrl->workspace_layer.width = -+ hmi_ctrl->workspace_background_layer.width * hmi_ctrl->workspace_count; -+ hmi_ctrl->workspace_layer.height = -+ hmi_ctrl->workspace_background_layer.height; -+ hmi_ctrl->workspace_layer.id_layer = -+ hmi_ctrl->hmi_setting->workspace_layer_id; -+ -+ ivi_controller_interface->get_screens(&screen_length, &pp_screen); -+ iviscrn = pp_screen[0]; -+ free(pp_screen); -+ create_layer(iviscrn, &hmi_ctrl->workspace_layer); -+ ivi_controller_interface->layer_set_opacity(hmi_ctrl->workspace_layer.ivilayer, 0); -+ ivi_controller_interface->layer_set_visibility(hmi_ctrl->workspace_layer.ivilayer, -+ false); -+ -+ tmp_link_layer = MEM_ALLOC(sizeof(*tmp_link_layer)); -+ tmp_link_layer->layout_layer = hmi_ctrl->workspace_layer.ivilayer; -+ wl_list_insert(&hmi_ctrl->workspace_fade.layer_list, -+ &tmp_link_layer->link); -+ -+ /* Add surface to layer */ -+ wl_array_for_each(data, &launchers) { -+ layout_surface = -+ ivi_controller_interface->get_surface_from_id(data->surface_id); -+ assert(layout_surface); -+ -+ ret = ivi_controller_interface->layer_add_surface(hmi_ctrl->workspace_layer.ivilayer, -+ layout_surface); -+ assert(!ret); -+ -+ ret = ivi_controller_interface->surface_set_visibility(layout_surface, true); -+ assert(!ret); -+ } -+ -+ wl_array_release(&launchers); -+ ivi_controller_interface->commit_changes(); -+} -+ -+static void -+ivi_hmi_controller_UI_ready(struct wl_client *client, -+ struct wl_resource *resource) -+{ -+ struct hmi_controller *hmi_ctrl = wl_resource_get_user_data(resource); -+ -+ ivi_hmi_controller_set_background(hmi_ctrl, hmi_ctrl->ui_setting.background_id); -+ ivi_hmi_controller_set_panel(hmi_ctrl, hmi_ctrl->ui_setting.panel_id); -+ ivi_hmi_controller_set_button(hmi_ctrl, hmi_ctrl->ui_setting.tiling_id, 0); -+ ivi_hmi_controller_set_button(hmi_ctrl, hmi_ctrl->ui_setting.sidebyside_id, 1); -+ ivi_hmi_controller_set_button(hmi_ctrl, hmi_ctrl->ui_setting.fullscreen_id, 2); -+ ivi_hmi_controller_set_button(hmi_ctrl, hmi_ctrl->ui_setting.random_id, 3); -+ ivi_hmi_controller_set_home_button(hmi_ctrl, hmi_ctrl->ui_setting.home_id); -+ ivi_hmi_controller_set_workspacebackground(hmi_ctrl, hmi_ctrl->ui_setting.workspace_background_id); -+ ivi_controller_interface->commit_changes(); -+ -+ ivi_hmi_controller_add_launchers(hmi_ctrl, 256); -+ hmi_ctrl->is_initialized = 1; -+} -+ -+/** -+ * Implementation of request and event of ivi_hmi_controller_workspace_control -+ * and controlling workspace. -+ * -+ * When motion of input is detected in a ivi_surface of workspace background, -+ * ivi_hmi_controller_workspace_control shall be invoked and to start -+ * controlling of workspace. The workspace has several pages to show several -+ * groups of applications. -+ * The workspace is slid by using ivi-layout to select a a page in layer_set_pos -+ * according to motion. When motion finished, e.g. touch up detected, control is -+ * terminated and event:ivi_hmi_controller_workspace_control is notified. -+ */ -+struct pointer_grab { -+ struct weston_pointer_grab grab; -+ struct ivi_layout_layer *layer; -+ struct wl_resource *resource; -+}; -+ -+struct touch_grab { -+ struct weston_touch_grab grab; -+ struct ivi_layout_layer *layer; -+ struct wl_resource *resource; -+}; -+ -+struct move_grab { -+ wl_fixed_t dst[2]; -+ wl_fixed_t rgn[2][2]; -+ double v[2]; -+ struct timespec start_time; -+ struct timespec pre_time; -+ wl_fixed_t start_pos[2]; -+ wl_fixed_t pos[2]; -+ int32_t is_moved; -+}; -+ -+struct pointer_move_grab { -+ struct pointer_grab base; -+ struct move_grab move; -+}; -+ -+struct touch_move_grab { -+ struct touch_grab base; -+ struct move_grab move; -+ int32_t is_active; -+}; -+ -+static void -+pointer_grab_start(struct pointer_grab *grab, -+ struct ivi_layout_layer *layer, -+ const struct weston_pointer_grab_interface *interface, -+ struct weston_pointer *pointer) -+{ -+ grab->grab.interface = interface; -+ grab->layer = layer; -+ weston_pointer_start_grab(pointer, &grab->grab); -+} -+ -+static void -+touch_grab_start(struct touch_grab *grab, -+ struct ivi_layout_layer *layer, -+ const struct weston_touch_grab_interface *interface, -+ struct weston_touch* touch) -+{ -+ grab->grab.interface = interface; -+ grab->layer = layer; -+ weston_touch_start_grab(touch, &grab->grab); -+} -+ -+static int32_t -+clamp(int32_t val, int32_t min, int32_t max) -+{ -+ if (val < min) -+ return min; -+ -+ if (max < val) -+ return max; -+ -+ return val; -+} -+ -+static void -+move_workspace_grab_end(struct move_grab *move, struct wl_resource* resource, -+ wl_fixed_t grab_x, struct ivi_layout_layer *layer) -+{ -+ struct hmi_controller *hmi_ctrl = wl_resource_get_user_data(resource); -+ int32_t width = hmi_ctrl->workspace_background_layer.width; -+ -+ struct timespec time = {0}; -+ double grab_time = 0.0; -+ double from_motion_time = 0.0; -+ double pointer_v = 0.0; -+ int32_t is_flick = 0; -+ int32_t pos_x = 0; -+ int32_t pos_y = 0; -+ int page_no = 0; -+ double end_pos = 0.0; -+ uint32_t duration = 0; -+ -+ clock_gettime(CLOCK_MONOTONIC, &time); -+ -+ grab_time = 1e+3 * (time.tv_sec - move->start_time.tv_sec) + -+ 1e-6 * (time.tv_nsec - move->start_time.tv_nsec); -+ -+ from_motion_time = 1e+3 * (time.tv_sec - move->pre_time.tv_sec) + -+ 1e-6 * (time.tv_nsec - move->pre_time.tv_nsec); -+ -+ pointer_v = move->v[0]; -+ -+ is_flick = grab_time < 400 && 0.4 < fabs(pointer_v); -+ if (200 < from_motion_time) -+ pointer_v = 0.0; -+ -+ ivi_controller_interface->layer_get_position(layer, &pos_x, &pos_y); -+ -+ -+ if (is_flick) { -+ int orgx = wl_fixed_to_int(move->dst[0] + grab_x); -+ page_no = (-orgx + width / 2) / width; -+ -+ if (pointer_v < 0.0) -+ page_no++; -+ else -+ page_no--; -+ } else { -+ page_no = (-pos_x + width / 2) / width; -+ } -+ -+ page_no = clamp(page_no, 0, hmi_ctrl->workspace_count - 1); -+ end_pos = -page_no * width; -+ -+ duration = hmi_ctrl->hmi_setting->transition_duration; -+ ivi_hmi_controller_send_workspace_end_control(resource, move->is_moved); -+ ivi_controller_interface->layer_set_transition(layer, -+ IVI_LAYOUT_TRANSITION_LAYER_MOVE, -+ duration); -+ ivi_controller_interface->layer_set_destination_rectangle(layer, -+ end_pos, pos_y, -+ hmi_ctrl->workspace_layer.width, -+ hmi_ctrl->workspace_layer.height); -+ ivi_controller_interface->commit_changes(); -+} -+ -+static void -+pointer_move_workspace_grab_end(struct pointer_grab *grab) -+{ -+ struct pointer_move_grab *pnt_move_grab = -+ (struct pointer_move_grab *)grab; -+ struct ivi_layout_layer *layer = pnt_move_grab->base.layer; -+ -+ move_workspace_grab_end(&pnt_move_grab->move, grab->resource, -+ grab->grab.pointer->grab_x, layer); -+ -+ weston_pointer_end_grab(grab->grab.pointer); -+} -+ -+static void -+touch_move_workspace_grab_end(struct touch_grab *grab) -+{ -+ struct touch_move_grab *tch_move_grab = (struct touch_move_grab *)grab; -+ struct ivi_layout_layer *layer = tch_move_grab->base.layer; -+ -+ move_workspace_grab_end(&tch_move_grab->move, grab->resource, -+ grab->grab.touch->grab_x, layer); -+ -+ weston_touch_end_grab(grab->grab.touch); -+} -+ -+static void -+pointer_noop_grab_focus(struct weston_pointer_grab *grab) -+{ -+} -+ -+static void -+move_grab_update(struct move_grab *move, wl_fixed_t pointer[2]) -+{ -+ struct timespec timestamp = {0}; -+ int32_t ii = 0; -+ double dt = 0.0; -+ -+ clock_gettime(CLOCK_MONOTONIC, ×tamp); //FIXME -+ dt = (1e+3 * (timestamp.tv_sec - move->pre_time.tv_sec) + -+ 1e-6 * (timestamp.tv_nsec - move->pre_time.tv_nsec)); -+ -+ if (dt < 1e-6) -+ dt = 1e-6; -+ -+ move->pre_time = timestamp; -+ -+ for (ii = 0; ii < 2; ii++) { -+ wl_fixed_t prepos = move->pos[ii]; -+ move->pos[ii] = pointer[ii] + move->dst[ii]; -+ -+ if (move->pos[ii] < move->rgn[0][ii]) { -+ move->pos[ii] = move->rgn[0][ii]; -+ move->dst[ii] = move->pos[ii] - pointer[ii]; -+ } else if (move->rgn[1][ii] < move->pos[ii]) { -+ move->pos[ii] = move->rgn[1][ii]; -+ move->dst[ii] = move->pos[ii] - pointer[ii]; -+ } -+ -+ move->v[ii] = wl_fixed_to_double(move->pos[ii] - prepos) / dt; -+ -+ if (!move->is_moved && -+ 0 < wl_fixed_to_int(move->pos[ii] - move->start_pos[ii])) -+ move->is_moved = 1; -+ } -+} -+ -+static void -+layer_set_pos(struct ivi_layout_layer *layer, wl_fixed_t pos_x, -+ wl_fixed_t pos_y) -+{ -+ int32_t layout_pos_x = 0; -+ int32_t layout_pos_y = 0; -+ -+ layout_pos_x = wl_fixed_to_int(pos_x); -+ layout_pos_y = wl_fixed_to_int(pos_y); -+ ivi_controller_interface->layer_set_position(layer, layout_pos_x, layout_pos_y); -+ ivi_controller_interface->commit_changes(); -+} -+ -+static void -+pointer_move_grab_motion(struct weston_pointer_grab *grab, uint32_t time, -+ wl_fixed_t x, wl_fixed_t y) -+{ -+ struct pointer_move_grab *pnt_move_grab = -+ (struct pointer_move_grab *)grab; -+ wl_fixed_t pointer_pos[2] = {x, y}; -+ -+ move_grab_update(&pnt_move_grab->move, pointer_pos); -+ layer_set_pos(pnt_move_grab->base.layer, -+ pnt_move_grab->move.pos[0], pnt_move_grab->move.pos[1]); -+ weston_pointer_move(pnt_move_grab->base.grab.pointer, x, y); -+} -+ -+static void -+touch_move_grab_motion(struct weston_touch_grab *grab, uint32_t time, -+ int touch_id, wl_fixed_t x, wl_fixed_t y) -+{ -+ struct touch_move_grab *tch_move_grab = (struct touch_move_grab *)grab; -+ -+ if (!tch_move_grab->is_active) -+ return; -+ -+ wl_fixed_t pointer_pos[2] = { -+ grab->touch->grab_x, -+ grab->touch->grab_y -+ }; -+ -+ move_grab_update(&tch_move_grab->move, pointer_pos); -+ layer_set_pos(tch_move_grab->base.layer, -+ tch_move_grab->move.pos[0], tch_move_grab->move.pos[1]); -+} -+ -+static void -+pointer_move_workspace_grab_button(struct weston_pointer_grab *grab, -+ uint32_t time, uint32_t button, -+ uint32_t state_w) -+{ -+ if (BTN_LEFT == button && -+ WL_POINTER_BUTTON_STATE_RELEASED == state_w) { -+ struct pointer_grab *pg = (struct pointer_grab *)grab; -+ -+ pointer_move_workspace_grab_end(pg); -+ free(grab); -+ } -+} -+ -+static void -+touch_nope_grab_down(struct weston_touch_grab *grab, uint32_t time, -+ int touch_id, wl_fixed_t sx, wl_fixed_t sy) -+{ -+} -+ -+static void -+touch_move_workspace_grab_up(struct weston_touch_grab *grab, uint32_t time, -+ int touch_id) -+{ -+ struct touch_move_grab *tch_move_grab = (struct touch_move_grab *)grab; -+ -+ if (0 == touch_id) -+ tch_move_grab->is_active = 0; -+ -+ if (0 == grab->touch->num_tp) { -+ touch_move_workspace_grab_end(&tch_move_grab->base); -+ free(grab); -+ } -+} -+ -+static void -+pointer_move_workspace_grab_cancel(struct weston_pointer_grab *grab) -+{ -+ struct pointer_grab *pg = (struct pointer_grab *)grab; -+ -+ pointer_move_workspace_grab_end(pg); -+ free(grab); -+} -+ -+static void -+touch_move_workspace_grab_frame(struct weston_touch_grab *grab) -+{ -+} -+ -+static void -+touch_move_workspace_grab_cancel(struct weston_touch_grab *grab) -+{ -+ struct touch_grab *tg = (struct touch_grab *)grab; -+ -+ touch_move_workspace_grab_end(tg); -+ free(grab); -+} -+ -+static const struct weston_pointer_grab_interface pointer_move_grab_workspace_interface = { -+ pointer_noop_grab_focus, -+ pointer_move_grab_motion, -+ pointer_move_workspace_grab_button, -+ pointer_move_workspace_grab_cancel -+}; -+ -+static const struct weston_touch_grab_interface touch_move_grab_workspace_interface = { -+ touch_nope_grab_down, -+ touch_move_workspace_grab_up, -+ touch_move_grab_motion, -+ touch_move_workspace_grab_frame, -+ touch_move_workspace_grab_cancel -+}; -+ -+enum HMI_GRAB_DEVICE { -+ HMI_GRAB_DEVICE_NONE, -+ HMI_GRAB_DEVICE_POINTER, -+ HMI_GRAB_DEVICE_TOUCH -+}; -+ -+static enum HMI_GRAB_DEVICE -+get_hmi_grab_device(struct weston_seat *seat, uint32_t serial) -+{ -+ struct weston_pointer *pointer = seat->pointer; -+ struct weston_touch *touch = seat->touch; -+ -+ if (pointer && -+ pointer->focus && -+ pointer->button_count && -+ pointer->grab_serial == serial) -+ return HMI_GRAB_DEVICE_POINTER; -+ -+ if (touch && -+ touch->focus && -+ touch->grab_serial == serial) -+ return HMI_GRAB_DEVICE_TOUCH; -+ -+ return HMI_GRAB_DEVICE_NONE; -+} -+ -+static void -+move_grab_init(struct move_grab* move, wl_fixed_t start_pos[2], -+ wl_fixed_t grab_pos[2], wl_fixed_t rgn[2][2], -+ struct wl_resource* resource) -+{ -+ clock_gettime(CLOCK_MONOTONIC, &move->start_time); //FIXME -+ move->pre_time = move->start_time; -+ move->pos[0] = start_pos[0]; -+ move->pos[1] = start_pos[1]; -+ move->start_pos[0] = start_pos[0]; -+ move->start_pos[1] = start_pos[1]; -+ move->dst[0] = start_pos[0] - grab_pos[0]; -+ move->dst[1] = start_pos[1] - grab_pos[1]; -+ memcpy(move->rgn, rgn, sizeof(move->rgn)); -+} -+ -+static void -+move_grab_init_workspace(struct move_grab* move, -+ wl_fixed_t grab_x, wl_fixed_t grab_y, -+ struct wl_resource *resource) -+{ -+ struct hmi_controller *hmi_ctrl = wl_resource_get_user_data(resource); -+ struct ivi_layout_layer *layer = hmi_ctrl->workspace_layer.ivilayer; -+ int32_t workspace_count = hmi_ctrl->workspace_count; -+ int32_t workspace_width = hmi_ctrl->workspace_background_layer.width; -+ int32_t layer_pos_x = 0; -+ int32_t layer_pos_y = 0; -+ wl_fixed_t start_pos[2] = {0}; -+ wl_fixed_t rgn[2][2] = {{0}}; -+ wl_fixed_t grab_pos[2] = { grab_x, grab_y }; -+ -+ ivi_controller_interface->layer_get_position(layer, &layer_pos_x, &layer_pos_y); -+ -+ start_pos[0] = wl_fixed_from_int(layer_pos_x); -+ start_pos[1] = wl_fixed_from_int(layer_pos_y); -+ -+ rgn[0][0] = wl_fixed_from_int(-workspace_width * (workspace_count - 1)); -+ -+ rgn[0][1] = wl_fixed_from_int(0); -+ rgn[1][0] = wl_fixed_from_int(0); -+ rgn[1][1] = wl_fixed_from_int(0); -+ -+ move_grab_init(move, start_pos, grab_pos, rgn, resource); -+} -+ -+static struct pointer_move_grab * -+create_workspace_pointer_move(struct weston_pointer *pointer, -+ struct wl_resource* resource) -+{ -+ struct pointer_move_grab *pnt_move_grab = -+ MEM_ALLOC(sizeof(*pnt_move_grab)); -+ -+ pnt_move_grab->base.resource = resource; -+ move_grab_init_workspace(&pnt_move_grab->move, pointer->grab_x, -+ pointer->grab_y, resource); -+ -+ return pnt_move_grab; -+} -+ -+static struct touch_move_grab * -+create_workspace_touch_move(struct weston_touch *touch, -+ struct wl_resource* resource) -+{ -+ struct touch_move_grab *tch_move_grab = -+ MEM_ALLOC(sizeof(*tch_move_grab)); -+ -+ tch_move_grab->base.resource = resource; -+ tch_move_grab->is_active = 1; -+ move_grab_init_workspace(&tch_move_grab->move, touch->grab_x, -+ touch->grab_y, resource); -+ -+ return tch_move_grab; -+} -+ -+static void -+ivi_hmi_controller_workspace_control(struct wl_client *client, -+ struct wl_resource *resource, -+ struct wl_resource *seat_resource, -+ uint32_t serial) -+{ -+ struct hmi_controller *hmi_ctrl = wl_resource_get_user_data(resource); -+ struct ivi_layout_layer *layer = NULL; -+ struct pointer_move_grab *pnt_move_grab = NULL; -+ struct touch_move_grab *tch_move_grab = NULL; -+ struct weston_seat *seat = NULL; -+ struct weston_pointer *pointer; -+ struct weston_touch *touch; -+ -+ enum HMI_GRAB_DEVICE device; -+ -+ if (hmi_ctrl->workspace_count < 2) -+ return; -+ -+ seat = wl_resource_get_user_data(seat_resource); -+ device = get_hmi_grab_device(seat, serial); -+ -+ if (HMI_GRAB_DEVICE_POINTER != device && -+ HMI_GRAB_DEVICE_TOUCH != device) -+ return; -+ -+ layer = hmi_ctrl->workspace_layer.ivilayer; -+ -+ ivi_controller_interface->transition_move_layer_cancel(layer); -+ -+ switch (device) { -+ case HMI_GRAB_DEVICE_POINTER: -+ pointer = seat->pointer; -+ pnt_move_grab = create_workspace_pointer_move(pointer, -+ resource); -+ -+ pointer_grab_start(&pnt_move_grab->base, layer, -+ &pointer_move_grab_workspace_interface, -+ pointer); -+ break; -+ -+ case HMI_GRAB_DEVICE_TOUCH: -+ touch = seat->touch; -+ tch_move_grab = create_workspace_touch_move(touch, -+ resource); -+ -+ touch_grab_start(&tch_move_grab->base, layer, -+ &touch_move_grab_workspace_interface, -+ touch); -+ break; -+ -+ default: -+ break; -+ } -+} -+ -+/** -+ * Implementation of switch_mode -+ */ -+static void -+ivi_hmi_controller_switch_mode(struct wl_client *client, -+ struct wl_resource *resource, -+ uint32_t layout_mode) -+{ -+ struct hmi_controller *hmi_ctrl = wl_resource_get_user_data(resource); -+ -+ switch_mode(hmi_ctrl, layout_mode); -+} -+ -+/** -+ * Implementation of on/off displaying workspace and workspace background -+ * ivi_layers. -+ */ -+static void -+ivi_hmi_controller_home(struct wl_client *client, -+ struct wl_resource *resource, -+ uint32_t home) -+{ -+ struct hmi_controller *hmi_ctrl = wl_resource_get_user_data(resource); -+ uint32_t is_fade_in; -+ -+ if ((IVI_HMI_CONTROLLER_HOME_ON == home && -+ !hmi_ctrl->workspace_fade.is_fade_in) || -+ (IVI_HMI_CONTROLLER_HOME_OFF == home && -+ hmi_ctrl->workspace_fade.is_fade_in)) { -+ is_fade_in = !hmi_ctrl->workspace_fade.is_fade_in; -+ hmi_controller_fade_run(hmi_ctrl, is_fade_in, -+ &hmi_ctrl->workspace_fade); -+ } -+ -+ ivi_controller_interface->commit_changes(); -+} -+ -+/** -+ * binding ivi-hmi-controller implementation -+ */ -+static const struct ivi_hmi_controller_interface ivi_hmi_controller_implementation = { -+ ivi_hmi_controller_UI_ready, -+ ivi_hmi_controller_workspace_control, -+ ivi_hmi_controller_switch_mode, -+ ivi_hmi_controller_home -+}; -+ -+static void -+unbind_hmi_controller(struct wl_resource *resource) -+{ -+} -+ -+static void -+bind_hmi_controller(struct wl_client *client, -+ void *data, uint32_t version, uint32_t id) -+{ -+ struct wl_resource *resource = NULL; -+ struct hmi_controller *hmi_ctrl = data; -+ -+ if (hmi_ctrl->user_interface != client) { -+ struct wl_resource *res = wl_client_get_object(client, 1); -+ wl_resource_post_error(res, -+ WL_DISPLAY_ERROR_INVALID_OBJECT, -+ "hmi-controller failed: permission denied"); -+ return; -+ } -+ -+ resource = wl_resource_create( -+ client, &ivi_hmi_controller_interface, 1, id); -+ -+ wl_resource_set_implementation( -+ resource, &ivi_hmi_controller_implementation, -+ hmi_ctrl, unbind_hmi_controller); -+} -+ -+static void -+handle_hmi_client_process_sigchld(struct weston_process *proc, int status) -+{ -+ proc->pid = 0; -+} -+ -+static int32_t -+initialize(struct hmi_controller *hmi_ctrl) -+{ -+ struct config_command { -+ char *key; -+ uint32_t *dest; -+ }; -+ -+ struct weston_config *config = hmi_ctrl->compositor->config; -+ struct weston_config_section *section = NULL; -+ int result = 0; -+ int i = 0; -+ -+ const struct config_command uint_commands[] = { -+ { "background-id", &hmi_ctrl->ui_setting.background_id }, -+ { "panel-id", &hmi_ctrl->ui_setting.panel_id }, -+ { "tiling-id", &hmi_ctrl->ui_setting.tiling_id }, -+ { "sidebyside-id", &hmi_ctrl->ui_setting.sidebyside_id }, -+ { "fullscreen-id", &hmi_ctrl->ui_setting.fullscreen_id }, -+ { "random-id", &hmi_ctrl->ui_setting.random_id }, -+ { "home-id", &hmi_ctrl->ui_setting.home_id }, -+ { "workspace-background-id", &hmi_ctrl->ui_setting.workspace_background_id }, -+ { NULL, NULL } -+ }; -+ -+ section = weston_config_get_section(config, "ivi-shell", NULL, NULL); -+ -+ for (i = 0; -1 != result; ++i) { -+ const struct config_command *command = &uint_commands[i]; -+ -+ if (!command->key) -+ break; -+ -+ if (weston_config_section_get_uint( -+ section, command->key, command->dest, 0) != 0) -+ result = -1; -+ } -+ -+ if (-1 == result) { -+ weston_log("Failed to initialize hmi-controller\n"); -+ return 0; -+ } -+ -+ return 1; -+} -+ -+static void -+launch_hmi_client_process(void *data) -+{ -+ struct hmi_controller *hmi_ctrl = -+ (struct hmi_controller *)data; -+ -+ hmi_ctrl->user_interface = -+ weston_client_launch(hmi_ctrl->compositor, -+ &hmi_ctrl->process, -+ hmi_ctrl->hmi_setting->ivi_homescreen, -+ handle_hmi_client_process_sigchld); -+ -+ free(hmi_ctrl->hmi_setting->ivi_homescreen); -+} -+ -+/***************************************************************************** -+ * exported functions -+ ****************************************************************************/ -+WL_EXPORT int -+controller_module_init(struct weston_compositor *ec, -+ int *argc, char *argv[], -+ const struct ivi_controller_interface *interface, -+ size_t interface_version) -+{ -+ struct hmi_controller *hmi_ctrl = NULL; -+ struct wl_event_loop *loop = NULL; -+ -+ if (interface_version < sizeof(struct ivi_controller_interface)) { -+ weston_log("ivi-shell: version mismatch of controller interface"); -+ return -1; -+ } -+ -+ ivi_controller_interface = interface; -+ -+ hmi_ctrl = hmi_controller_create(ec); -+ -+ if (!initialize(hmi_ctrl)) { -+ return -1; -+ } -+ -+ if (wl_global_create(ec->wl_display, -+ &ivi_hmi_controller_interface, 1, -+ hmi_ctrl, bind_hmi_controller) == NULL) { -+ return -1; -+ } -+ -+ loop = wl_display_get_event_loop(ec->wl_display); -+ wl_event_loop_add_idle(loop, launch_hmi_client_process, hmi_ctrl); -+ -+ return 0; -+} -diff --git a/ivi-shell/input-panel-ivi.c b/ivi-shell/input-panel-ivi.c -new file mode 100644 -index 0000000..51d2b8a ---- /dev/null -+++ b/ivi-shell/input-panel-ivi.c -@@ -0,0 +1,397 @@ -+/* -+ * Copyright © 2010-2012 Intel Corporation -+ * Copyright © 2011-2012 Collabora, Ltd. -+ * Copyright © 2013 Raspberry Pi Foundation -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining -+ * a copy of this software and associated documentation files (the -+ * "Software"), to deal in the Software without restriction, including -+ * without limitation the rights to use, copy, modify, merge, publish, -+ * distribute, sublicense, and/or sell copies of the Software, and to -+ * permit persons to whom the Software is furnished to do so, subject to -+ * the following conditions: -+ * -+ * The above copyright notice and this permission notice (including the -+ * next paragraph) shall be included in all copies or substantial -+ * portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -+ * SOFTWARE. -+ */ -+ -+#include "config.h" -+ -+#include -+#include -+#include -+ -+#include "ivi-shell.h" -+#include "input-method-server-protocol.h" -+#include "ivi-layout-private.h" -+#include "shared/helpers.h" -+ -+struct input_panel_surface { -+ struct wl_resource *resource; -+ struct wl_signal destroy_signal; -+ -+ struct ivi_shell *shell; -+ -+ struct wl_list link; -+ struct weston_surface *surface; -+ struct weston_view *view; -+ struct wl_listener surface_destroy_listener; -+ -+ struct weston_view_animation *anim; -+ -+ struct weston_output *output; -+ uint32_t panel; -+}; -+ -+static void -+input_panel_slide_done(struct weston_view_animation *animation, void *data) -+{ -+ struct input_panel_surface *ipsurf = data; -+ -+ ipsurf->anim = NULL; -+} -+ -+static void -+show_input_panel_surface(struct input_panel_surface *ipsurf) -+{ -+ struct ivi_shell *shell = ipsurf->shell; -+ struct weston_seat *seat; -+ struct weston_surface *focus; -+ float x, y; -+ -+ wl_list_for_each(seat, &shell->compositor->seat_list, link) { -+ struct weston_keyboard *keyboard = seat->keyboard; -+ -+ if (!keyboard || !keyboard->focus) -+ continue; -+ focus = weston_surface_get_main_surface(keyboard->focus); -+ ipsurf->output = focus->output; -+ x = ipsurf->output->x + (ipsurf->output->width - ipsurf->surface->width) / 2; -+ y = ipsurf->output->y + ipsurf->output->height - ipsurf->surface->height; -+ weston_view_set_position(ipsurf->view, x, y); -+ } -+ -+ wl_list_insert(&shell->input_panel_layer.view_list, -+ &ipsurf->view->layer_link); -+ weston_view_geometry_dirty(ipsurf->view); -+ weston_view_update_transform(ipsurf->view); -+ weston_surface_damage(ipsurf->surface); -+ -+ if (ipsurf->anim) -+ weston_view_animation_destroy(ipsurf->anim); -+ -+ ipsurf->anim = -+ weston_slide_run(ipsurf->view, -+ ipsurf->surface->height * 0.9, 0, -+ input_panel_slide_done, ipsurf); -+} -+ -+static void -+show_input_panels(struct wl_listener *listener, void *data) -+{ -+ struct ivi_shell *shell = -+ container_of(listener, struct ivi_shell, -+ show_input_panel_listener); -+ struct input_panel_surface *ipsurf, *next; -+ -+ shell->text_input.surface = (struct weston_surface*)data; -+ -+ if (shell->showing_input_panels) -+ return; -+ -+ shell->showing_input_panels = true; -+ -+ if (!shell->locked) -+ wl_list_insert(&shell->compositor->cursor_layer.link, -+ &shell->input_panel_layer.link); -+ -+ wl_list_for_each_safe(ipsurf, next, -+ &shell->input_panel.surfaces, link) { -+ if (ipsurf->surface->width == 0) -+ continue; -+ -+ show_input_panel_surface(ipsurf); -+ } -+} -+ -+static void -+hide_input_panels(struct wl_listener *listener, void *data) -+{ -+ struct ivi_shell *shell = -+ container_of(listener, struct ivi_shell, -+ hide_input_panel_listener); -+ struct weston_view *view, *next; -+ -+ if (!shell->showing_input_panels) -+ return; -+ -+ shell->showing_input_panels = false; -+ -+ if (!shell->locked) -+ wl_list_remove(&shell->input_panel_layer.link); -+ -+ wl_list_for_each_safe(view, next, -+ &shell->input_panel_layer.view_list, -+ layer_link) -+ weston_view_unmap(view); -+} -+ -+static void -+update_input_panels(struct wl_listener *listener, void *data) -+{ -+ struct ivi_shell *shell = -+ container_of(listener, struct ivi_shell, -+ update_input_panel_listener); -+ -+ memcpy(&shell->text_input.cursor_rectangle, data, sizeof(pixman_box32_t)); -+} -+ -+static void -+input_panel_configure(struct weston_surface *surface, int32_t sx, int32_t sy) -+{ -+ struct input_panel_surface *ip_surface = surface->configure_private; -+ struct ivi_shell *shell = ip_surface->shell; -+ struct weston_view *view; -+ float x, y; -+ -+ if (surface->width == 0) -+ return; -+ -+ if (ip_surface->panel) { -+ view = get_default_view(shell->text_input.surface); -+ if (view == NULL) -+ return; -+ x = view->geometry.x + shell->text_input.cursor_rectangle.x2; -+ y = view->geometry.y + shell->text_input.cursor_rectangle.y2; -+ } else { -+ x = ip_surface->output->x + (ip_surface->output->width - surface->width) / 2; -+ y = ip_surface->output->y + ip_surface->output->height - surface->height; -+ } -+ -+ weston_view_set_position(ip_surface->view, x, y); -+ -+ if (!weston_surface_is_mapped(surface) && shell->showing_input_panels) -+ show_input_panel_surface(ip_surface); -+} -+ -+static void -+destroy_input_panel_surface(struct input_panel_surface *input_panel_surface) -+{ -+ wl_signal_emit(&input_panel_surface->destroy_signal, input_panel_surface); -+ -+ wl_list_remove(&input_panel_surface->surface_destroy_listener.link); -+ wl_list_remove(&input_panel_surface->link); -+ -+ input_panel_surface->surface->configure = NULL; -+ weston_view_destroy(input_panel_surface->view); -+ -+ free(input_panel_surface); -+} -+ -+static struct input_panel_surface * -+get_input_panel_surface(struct weston_surface *surface) -+{ -+ if (surface->configure == input_panel_configure) { -+ return surface->configure_private; -+ } else { -+ return NULL; -+ } -+} -+ -+static void -+input_panel_handle_surface_destroy(struct wl_listener *listener, void *data) -+{ -+ struct input_panel_surface *ipsurface = container_of(listener, -+ struct input_panel_surface, -+ surface_destroy_listener); -+ -+ if (ipsurface->resource) { -+ wl_resource_destroy(ipsurface->resource); -+ } else { -+ destroy_input_panel_surface(ipsurface); -+ } -+} -+ -+static struct input_panel_surface * -+create_input_panel_surface(struct ivi_shell *shell, -+ struct weston_surface *surface) -+{ -+ struct input_panel_surface *input_panel_surface; -+ -+ input_panel_surface = calloc(1, sizeof *input_panel_surface); -+ if (!input_panel_surface) -+ return NULL; -+ -+ surface->configure = input_panel_configure; -+ surface->configure_private = input_panel_surface; -+ -+ input_panel_surface->shell = shell; -+ -+ input_panel_surface->surface = surface; -+ input_panel_surface->view = weston_view_create(surface); -+ -+ wl_signal_init(&input_panel_surface->destroy_signal); -+ input_panel_surface->surface_destroy_listener.notify = input_panel_handle_surface_destroy; -+ wl_signal_add(&surface->destroy_signal, -+ &input_panel_surface->surface_destroy_listener); -+ -+ wl_list_init(&input_panel_surface->link); -+ -+ return input_panel_surface; -+} -+ -+static void -+input_panel_surface_set_toplevel(struct wl_client *client, -+ struct wl_resource *resource, -+ struct wl_resource *output_resource, -+ uint32_t position) -+{ -+ struct input_panel_surface *input_panel_surface = -+ wl_resource_get_user_data(resource); -+ struct ivi_shell *shell = input_panel_surface->shell; -+ -+ wl_list_insert(&shell->input_panel.surfaces, -+ &input_panel_surface->link); -+ -+ input_panel_surface->output = wl_resource_get_user_data(output_resource); -+ input_panel_surface->panel = 0; -+} -+ -+static void -+input_panel_surface_set_overlay_panel(struct wl_client *client, -+ struct wl_resource *resource) -+{ -+ struct input_panel_surface *input_panel_surface = -+ wl_resource_get_user_data(resource); -+ struct ivi_shell *shell = input_panel_surface->shell; -+ -+ wl_list_insert(&shell->input_panel.surfaces, -+ &input_panel_surface->link); -+ -+ input_panel_surface->panel = 1; -+} -+ -+static const struct wl_input_panel_surface_interface input_panel_surface_implementation = { -+ input_panel_surface_set_toplevel, -+ input_panel_surface_set_overlay_panel -+}; -+ -+static void -+destroy_input_panel_surface_resource(struct wl_resource *resource) -+{ -+ struct input_panel_surface *ipsurf = -+ wl_resource_get_user_data(resource); -+ -+ destroy_input_panel_surface(ipsurf); -+} -+ -+static void -+input_panel_get_input_panel_surface(struct wl_client *client, -+ struct wl_resource *resource, -+ uint32_t id, -+ struct wl_resource *surface_resource) -+{ -+ struct weston_surface *surface = -+ wl_resource_get_user_data(surface_resource); -+ struct ivi_shell *shell = wl_resource_get_user_data(resource); -+ struct input_panel_surface *ipsurf; -+ -+ if (get_input_panel_surface(surface)) { -+ wl_resource_post_error(surface_resource, -+ WL_DISPLAY_ERROR_INVALID_OBJECT, -+ "wl_input_panel::get_input_panel_surface already requested"); -+ return; -+ } -+ -+ ipsurf = create_input_panel_surface(shell, surface); -+ if (!ipsurf) { -+ wl_resource_post_error(surface_resource, -+ WL_DISPLAY_ERROR_INVALID_OBJECT, -+ "surface->configure already set"); -+ return; -+ } -+ -+ ipsurf->resource = -+ wl_resource_create(client, -+ &wl_input_panel_surface_interface, 1, id); -+ wl_resource_set_implementation(ipsurf->resource, -+ &input_panel_surface_implementation, -+ ipsurf, -+ destroy_input_panel_surface_resource); -+} -+ -+static const struct wl_input_panel_interface input_panel_implementation = { -+ input_panel_get_input_panel_surface -+}; -+ -+static void -+unbind_input_panel(struct wl_resource *resource) -+{ -+ struct ivi_shell *shell = wl_resource_get_user_data(resource); -+ -+ shell->input_panel.binding = NULL; -+} -+ -+static void -+bind_input_panel(struct wl_client *client, -+ void *data, uint32_t version, uint32_t id) -+{ -+ struct ivi_shell *shell = data; -+ struct wl_resource *resource; -+ -+ resource = wl_resource_create(client, -+ &wl_input_panel_interface, 1, id); -+ -+ if (shell->input_panel.binding == NULL) { -+ wl_resource_set_implementation(resource, -+ &input_panel_implementation, -+ shell, unbind_input_panel); -+ shell->input_panel.binding = resource; -+ return; -+ } -+ -+ wl_resource_post_error(resource, WL_DISPLAY_ERROR_INVALID_OBJECT, -+ "interface object already bound"); -+} -+ -+void -+input_panel_destroy(struct ivi_shell *shell) -+{ -+ wl_list_remove(&shell->show_input_panel_listener.link); -+ wl_list_remove(&shell->hide_input_panel_listener.link); -+} -+ -+int -+input_panel_setup(struct ivi_shell *shell) -+{ -+ struct weston_compositor *ec = shell->compositor; -+ -+ shell->show_input_panel_listener.notify = show_input_panels; -+ wl_signal_add(&ec->show_input_panel_signal, -+ &shell->show_input_panel_listener); -+ shell->hide_input_panel_listener.notify = hide_input_panels; -+ wl_signal_add(&ec->hide_input_panel_signal, -+ &shell->hide_input_panel_listener); -+ shell->update_input_panel_listener.notify = update_input_panels; -+ wl_signal_add(&ec->update_input_panel_signal, -+ &shell->update_input_panel_listener); -+ -+ wl_list_init(&shell->input_panel.surfaces); -+ -+ if (wl_global_create(shell->compositor->wl_display, -+ &wl_input_panel_interface, 1, -+ shell, bind_input_panel) == NULL) -+ return -1; -+ -+ return 0; -+} -diff --git a/ivi-shell/ivi-layout-export.h b/ivi-shell/ivi-layout-export.h -new file mode 100644 -index 0000000..8a92009 ---- /dev/null -+++ b/ivi-shell/ivi-layout-export.h -@@ -0,0 +1,813 @@ -+/* -+ * Copyright (C) 2013 DENSO CORPORATION -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining -+ * a copy of this software and associated documentation files (the -+ * "Software"), to deal in the Software without restriction, including -+ * without limitation the rights to use, copy, modify, merge, publish, -+ * distribute, sublicense, and/or sell copies of the Software, and to -+ * permit persons to whom the Software is furnished to do so, subject to -+ * the following conditions: -+ * -+ * The above copyright notice and this permission notice (including the -+ * next paragraph) shall be included in all copies or substantial -+ * portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -+ * SOFTWARE. -+ */ -+ -+/** -+ * The ivi-layout library supports API set of controlling properties of -+ * surface and layer which groups surfaces. An unique ID whose type is integer -+ * is required to create surface and layer. With the unique ID, surface and -+ * layer are identified to control them. The API set consists of APIs to control -+ * properties of surface and layers about followings, -+ * - visibility. -+ * - opacity. -+ * - clipping (x,y,width,height). -+ * - position and size of it to be displayed. -+ * - orientation per 90 degree. -+ * - add or remove surfaces to a layer. -+ * - order of surfaces/layers in layer/screen to be displayed. -+ * - commit to apply property changes. -+ * - notifications of property change. -+ * -+ * Management of surfaces and layers grouping these surfaces are common -+ * way in In-Vehicle Infotainment system, which integrate several domains -+ * in one system. A layer is allocated to a domain in order to control -+ * application surfaces grouped to the layer all together. -+ * -+ * This API and ABI follow following specifications. -+ * http://projects.genivi.org/wayland-ivi-extension/layer-manager-apis -+ */ -+ -+#ifndef _IVI_LAYOUT_EXPORT_H_ -+#define _IVI_LAYOUT_EXPORT_H_ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif /* __cplusplus */ -+ -+#include "stdbool.h" -+#include "compositor.h" -+ -+#define IVI_SUCCEEDED (0) -+#define IVI_FAILED (-1) -+ -+struct ivi_layout_layer; -+struct ivi_layout_screen; -+struct ivi_layout_surface; -+ -+struct ivi_layout_surface_properties -+{ -+ wl_fixed_t opacity; -+ int32_t source_x; -+ int32_t source_y; -+ int32_t source_width; -+ int32_t source_height; -+ int32_t start_x; -+ int32_t start_y; -+ int32_t start_width; -+ int32_t start_height; -+ int32_t dest_x; -+ int32_t dest_y; -+ int32_t dest_width; -+ int32_t dest_height; -+ enum wl_output_transform orientation; -+ bool visibility; -+ int32_t transition_type; -+ uint32_t transition_duration; -+}; -+ -+struct ivi_layout_layer_properties -+{ -+ wl_fixed_t opacity; -+ int32_t source_x; -+ int32_t source_y; -+ int32_t source_width; -+ int32_t source_height; -+ int32_t dest_x; -+ int32_t dest_y; -+ int32_t dest_width; -+ int32_t dest_height; -+ enum wl_output_transform orientation; -+ uint32_t visibility; -+ int32_t transition_type; -+ uint32_t transition_duration; -+ double start_alpha; -+ double end_alpha; -+ uint32_t is_fade_in; -+}; -+ -+enum ivi_layout_notification_mask { -+ IVI_NOTIFICATION_NONE = 0, -+ IVI_NOTIFICATION_OPACITY = (1 << 1), -+ IVI_NOTIFICATION_SOURCE_RECT = (1 << 2), -+ IVI_NOTIFICATION_DEST_RECT = (1 << 3), -+ IVI_NOTIFICATION_DIMENSION = (1 << 4), -+ IVI_NOTIFICATION_POSITION = (1 << 5), -+ IVI_NOTIFICATION_ORIENTATION = (1 << 6), -+ IVI_NOTIFICATION_VISIBILITY = (1 << 7), -+ IVI_NOTIFICATION_PIXELFORMAT = (1 << 8), -+ IVI_NOTIFICATION_ADD = (1 << 9), -+ IVI_NOTIFICATION_REMOVE = (1 << 10), -+ IVI_NOTIFICATION_CONFIGURE = (1 << 11), -+ IVI_NOTIFICATION_ALL = 0xFFFF -+}; -+ -+enum ivi_layout_transition_type{ -+ IVI_LAYOUT_TRANSITION_NONE, -+ IVI_LAYOUT_TRANSITION_VIEW_DEFAULT, -+ IVI_LAYOUT_TRANSITION_VIEW_DEST_RECT_ONLY, -+ IVI_LAYOUT_TRANSITION_VIEW_FADE_ONLY, -+ IVI_LAYOUT_TRANSITION_LAYER_FADE, -+ IVI_LAYOUT_TRANSITION_LAYER_MOVE, -+ IVI_LAYOUT_TRANSITION_LAYER_VIEW_ORDER, -+ IVI_LAYOUT_TRANSITION_VIEW_MOVE_RESIZE, -+ IVI_LAYOUT_TRANSITION_VIEW_RESIZE, -+ IVI_LAYOUT_TRANSITION_VIEW_FADE, -+ IVI_LAYOUT_TRANSITION_MAX, -+}; -+ -+typedef void (*layer_property_notification_func)( -+ struct ivi_layout_layer *ivilayer, -+ const struct ivi_layout_layer_properties *, -+ enum ivi_layout_notification_mask mask, -+ void *userdata); -+ -+typedef void (*surface_property_notification_func)( -+ struct ivi_layout_surface *ivisurf, -+ const struct ivi_layout_surface_properties *, -+ enum ivi_layout_notification_mask mask, -+ void *userdata); -+ -+typedef void (*layer_create_notification_func)( -+ struct ivi_layout_layer *ivilayer, -+ void *userdata); -+ -+typedef void (*layer_remove_notification_func)( -+ struct ivi_layout_layer *ivilayer, -+ void *userdata); -+ -+typedef void (*surface_create_notification_func)( -+ struct ivi_layout_surface *ivisurf, -+ void *userdata); -+ -+typedef void (*surface_remove_notification_func)( -+ struct ivi_layout_surface *ivisurf, -+ void *userdata); -+ -+typedef void (*surface_configure_notification_func)( -+ struct ivi_layout_surface *ivisurf, -+ void *userdata); -+ -+typedef void (*ivi_controller_surface_content_callback)( -+ struct ivi_layout_surface *ivisurf, -+ int32_t content, -+ void *userdata); -+ -+struct ivi_controller_interface { -+ -+ /** -+ * \brief Commit all changes and execute all enqueued commands since -+ * last commit. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*commit_changes)(void); -+ -+ /** -+ * surface controller interface -+ */ -+ -+ /** -+ * \brief register/unregister for notification when ivi_surface is created -+ */ -+ int32_t (*add_notification_create_surface)( -+ surface_create_notification_func callback, -+ void *userdata); -+ -+ void (*remove_notification_create_surface)( -+ surface_create_notification_func callback, -+ void *userdata); -+ -+ /** -+ * \brief register/unregister for notification when ivi_surface is removed -+ */ -+ int32_t (*add_notification_remove_surface)( -+ surface_remove_notification_func callback, -+ void *userdata); -+ -+ void (*remove_notification_remove_surface)( -+ surface_remove_notification_func callback, -+ void *userdata); -+ -+ /** -+ * \brief register/unregister for notification when ivi_surface is configured -+ */ -+ int32_t (*add_notification_configure_surface)( -+ surface_configure_notification_func callback, -+ void *userdata); -+ -+ void (*remove_notification_configure_surface)( -+ surface_configure_notification_func callback, -+ void *userdata); -+ -+ /** -+ * \brief Get all ivi_surfaces which are currently registered and managed -+ * by the services -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*get_surfaces)(int32_t *pLength, struct ivi_layout_surface ***ppArray); -+ -+ /** -+ * \brief get id of ivi_surface from ivi_layout_surface -+ * -+ * \return id of ivi_surface -+ */ -+ uint32_t (*get_id_of_surface)(struct ivi_layout_surface *ivisurf); -+ -+ /** -+ * \brief get ivi_layout_surface from id of ivi_surface -+ * -+ * \return (struct ivi_layout_surface *) -+ * if the method call was successful -+ * \return NULL if the method call was failed -+ */ -+ struct ivi_layout_surface * -+ (*get_surface_from_id)(uint32_t id_surface); -+ -+ /** -+ * \brief get ivi_layout_surface_properties from ivisurf -+ * -+ * \return (struct ivi_layout_surface_properties *) -+ * if the method call was successful -+ * \return NULL if the method call was failed -+ */ -+ const struct ivi_layout_surface_properties * -+ (*get_properties_of_surface)(struct ivi_layout_surface *ivisurf); -+ -+ /** -+ * \brief Get all Surfaces which are currently registered to a given -+ * layer and are managed by the services -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*get_surfaces_on_layer)(struct ivi_layout_layer *ivilayer, -+ int32_t *pLength, -+ struct ivi_layout_surface ***ppArray); -+ -+ /** -+ * \brief Set the visibility of a ivi_surface. -+ * -+ * If a surface is not visible it will not be rendered. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*surface_set_visibility)(struct ivi_layout_surface *ivisurf, -+ bool newVisibility); -+ -+ /** -+ * \brief Get the visibility of a surface. -+ * -+ * If a surface is not visible it will not be rendered. -+ * -+ * \return true if surface is visible -+ * \return false if surface is invisible or the method call was failed -+ */ -+ bool (*surface_get_visibility)(struct ivi_layout_surface *ivisurf); -+ -+ /** -+ * \brief Set the opacity of a surface. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*surface_set_opacity)(struct ivi_layout_surface *ivisurf, -+ wl_fixed_t opacity); -+ -+ /** -+ * \brief Get the opacity of a ivi_surface. -+ * -+ * \return opacity if the method call was successful -+ * \return wl_fixed_from_double(0.0) if the method call was failed -+ */ -+ wl_fixed_t (*surface_get_opacity)(struct ivi_layout_surface *ivisurf); -+ -+ /** -+ * \brief Set the area of a ivi_surface which should be used for the rendering. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*surface_set_source_rectangle)(struct ivi_layout_surface *ivisurf, -+ int32_t x, int32_t y, -+ int32_t width, int32_t height); -+ -+ /** -+ * \brief Set the destination area of a ivi_surface within a ivi_layer -+ * for rendering. -+ * -+ * The surface will be scaled to this rectangle for rendering. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*surface_set_destination_rectangle)(struct ivi_layout_surface *ivisurf, -+ int32_t x, int32_t y, -+ int32_t width, int32_t height); -+ -+ /** -+ * \brief Sets the horizontal and vertical position of the surface. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*surface_set_position)(struct ivi_layout_surface *ivisurf, -+ int32_t dest_x, int32_t dest_y); -+ -+ /** -+ * \brief Get the horizontal and vertical position of the surface. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*surface_get_position)(struct ivi_layout_surface *ivisurf, -+ int32_t *dest_x, int32_t *dest_y); -+ -+ /** -+ * \brief Set the horizontal and vertical dimension of the surface. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*surface_set_dimension)(struct ivi_layout_surface *ivisurf, -+ int32_t dest_width, int32_t dest_height); -+ -+ /** -+ * \brief Get the horizontal and vertical dimension of the surface. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*surface_get_dimension)(struct ivi_layout_surface *ivisurf, -+ int32_t *dest_width, int32_t *dest_height); -+ -+ /** -+ * \brief Sets the orientation of a ivi_surface. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*surface_set_orientation)(struct ivi_layout_surface *ivisurf, -+ enum wl_output_transform orientation); -+ -+ /** -+ * \brief Gets the orientation of a surface. -+ * -+ * \return (enum wl_output_transform) -+ * if the method call was successful -+ * \return WL_OUTPUT_TRANSFORM_NORMAL if the method call was failed -+ */ -+ enum wl_output_transform -+ (*surface_get_orientation)(struct ivi_layout_surface *ivisurf); -+ -+ /** -+ * \brief Set an observer callback for ivi_surface content status change. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*surface_set_content_observer)( -+ struct ivi_layout_surface *ivisurf, -+ ivi_controller_surface_content_callback callback, -+ void* userdata); -+ -+ /** -+ * \brief register for notification on property changes of ivi_surface -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*surface_add_notification)(struct ivi_layout_surface *ivisurf, -+ surface_property_notification_func callback, -+ void *userdata); -+ -+ /** -+ * \brief remove notification on property changes of ivi_surface -+ */ -+ void (*surface_remove_notification)(struct ivi_layout_surface *ivisurf); -+ -+ /** -+ * \brief get weston_surface of ivi_surface -+ */ -+ struct weston_surface * -+ (*surface_get_weston_surface)(struct ivi_layout_surface *ivisurf); -+ -+ /** -+ * \brief set type of transition animation -+ */ -+ int32_t (*surface_set_transition)(struct ivi_layout_surface *ivisurf, -+ enum ivi_layout_transition_type type, -+ uint32_t duration); -+ -+ /** -+ * \brief set duration of transition animation -+ */ -+ int32_t (*surface_set_transition_duration)( -+ struct ivi_layout_surface *ivisurf, -+ uint32_t duration); -+ -+ /** -+ * layer controller interface -+ */ -+ -+ /** -+ * \brief register/unregister for notification when ivi_layer is created -+ */ -+ int32_t (*add_notification_create_layer)( -+ layer_create_notification_func callback, -+ void *userdata); -+ -+ void (*remove_notification_create_layer)( -+ layer_create_notification_func callback, -+ void *userdata); -+ -+ /** -+ * \brief register/unregister for notification when ivi_layer is removed -+ */ -+ int32_t (*add_notification_remove_layer)( -+ layer_remove_notification_func callback, -+ void *userdata); -+ -+ void (*remove_notification_remove_layer)( -+ layer_remove_notification_func callback, -+ void *userdata); -+ -+ /** -+ * \brief Create a ivi_layer which should be managed by the service -+ * -+ * \return (struct ivi_layout_layer *) -+ * if the method call was successful -+ * \return NULL if the method call was failed -+ */ -+ struct ivi_layout_layer * -+ (*layer_create_with_dimension)(uint32_t id_layer, -+ int32_t width, int32_t height); -+ -+ /** -+ * \brief Removes a ivi_layer which is currently managed by the service -+ */ -+ void (*layer_destroy)(struct ivi_layout_layer *ivilayer); -+ -+ /** -+ * \brief Get all ivi_layers which are currently registered and managed -+ * by the services -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*get_layers)(int32_t *pLength, struct ivi_layout_layer ***ppArray); -+ -+ /** -+ * \brief get id of ivi_layer from ivi_layout_layer -+ * -+ * -+ * \return id of ivi_layer -+ */ -+ uint32_t (*get_id_of_layer)(struct ivi_layout_layer *ivilayer); -+ -+ /** -+ * \brief get ivi_layout_layer from id of layer -+ * -+ * \return (struct ivi_layout_layer *) -+ * if the method call was successful -+ * \return NULL if the method call was failed -+ */ -+ struct ivi_layout_layer * (*get_layer_from_id)(uint32_t id_layer); -+ -+ /** -+ * \brief Get the ivi_layer properties -+ * -+ * \return (const struct ivi_layout_layer_properties *) -+ * if the method call was successful -+ * \return NULL if the method call was failed -+ */ -+ const struct ivi_layout_layer_properties * -+ (*get_properties_of_layer)(struct ivi_layout_layer *ivilayer); -+ -+ /** -+ * \brief Get all ivi_ayers under the given ivi_surface -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*get_layers_under_surface)(struct ivi_layout_surface *ivisurf, -+ int32_t *pLength, -+ struct ivi_layout_layer ***ppArray); -+ -+ /** -+ * \brief Get all Layers of the given screen -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*get_layers_on_screen)(struct ivi_layout_screen *iviscrn, -+ int32_t *pLength, -+ struct ivi_layout_layer ***ppArray); -+ -+ /** -+ * \brief Set the visibility of a ivi_layer. If a ivi_layer is not visible, -+ * the ivi_layer and its ivi_surfaces will not be rendered. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*layer_set_visibility)(struct ivi_layout_layer *ivilayer, -+ bool newVisibility); -+ -+ /** -+ * \brief Get the visibility of a layer. If a layer is not visible, -+ * the layer and its surfaces will not be rendered. -+ * -+ * \return true if layer is visible -+ * \return false if layer is invisible or the method call was failed -+ */ -+ bool (*layer_get_visibility)(struct ivi_layout_layer *ivilayer); -+ -+ /** -+ * \brief Set the opacity of a ivi_layer. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*layer_set_opacity)(struct ivi_layout_layer *ivilayer, -+ wl_fixed_t opacity); -+ -+ /** -+ * \brief Get the opacity of a ivi_layer. -+ * -+ * \return opacity if the method call was successful -+ * \return wl_fixed_from_double(0.0) if the method call was failed -+ */ -+ wl_fixed_t (*layer_get_opacity)(struct ivi_layout_layer *ivilayer); -+ -+ /** -+ * \brief Set the area of a ivi_layer which should be used for the rendering. -+ * -+ * Only this part will be visible. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*layer_set_source_rectangle)(struct ivi_layout_layer *ivilayer, -+ int32_t x, int32_t y, -+ int32_t width, int32_t height); -+ -+ /** -+ * \brief Set the destination area on the display for a ivi_layer. -+ * -+ * The ivi_layer will be scaled and positioned to this rectangle -+ * for rendering -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*layer_set_destination_rectangle)(struct ivi_layout_layer *ivilayer, -+ int32_t x, int32_t y, -+ int32_t width, int32_t height); -+ -+ /** -+ * \brief Sets the horizontal and vertical position of the ivi_layer. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*layer_set_position)(struct ivi_layout_layer *ivilayer, -+ int32_t dest_x, int32_t dest_y); -+ -+ /** -+ * \brief Get the horizontal and vertical position of the ivi_layer. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*layer_get_position)(struct ivi_layout_layer *ivilayer, -+ int32_t *dest_x, int32_t *dest_y); -+ -+ /** -+ * \brief Set the horizontal and vertical dimension of the layer. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*layer_set_dimension)(struct ivi_layout_layer *ivilayer, -+ int32_t dest_width, int32_t dest_height); -+ -+ /** -+ * \brief Get the horizontal and vertical dimension of the layer. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*layer_get_dimension)(struct ivi_layout_layer *ivilayer, -+ int32_t *dest_width, int32_t *dest_height); -+ -+ /** -+ * \brief Sets the orientation of a ivi_layer. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*layer_set_orientation)(struct ivi_layout_layer *ivilayer, -+ enum wl_output_transform orientation); -+ -+ /** -+ * \brief Gets the orientation of a layer. -+ * -+ * \return (enum wl_output_transform) -+ * if the method call was successful -+ * \return WL_OUTPUT_TRANSFORM_NORMAL if the method call was failed -+ */ -+ enum wl_output_transform -+ (*layer_get_orientation)(struct ivi_layout_layer *ivilayer); -+ -+ /** -+ * \brief Add a ivi_surface to a ivi_layer which is currently managed by the service -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*layer_add_surface)(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface *addsurf); -+ -+ /** -+ * \brief Removes a surface from a layer which is currently managed by the service -+ */ -+ void (*layer_remove_surface)(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface *remsurf); -+ -+ /** -+ * \brief Sets render order of ivi_surfaces within a ivi_layer -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*layer_set_render_order)(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface **pSurface, -+ int32_t number); -+ -+ /** -+ * \brief register for notification on property changes of ivi_layer -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*layer_add_notification)(struct ivi_layout_layer *ivilayer, -+ layer_property_notification_func callback, -+ void *userdata); -+ -+ /** -+ * \brief remove notification on property changes of ivi_layer -+ */ -+ void (*layer_remove_notification)(struct ivi_layout_layer *ivilayer); -+ -+ /** -+ * \brief set type of transition animation -+ */ -+ int32_t (*layer_set_transition)(struct ivi_layout_layer *ivilayer, -+ enum ivi_layout_transition_type type, -+ uint32_t duration); -+ -+ /** -+ * screen controller interface -+ */ -+ -+ /** -+ * \brief get ivi_layout_screen from id of ivi_screen -+ * -+ * \return (struct ivi_layout_screen *) -+ * if the method call was successful -+ * \return NULL if the method call was failed -+ */ -+ struct ivi_layout_screen * -+ (*get_screen_from_id)(uint32_t id_screen); -+ -+ /** -+ * \brief Get the screen resolution of a specific ivi_screen -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*get_screen_resolution)(struct ivi_layout_screen *iviscrn, -+ int32_t *pWidth, -+ int32_t *pHeight); -+ -+ /** -+ * \brief Get the ivi_screens -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*get_screens)(int32_t *pLength, struct ivi_layout_screen ***ppArray); -+ -+ /** -+ * \brief Get the ivi_screens under the given ivi_layer -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*get_screens_under_layer)(struct ivi_layout_layer *ivilayer, -+ int32_t *pLength, -+ struct ivi_layout_screen ***ppArray); -+ -+ /** -+ * \brief Add a ivi_layer to a ivi_screen which is currently managed -+ * by the service -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*screen_add_layer)(struct ivi_layout_screen *iviscrn, -+ struct ivi_layout_layer *addlayer); -+ -+ /** -+ * \brief Sets render order of ivi_layers on a ivi_screen -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+ int32_t (*screen_set_render_order)(struct ivi_layout_screen *iviscrn, -+ struct ivi_layout_layer **pLayer, -+ const int32_t number); -+ -+ /** -+ * \brief get weston_output from ivi_layout_screen. -+ * -+ * \return (struct weston_output *) -+ * if the method call was successful -+ * \return NULL if the method call was failed -+ */ -+ struct weston_output *(*screen_get_output)(struct ivi_layout_screen *); -+ -+ -+ /** -+ * transision animation for layer -+ */ -+ void (*transition_move_layer_cancel)(struct ivi_layout_layer *layer); -+ int32_t (*layer_set_fade_info)(struct ivi_layout_layer* ivilayer, -+ uint32_t is_fade_in, -+ double start_alpha, double end_alpha); -+ -+ /** -+ * surface content dumping for debugging -+ */ -+ int32_t (*surface_get_size)(struct ivi_layout_surface *ivisurf, -+ int32_t *width, int32_t *height, -+ int32_t *stride); -+ -+ int32_t (*surface_dump)(struct weston_surface *surface, -+ void *target, size_t size, -+ int32_t x, int32_t y, -+ int32_t width, int32_t height); -+ -+ /** -+ * remove notification by callback on property changes of ivi_surface -+ */ -+ void (*surface_remove_notification_by_callback)(struct ivi_layout_surface *ivisurf, -+ surface_property_notification_func callback, -+ void *userdata); -+ -+ /** -+ * \brief remove notification by callback on property changes of ivi_layer -+ */ -+ void (*layer_remove_notification_by_callback)(struct ivi_layout_layer *ivilayer, -+ layer_property_notification_func callback, -+ void *userdata); -+ -+ /** -+ * \brief get id of ivi_screen from ivi_layout_screen -+ * -+ * -+ * \return id of ivi_screen -+ */ -+ uint32_t (*get_id_of_screen)(struct ivi_layout_screen *iviscrn); -+}; -+ -+#ifdef __cplusplus -+} -+#endif /* __cplusplus */ -+ -+#endif /* _IVI_LAYOUT_EXPORT_H_ */ -diff --git a/ivi-shell/ivi-layout-private.h b/ivi-shell/ivi-layout-private.h -new file mode 100644 -index 0000000..074d598 ---- /dev/null -+++ b/ivi-shell/ivi-layout-private.h -@@ -0,0 +1,229 @@ -+/* -+ * Copyright (C) 2014 DENSO CORPORATION -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining -+ * a copy of this software and associated documentation files (the -+ * "Software"), to deal in the Software without restriction, including -+ * without limitation the rights to use, copy, modify, merge, publish, -+ * distribute, sublicense, and/or sell copies of the Software, and to -+ * permit persons to whom the Software is furnished to do so, subject to -+ * the following conditions: -+ * -+ * The above copyright notice and this permission notice (including the -+ * next paragraph) shall be included in all copies or substantial -+ * portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -+ * SOFTWARE. -+ */ -+ -+#ifndef _ivi_layout_PRIVATE_H_ -+#define _ivi_layout_PRIVATE_H_ -+ -+#include "compositor.h" -+#include "ivi-layout-export.h" -+ -+struct ivi_layout_surface { -+ struct wl_list link; -+ struct wl_signal property_changed; -+ struct wl_list layer_list; -+ int32_t update_count; -+ uint32_t id_surface; -+ -+ struct ivi_layout *layout; -+ struct weston_surface *surface; -+ -+ struct weston_transform transform; -+ -+ struct ivi_layout_surface_properties prop; -+ uint32_t event_mask; -+ -+ struct { -+ struct ivi_layout_surface_properties prop; -+ struct wl_list link; -+ } pending; -+ -+ struct { -+ struct wl_list link; -+ struct wl_list layer_list; -+ } order; -+ -+ struct { -+ ivi_controller_surface_content_callback callback; -+ void *userdata; -+ } content_observer; -+ -+ struct wl_signal configured; -+}; -+ -+struct ivi_layout_layer { -+ struct wl_list link; -+ struct wl_signal property_changed; -+ struct wl_list screen_list; -+ struct wl_list link_to_surface; -+ uint32_t id_layer; -+ -+ struct ivi_layout *layout; -+ -+ struct ivi_layout_layer_properties prop; -+ uint32_t event_mask; -+ -+ struct { -+ struct ivi_layout_layer_properties prop; -+ struct wl_list surface_list; -+ struct wl_list link; -+ } pending; -+ -+ struct { -+ int dirty; -+ struct wl_list surface_list; -+ struct wl_list link; -+ } order; -+ -+ int32_t ref_count; -+}; -+ -+struct ivi_layout { -+ struct weston_compositor *compositor; -+ -+ struct wl_list surface_list; -+ struct wl_list layer_list; -+ struct wl_list screen_list; -+ -+ struct { -+ struct wl_signal created; -+ struct wl_signal removed; -+ } layer_notification; -+ -+ struct { -+ struct wl_signal created; -+ struct wl_signal removed; -+ struct wl_signal configure_changed; -+ } surface_notification; -+ -+ struct weston_layer layout_layer; -+ struct wl_signal warning_signal; -+ -+ struct ivi_layout_transition_set *transitions; -+ struct wl_list pending_transition_list; -+}; -+ -+struct ivi_layout *get_instance(void); -+ -+struct ivi_layout_transition; -+ -+struct ivi_layout_transition_set { -+ struct wl_event_source *event_source; -+ struct wl_list transition_list; -+}; -+ -+typedef void (*ivi_layout_transition_destroy_user_func)(void *user_data); -+ -+struct ivi_layout_transition_set * -+ivi_layout_transition_set_create(struct weston_compositor *ec); -+ -+void -+ivi_layout_transition_move_resize_view(struct ivi_layout_surface *surface, -+ int32_t dest_x, int32_t dest_y, -+ int32_t dest_width, int32_t dest_height, -+ uint32_t duration); -+ -+void -+ivi_layout_transition_visibility_on(struct ivi_layout_surface *surface, -+ uint32_t duration); -+ -+void -+ivi_layout_transition_visibility_off(struct ivi_layout_surface *surface, -+ uint32_t duration); -+ -+ -+void -+ivi_layout_transition_move_layer(struct ivi_layout_layer *layer, -+ int32_t dest_x, int32_t dest_y, -+ uint32_t duration); -+ -+void -+ivi_layout_transition_fade_layer(struct ivi_layout_layer *layer, -+ uint32_t is_fade_in, -+ double start_alpha, double end_alpha, -+ void *user_data, -+ ivi_layout_transition_destroy_user_func destroy_func, -+ uint32_t duration); -+ -+int32_t -+is_surface_transition(struct ivi_layout_surface *surface); -+ -+/** -+ * methods of interaction between ivi-shell with ivi-layout -+ */ -+struct weston_view * -+ivi_layout_get_weston_view(struct ivi_layout_surface *surface); -+void -+ivi_layout_surface_configure(struct ivi_layout_surface *ivisurf, -+ int32_t width, int32_t height); -+struct ivi_layout_surface* -+ivi_layout_surface_create(struct weston_surface *wl_surface, -+ uint32_t id_surface); -+void -+ivi_layout_init_with_compositor(struct weston_compositor *ec); -+int32_t -+ivi_layout_surface_get_dimension(struct ivi_layout_surface *ivisurf, -+ int32_t *dest_width, int32_t *dest_height); -+void -+ivi_layout_surface_add_configured_listener(struct ivi_layout_surface* ivisurf, -+ struct wl_listener* listener); -+/** -+ * methods of interaction between transition animation with ivi-layout -+ */ -+int32_t -+ivi_layout_commit_changes(void); -+uint32_t -+ivi_layout_get_id_of_surface(struct ivi_layout_surface *ivisurf); -+int32_t -+ivi_layout_surface_set_destination_rectangle(struct ivi_layout_surface *ivisurf, -+ int32_t x, int32_t y, -+ int32_t width, int32_t height); -+int32_t -+ivi_layout_surface_set_opacity(struct ivi_layout_surface *ivisurf, -+ wl_fixed_t opacity); -+wl_fixed_t -+ivi_layout_surface_get_opacity(struct ivi_layout_surface *ivisurf); -+int32_t -+ivi_layout_surface_set_visibility(struct ivi_layout_surface *ivisurf, -+ bool newVisibility); -+bool -+ivi_layout_surface_get_visibility(struct ivi_layout_surface *ivisurf); -+struct ivi_layout_surface * -+ivi_layout_get_surface_from_id(uint32_t id_surface); -+int32_t -+ivi_layout_layer_set_opacity(struct ivi_layout_layer *ivilayer, -+ wl_fixed_t opacity); -+wl_fixed_t -+ivi_layout_layer_get_opacity(struct ivi_layout_layer *ivilayer); -+int32_t -+ivi_layout_layer_set_visibility(struct ivi_layout_layer *ivilayer, -+ bool newVisibility); -+int32_t -+ivi_layout_layer_set_position(struct ivi_layout_layer *ivilayer, -+ int32_t dest_x, int32_t dest_y); -+int32_t -+ivi_layout_layer_get_position(struct ivi_layout_layer *ivilayer, -+ int32_t *dest_x, int32_t *dest_y); -+int32_t -+ivi_layout_layer_set_render_order(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface **pSurface, -+ int32_t number); -+void -+ivi_layout_transition_move_layer_cancel(struct ivi_layout_layer *layer); -+int -+load_controller_modules(struct weston_compositor *compositor, const char *modules, -+ int *argc, char *argv[]); -+void -+ivi_layout_surface_destroy(struct ivi_layout_surface *ivisurf); -+#endif -diff --git a/ivi-shell/ivi-layout-transition.c b/ivi-shell/ivi-layout-transition.c -new file mode 100644 -index 0000000..d12a8f4 ---- /dev/null -+++ b/ivi-shell/ivi-layout-transition.c -@@ -0,0 +1,871 @@ -+/* -+ * Copyright (C) 2014 DENSO CORPORATION -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining -+ * a copy of this software and associated documentation files (the -+ * "Software"), to deal in the Software without restriction, including -+ * without limitation the rights to use, copy, modify, merge, publish, -+ * distribute, sublicense, and/or sell copies of the Software, and to -+ * permit persons to whom the Software is furnished to do so, subject to -+ * the following conditions: -+ * -+ * The above copyright notice and this permission notice (including the -+ * next paragraph) shall be included in all copies or substantial -+ * portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -+ * SOFTWARE. -+ */ -+ -+#include -+#include -+#include -+#include -+ -+#include "ivi-layout-export.h" -+#include "ivi-layout-private.h" -+ -+struct ivi_layout_transition; -+ -+typedef void (*ivi_layout_transition_frame_func)( -+ struct ivi_layout_transition *transition); -+typedef void (*ivi_layout_transition_destroy_func)( -+ struct ivi_layout_transition *transition); -+typedef int32_t (*ivi_layout_is_transition_func)(void *private_data, void *id); -+ -+struct ivi_layout_transition { -+ enum ivi_layout_transition_type type; -+ void *private_data; -+ void *user_data; -+ -+ uint32_t time_start; -+ uint32_t time_duration; -+ uint32_t time_elapsed; -+ uint32_t is_done; -+ ivi_layout_is_transition_func is_transition_func; -+ ivi_layout_transition_frame_func frame_func; -+ ivi_layout_transition_destroy_func destroy_func; -+}; -+ -+struct transition_node { -+ struct ivi_layout_transition *transition; -+ struct wl_list link; -+}; -+ -+static void layout_transition_destroy(struct ivi_layout_transition *transition); -+ -+static struct ivi_layout_transition * -+get_transition_from_type_and_id(enum ivi_layout_transition_type type, -+ void *id_data) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct transition_node *node; -+ struct ivi_layout_transition *tran; -+ -+ wl_list_for_each(node, &layout->transitions->transition_list, link) { -+ tran = node->transition; -+ -+ if (tran->type == type && -+ tran->is_transition_func(tran->private_data, id_data)) -+ return tran; -+ } -+ -+ return NULL; -+} -+ -+int32_t -+is_surface_transition(struct ivi_layout_surface *surface) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct transition_node *node; -+ struct ivi_layout_transition *tran; -+ -+ wl_list_for_each(node, &layout->transitions->transition_list, link) { -+ tran = node->transition; -+ -+ if ((tran->type == IVI_LAYOUT_TRANSITION_VIEW_MOVE_RESIZE || -+ tran->type == IVI_LAYOUT_TRANSITION_VIEW_RESIZE) && -+ tran->is_transition_func(tran->private_data, surface)) -+ return 1; -+ } -+ -+ return 0; -+} -+ -+static void -+tick_transition(struct ivi_layout_transition *transition, uint32_t timestamp) -+{ -+ const double t = timestamp - transition->time_start; -+ -+ if (transition->time_duration <= t) { -+ transition->time_elapsed = transition->time_duration; -+ transition->is_done = 1; -+ } else { -+ transition->time_elapsed = t; -+ } -+} -+ -+static float time_to_nowpos(struct ivi_layout_transition *transition) -+{ -+ return sin((float)transition->time_elapsed / -+ (float)transition->time_duration * M_PI_2); -+} -+ -+static void -+do_transition_frame(struct ivi_layout_transition *transition, -+ uint32_t timestamp) -+{ -+ if (0 == transition->time_start) -+ transition->time_start = timestamp; -+ -+ tick_transition(transition, timestamp); -+ transition->frame_func(transition); -+ -+ if (transition->is_done) -+ layout_transition_destroy(transition); -+} -+ -+static int32_t -+layout_transition_frame(void *data) -+{ -+ struct ivi_layout_transition_set *transitions = data; -+ uint32_t fps = 30; -+ struct timespec timestamp = {}; -+ uint32_t msec = 0; -+ struct transition_node *node = NULL; -+ struct transition_node *next = NULL; -+ -+ if (wl_list_empty(&transitions->transition_list)) { -+ wl_event_source_timer_update(transitions->event_source, 0); -+ return 1; -+ } -+ -+ wl_event_source_timer_update(transitions->event_source, 1000 / fps); -+ -+ clock_gettime(CLOCK_MONOTONIC, ×tamp);/* FIXME */ -+ msec = (1e+3 * timestamp.tv_sec + 1e-6 * timestamp.tv_nsec); -+ -+ wl_list_for_each_safe(node, next, &transitions->transition_list, link) { -+ do_transition_frame(node->transition, msec); -+ } -+ -+ ivi_layout_commit_changes(); -+ return 1; -+} -+ -+struct ivi_layout_transition_set * -+ivi_layout_transition_set_create(struct weston_compositor *ec) -+{ -+ struct ivi_layout_transition_set *transitions; -+ struct wl_event_loop *loop; -+ -+ transitions = malloc(sizeof(*transitions)); -+ if (transitions == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return NULL; -+ } -+ -+ wl_list_init(&transitions->transition_list); -+ -+ loop = wl_display_get_event_loop(ec->wl_display); -+ transitions->event_source = -+ wl_event_loop_add_timer(loop, layout_transition_frame, -+ transitions); -+ -+ return transitions; -+} -+ -+static void -+layout_transition_register(struct ivi_layout_transition *trans) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct transition_node *node; -+ -+ node = malloc(sizeof(*node)); -+ if (node == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return; -+ } -+ -+ node->transition = trans; -+ wl_list_insert(&layout->pending_transition_list, &node->link); -+} -+ -+static void -+remove_transition(struct ivi_layout *layout, -+ struct ivi_layout_transition *trans) -+{ -+ struct transition_node *node; -+ struct transition_node *next; -+ -+ wl_list_for_each_safe(node, next, -+ &layout->transitions->transition_list, link) { -+ if (node->transition == trans) { -+ wl_list_remove(&node->link); -+ free(node); -+ return; -+ } -+ } -+ -+ wl_list_for_each_safe(node, next, -+ &layout->pending_transition_list, link) { -+ if (node->transition == trans) { -+ wl_list_remove(&node->link); -+ free(node); -+ return; -+ } -+ } -+} -+ -+static void -+layout_transition_destroy(struct ivi_layout_transition *transition) -+{ -+ struct ivi_layout *layout = get_instance(); -+ -+ remove_transition(layout, transition); -+ if (transition->destroy_func) -+ transition->destroy_func(transition); -+ free(transition); -+} -+ -+static struct ivi_layout_transition * -+create_layout_transition(void) -+{ -+ struct ivi_layout_transition *transition = malloc(sizeof(*transition)); -+ -+ if (transition == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return NULL; -+ } -+ -+ transition->type = IVI_LAYOUT_TRANSITION_MAX; -+ transition->time_start = 0; -+ transition->time_duration = 300; /* 300ms */ -+ transition->time_elapsed = 0; -+ -+ transition->is_done = 0; -+ -+ transition->private_data = NULL; -+ transition->user_data = NULL; -+ -+ transition->frame_func = NULL; -+ transition->destroy_func = NULL; -+ -+ return transition; -+} -+ -+/* move and resize view transition */ -+ -+struct move_resize_view_data { -+ struct ivi_layout_surface *surface; -+ int32_t start_x; -+ int32_t start_y; -+ int32_t end_x; -+ int32_t end_y; -+ int32_t start_width; -+ int32_t start_height; -+ int32_t end_width; -+ int32_t end_height; -+}; -+ -+static void -+transition_move_resize_view_destroy(struct ivi_layout_transition *transition) -+{ -+ struct move_resize_view_data *data = -+ (struct move_resize_view_data *)transition->private_data; -+ struct ivi_layout_surface *layout_surface = data->surface; -+ -+ wl_signal_emit(&layout_surface->configured, layout_surface); -+ -+ if (transition->private_data) { -+ free(transition->private_data); -+ transition->private_data = NULL; -+ } -+} -+ -+static void -+transition_move_resize_view_user_frame(struct ivi_layout_transition *transition) -+{ -+ struct move_resize_view_data *mrv = transition->private_data; -+ const double current = time_to_nowpos(transition); -+ -+ const int32_t destx = mrv->start_x + -+ (mrv->end_x - mrv->start_x) * current; -+ -+ const int32_t desty = mrv->start_y + -+ (mrv->end_y - mrv->start_y) * current; -+ -+ const int32_t dest_width = mrv->start_width + -+ (mrv->end_width - mrv->start_width) * current; -+ -+ const int32_t dest_height = mrv->start_height + -+ (mrv->end_height - mrv->start_height) * current; -+ -+ ivi_layout_surface_set_destination_rectangle(mrv->surface, -+ destx, desty, -+ dest_width, dest_height); -+} -+ -+static int32_t -+is_transition_move_resize_view_func(struct move_resize_view_data *data, -+ struct ivi_layout_surface *view) -+{ -+ return data->surface == view; -+} -+ -+static struct ivi_layout_transition * -+create_move_resize_view_transition( -+ struct ivi_layout_surface *surface, -+ int32_t start_x, int32_t start_y, -+ int32_t end_x, int32_t end_y, -+ int32_t start_width, int32_t start_height, -+ int32_t end_width, int32_t end_height, -+ ivi_layout_transition_frame_func frame_func, -+ ivi_layout_transition_destroy_func destroy_func, -+ uint32_t duration) -+{ -+ struct ivi_layout_transition *transition; -+ struct move_resize_view_data *data; -+ -+ transition = create_layout_transition(); -+ if (transition == NULL) -+ return NULL; -+ -+ data = malloc(sizeof(*data)); -+ if (data == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return NULL; -+ } -+ -+ transition->type = IVI_LAYOUT_TRANSITION_VIEW_MOVE_RESIZE; -+ transition->is_transition_func = (ivi_layout_is_transition_func)is_transition_move_resize_view_func; -+ -+ transition->frame_func = frame_func; -+ transition->destroy_func = destroy_func; -+ transition->private_data = data; -+ -+ if (duration != 0) -+ transition->time_duration = duration; -+ -+ data->surface = surface; -+ data->start_x = start_x; -+ data->start_y = start_y; -+ data->end_x = end_x; -+ data->end_y = end_y; -+ -+ data->start_width = start_width; -+ data->start_height = start_height; -+ data->end_width = end_width; -+ data->end_height = end_height; -+ -+ return transition; -+} -+ -+void -+ivi_layout_transition_move_resize_view(struct ivi_layout_surface *surface, -+ int32_t dest_x, int32_t dest_y, -+ int32_t dest_width, int32_t dest_height, -+ uint32_t duration) -+{ -+ struct ivi_layout_transition *transition; -+ int32_t start_pos[2] = { -+ surface->pending.prop.start_x, -+ surface->pending.prop.start_y -+ }; -+ -+ int32_t start_size[2] = { -+ surface->pending.prop.start_width, -+ surface->pending.prop.start_height -+ }; -+ -+ transition = get_transition_from_type_and_id( -+ IVI_LAYOUT_TRANSITION_VIEW_MOVE_RESIZE, -+ surface); -+ if (transition) { -+ struct move_resize_view_data *data = transition->private_data; -+ transition->time_start = 0; -+ transition->time_duration = duration; -+ -+ data->start_x = start_pos[0]; -+ data->start_y = start_pos[1]; -+ data->end_x = dest_x; -+ data->end_y = dest_y; -+ -+ data->start_width = start_size[0]; -+ data->start_height = start_size[1]; -+ data->end_width = dest_width; -+ data->end_height = dest_height; -+ return; -+ } -+ -+ transition = create_move_resize_view_transition( -+ surface, -+ start_pos[0], start_pos[1], -+ dest_x, dest_y, -+ start_size[0], start_size[1], -+ dest_width, dest_height, -+ transition_move_resize_view_user_frame, -+ transition_move_resize_view_destroy, -+ duration); -+ -+ layout_transition_register(transition); -+} -+ -+/* fade transition */ -+struct fade_view_data { -+ struct ivi_layout_surface *surface; -+ double start_alpha; -+ double end_alpha; -+}; -+ -+struct store_alpha{ -+ double alpha; -+}; -+ -+static void -+fade_view_user_frame(struct ivi_layout_transition *transition) -+{ -+ struct fade_view_data *fade = transition->private_data; -+ struct ivi_layout_surface *surface = fade->surface; -+ -+ const double current = time_to_nowpos(transition); -+ const double alpha = fade->start_alpha + -+ (fade->end_alpha - fade->start_alpha) * current; -+ -+ ivi_layout_surface_set_opacity(surface, wl_fixed_from_double(alpha)); -+ ivi_layout_surface_set_visibility(surface, true); -+} -+ -+static int32_t -+is_transition_fade_view_func(struct fade_view_data *data, -+ struct ivi_layout_surface *view) -+{ -+ return data->surface == view; -+} -+ -+static struct ivi_layout_transition * -+create_fade_view_transition( -+ struct ivi_layout_surface *surface, -+ double start_alpha, double end_alpha, -+ ivi_layout_transition_frame_func frame_func, -+ void *user_data, -+ ivi_layout_transition_destroy_func destroy_func, -+ uint32_t duration) -+{ -+ struct ivi_layout_transition *transition; -+ struct fade_view_data *data; -+ -+ transition = create_layout_transition(); -+ if (transition == NULL) -+ return NULL; -+ -+ data = malloc(sizeof(*data)); -+ if (data == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return NULL; -+ } -+ -+ transition->type = IVI_LAYOUT_TRANSITION_VIEW_FADE; -+ transition->is_transition_func = (ivi_layout_is_transition_func)is_transition_fade_view_func; -+ -+ transition->user_data = user_data; -+ transition->private_data = data; -+ transition->frame_func = frame_func; -+ transition->destroy_func = destroy_func; -+ -+ if (duration != 0) -+ transition->time_duration = duration; -+ -+ data->surface = surface; -+ data->start_alpha = start_alpha; -+ data->end_alpha = end_alpha; -+ -+ return transition; -+} -+ -+static void -+create_visibility_transition(struct ivi_layout_surface *surface, -+ double start_alpha, -+ double dest_alpha, -+ void *user_data, -+ ivi_layout_transition_destroy_func destroy_func, -+ uint32_t duration) -+{ -+ struct ivi_layout_transition *transition = NULL; -+ -+ transition = create_fade_view_transition( -+ surface, -+ start_alpha, dest_alpha, -+ fade_view_user_frame, -+ user_data, -+ destroy_func, -+ duration); -+ -+ layout_transition_register(transition); -+} -+ -+static void -+visibility_on_transition_destroy(struct ivi_layout_transition *transition) -+{ -+ struct fade_view_data *data = transition->private_data; -+ struct store_alpha *user_data = transition->user_data; -+ -+ ivi_layout_surface_set_visibility(data->surface, true); -+ -+ free(data); -+ transition->private_data = NULL; -+ -+ free(user_data); -+ transition->user_data = NULL; -+} -+ -+void -+ivi_layout_transition_visibility_on(struct ivi_layout_surface *surface, -+ uint32_t duration) -+{ -+ struct ivi_layout_transition *transition; -+ bool is_visible = ivi_layout_surface_get_visibility(surface); -+ wl_fixed_t dest_alpha = ivi_layout_surface_get_opacity(surface); -+ struct store_alpha *user_data = NULL; -+ wl_fixed_t start_alpha = 0.0; -+ struct fade_view_data *data = NULL; -+ -+ transition = get_transition_from_type_and_id( -+ IVI_LAYOUT_TRANSITION_VIEW_FADE, -+ surface); -+ if (transition) { -+ start_alpha = ivi_layout_surface_get_opacity(surface); -+ user_data = transition->user_data; -+ data = transition->private_data; -+ -+ transition->time_start = 0; -+ transition->time_duration = duration; -+ transition->destroy_func = visibility_on_transition_destroy; -+ -+ data->start_alpha = wl_fixed_to_double(start_alpha); -+ data->end_alpha = user_data->alpha; -+ return; -+ } -+ -+ if (is_visible) -+ return; -+ -+ user_data = malloc(sizeof(*user_data)); -+ if (user_data == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return; -+ } -+ -+ user_data->alpha = wl_fixed_to_double(dest_alpha); -+ -+ create_visibility_transition(surface, -+ 0.0, // start_alpha -+ wl_fixed_to_double(dest_alpha), -+ user_data, -+ visibility_on_transition_destroy, -+ duration); -+} -+ -+static void -+visibility_off_transition_destroy(struct ivi_layout_transition *transition) -+{ -+ struct fade_view_data *data = transition->private_data; -+ struct store_alpha *user_data = transition->user_data; -+ -+ ivi_layout_surface_set_visibility(data->surface, false); -+ -+ ivi_layout_surface_set_opacity(data->surface, -+ wl_fixed_from_double(user_data->alpha)); -+ -+ free(data); -+ transition->private_data = NULL; -+ -+ free(user_data); -+ transition->user_data= NULL; -+} -+ -+void -+ivi_layout_transition_visibility_off(struct ivi_layout_surface *surface, -+ uint32_t duration) -+{ -+ struct ivi_layout_transition *transition; -+ wl_fixed_t start_alpha = ivi_layout_surface_get_opacity(surface); -+ struct store_alpha* user_data = NULL; -+ struct fade_view_data* data = NULL; -+ -+ transition = -+ get_transition_from_type_and_id(IVI_LAYOUT_TRANSITION_VIEW_FADE, -+ surface); -+ if (transition) { -+ data = transition->private_data; -+ -+ transition->time_start = 0; -+ transition->time_duration = duration; -+ transition->destroy_func = visibility_off_transition_destroy; -+ -+ data->start_alpha = wl_fixed_to_double(start_alpha); -+ data->end_alpha = 0; -+ return; -+ } -+ -+ user_data = malloc(sizeof(*user_data)); -+ if (user_data == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return; -+ } -+ -+ user_data->alpha = wl_fixed_to_double(start_alpha); -+ -+ create_visibility_transition(surface, -+ wl_fixed_to_double(start_alpha), -+ 0.0, // dest_alpha -+ user_data, -+ visibility_off_transition_destroy, -+ duration); -+} -+ -+/* move layer transition */ -+ -+struct move_layer_data { -+ struct ivi_layout_layer *layer; -+ int32_t start_x; -+ int32_t start_y; -+ int32_t end_x; -+ int32_t end_y; -+ ivi_layout_transition_destroy_user_func destroy_func; -+}; -+ -+static void -+transition_move_layer_user_frame(struct ivi_layout_transition *transition) -+{ -+ struct move_layer_data *data = transition->private_data; -+ struct ivi_layout_layer *layer = data->layer; -+ -+ const float current = time_to_nowpos(transition); -+ -+ const int32_t dest_x = data->start_x + -+ (data->end_x - data->start_x) * current; -+ -+ const int32_t dest_y = data->start_y + -+ (data->end_y - data->start_y) * current; -+ -+ ivi_layout_layer_set_position(layer, dest_x, dest_y); -+} -+ -+static void -+transition_move_layer_destroy(struct ivi_layout_transition *transition) -+{ -+ struct move_layer_data *data = transition->private_data; -+ -+ if (data->destroy_func) -+ data->destroy_func(transition->user_data); -+ -+ free(data); -+ transition->private_data = NULL; -+} -+ -+static int32_t -+is_transition_move_layer_func(struct move_layer_data *data, -+ struct ivi_layout_layer *layer) -+{ -+ return data->layer == layer; -+} -+ -+ -+static struct ivi_layout_transition * -+create_move_layer_transition( -+ struct ivi_layout_layer *layer, -+ int32_t start_x, int32_t start_y, -+ int32_t end_x, int32_t end_y, -+ void *user_data, -+ ivi_layout_transition_destroy_user_func destroy_user_func, -+ uint32_t duration) -+{ -+ struct ivi_layout_transition *transition; -+ struct move_layer_data *data; -+ -+ transition = create_layout_transition(); -+ if (transition == NULL) -+ return NULL; -+ -+ data = malloc(sizeof(*data)); -+ if (data == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return NULL; -+ } -+ -+ transition->type = IVI_LAYOUT_TRANSITION_LAYER_MOVE; -+ transition->is_transition_func = (ivi_layout_is_transition_func)is_transition_move_layer_func; -+ -+ transition->frame_func = transition_move_layer_user_frame; -+ transition->destroy_func = transition_move_layer_destroy; -+ transition->private_data = data; -+ transition->user_data = user_data; -+ -+ if (duration != 0) -+ transition->time_duration = duration; -+ -+ data->layer = layer; -+ data->start_x = start_x; -+ data->start_y = start_y; -+ data->end_x = end_x; -+ data->end_y = end_y; -+ data->destroy_func = destroy_user_func; -+ -+ return transition; -+} -+ -+void -+ivi_layout_transition_move_layer(struct ivi_layout_layer *layer, -+ int32_t dest_x, int32_t dest_y, -+ uint32_t duration) -+{ -+ int32_t start_pos_x = 0; -+ int32_t start_pos_y = 0; -+ struct ivi_layout_transition *transition = NULL; -+ -+ ivi_layout_layer_get_position(layer, &start_pos_x, &start_pos_y); -+ -+ transition = create_move_layer_transition( -+ layer, -+ start_pos_x, start_pos_y, -+ dest_x, dest_y, -+ NULL, NULL, -+ duration); -+ -+ layout_transition_register(transition); -+ -+ return; -+} -+ -+void -+ivi_layout_transition_move_layer_cancel(struct ivi_layout_layer *layer) -+{ -+ struct ivi_layout_transition *transition = -+ get_transition_from_type_and_id( -+ IVI_LAYOUT_TRANSITION_LAYER_MOVE, -+ layer); -+ if (transition) { -+ layout_transition_destroy(transition); -+ } -+} -+ -+/* fade layer transition */ -+struct fade_layer_data { -+ struct ivi_layout_layer *layer; -+ uint32_t is_fade_in; -+ double start_alpha; -+ double end_alpha; -+ ivi_layout_transition_destroy_user_func destroy_func; -+}; -+ -+static void -+transition_fade_layer_destroy(struct ivi_layout_transition *transition) -+{ -+ struct fade_layer_data *data = transition->private_data; -+ transition->private_data = NULL; -+ -+ free(data); -+} -+ -+static void -+transition_fade_layer_user_frame(struct ivi_layout_transition *transition) -+{ -+ double current = time_to_nowpos(transition); -+ struct fade_layer_data *data = transition->private_data; -+ double alpha = data->start_alpha + -+ (data->end_alpha - data->start_alpha) * current; -+ wl_fixed_t fixed_alpha = wl_fixed_from_double(alpha); -+ -+ int32_t is_done = transition->is_done; -+ bool is_visible = !is_done || data->is_fade_in; -+ -+ ivi_layout_layer_set_opacity(data->layer, fixed_alpha); -+ ivi_layout_layer_set_visibility(data->layer, is_visible); -+} -+ -+static int32_t -+is_transition_fade_layer_func(struct fade_layer_data *data, -+ struct ivi_layout_layer *layer) -+{ -+ return data->layer == layer; -+} -+ -+void -+ivi_layout_transition_fade_layer( -+ struct ivi_layout_layer *layer, -+ uint32_t is_fade_in, -+ double start_alpha, double end_alpha, -+ void* user_data, -+ ivi_layout_transition_destroy_user_func destroy_func, -+ uint32_t duration) -+{ -+ struct ivi_layout_transition *transition; -+ struct fade_layer_data *data = NULL; -+ wl_fixed_t fixed_opacity = 0.0; -+ double now_opacity = 0.0; -+ double remain = 0.0; -+ -+ transition = get_transition_from_type_and_id( -+ IVI_LAYOUT_TRANSITION_LAYER_FADE, -+ layer); -+ if (transition) { -+ /* transition update */ -+ data = transition->private_data; -+ -+ /* FIXME */ -+ fixed_opacity = ivi_layout_layer_get_opacity(layer); -+ now_opacity = wl_fixed_to_double(fixed_opacity); -+ remain = 0.0; -+ -+ data->is_fade_in = is_fade_in; -+ data->start_alpha = now_opacity; -+ data->end_alpha = end_alpha; -+ -+ remain = is_fade_in? 1.0 - now_opacity : now_opacity; -+ transition->time_start = 0; -+ transition->time_elapsed = 0; -+ transition->time_duration = duration * remain; -+ -+ return; -+ } -+ -+ transition = create_layout_transition(); -+ if (transition == NULL) -+ return; -+ -+ data = malloc(sizeof(*data)); -+ if (data == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return; -+ } -+ -+ transition->type = IVI_LAYOUT_TRANSITION_LAYER_FADE; -+ transition->is_transition_func = (ivi_layout_is_transition_func)is_transition_fade_layer_func; -+ -+ transition->private_data = data; -+ transition->user_data = user_data; -+ -+ transition->frame_func = transition_fade_layer_user_frame; -+ transition->destroy_func = transition_fade_layer_destroy; -+ -+ if (duration != 0) -+ transition->time_duration = duration; -+ -+ data->layer = layer; -+ data->is_fade_in = is_fade_in; -+ data->start_alpha = start_alpha; -+ data->end_alpha = end_alpha; -+ data->destroy_func = destroy_func; -+ -+ layout_transition_register(transition); -+ -+ return; -+} -+ -diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c -new file mode 100644 -index 0000000..51d0a8d ---- /dev/null -+++ b/ivi-shell/ivi-layout.c -@@ -0,0 +1,3011 @@ -+/* -+ * Copyright (C) 2013 DENSO CORPORATION -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining -+ * a copy of this software and associated documentation files (the -+ * "Software"), to deal in the Software without restriction, including -+ * without limitation the rights to use, copy, modify, merge, publish, -+ * distribute, sublicense, and/or sell copies of the Software, and to -+ * permit persons to whom the Software is furnished to do so, subject to -+ * the following conditions: -+ * -+ * The above copyright notice and this permission notice (including the -+ * next paragraph) shall be included in all copies or substantial -+ * portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -+ * SOFTWARE. -+ */ -+ -+/** -+ * Implementation of ivi-layout library. The actual view on ivi_screen is -+ * not updated till calling ivi_layout_commit_changes. A overview from -+ * calling API for updating properties of ivi_surface/ivi_layer to asking -+ * compositor to compose them by using weston_compositor_schedule_repaint, -+ * 0/ initialize this library by ivi_layout_init_with_compositor -+ * with (struct weston_compositor *ec) from ivi-shell. -+ * 1/ When a API for updating properties of ivi_surface/ivi_layer, it updates -+ * pending prop of ivi_surface/ivi_layer/ivi_screen which are structure to -+ * store properties. -+ * 2/ Before calling commitChanges, in case of calling a API to get a property, -+ * return current property, not pending property. -+ * 3/ At the timing of calling ivi_layout_commitChanges, pending properties -+ * are applied to properties. -+ * -+ * *) ivi_layout_commitChanges is also called by transition animation -+ * per each frame. See ivi-layout-transition.c in details. Transition -+ * animation interpolates frames between previous properties of ivi_surface -+ * and new ones. -+ * For example, when a property of ivi_surface is changed from invisibility -+ * to visibility, it behaves like fade-in. When ivi_layout_commitChange is -+ * called during transition animation, it cancels the transition and -+ * re-start transition to new properties from current properties of final -+ * frame just before the the cancellation. -+ * -+ * 4/ According properties, set transformation by using weston_matrix and -+ * weston_view per ivi_surfaces and ivi_layers in while loop. -+ * 5/ Set damage and trigger transform by using weston_view_geometry_dirty. -+ * 6/ Notify update of properties. -+ * 7/ Trigger composition by weston_compositor_schedule_repaint. -+ * -+ */ -+#include "config.h" -+ -+#include -+#include -+ -+#include "compositor.h" -+#include "ivi-layout-export.h" -+#include "ivi-layout-private.h" -+ -+#include "shared/helpers.h" -+#include "shared/os-compatibility.h" -+ -+#define max(a, b) ((a) > (b) ? (a) : (b)) -+ -+struct link_layer { -+ struct ivi_layout_layer *ivilayer; -+ struct wl_list link; -+ struct wl_list link_to_layer; -+}; -+ -+struct link_screen { -+ struct ivi_layout_screen *iviscrn; -+ struct wl_list link; -+ struct wl_list link_to_screen; -+}; -+ -+struct listener_layout_notification { -+ void *userdata; -+ struct wl_listener listener; -+}; -+ -+struct ivi_layout; -+ -+struct ivi_layout_screen { -+ struct wl_list link; -+ struct wl_list link_to_layer; -+ uint32_t id_screen; -+ -+ struct ivi_layout *layout; -+ struct weston_output *output; -+ -+ struct { -+ struct wl_list layer_list; -+ struct wl_list link; -+ } pending; -+ -+ struct { -+ int dirty; -+ struct wl_list layer_list; -+ struct wl_list link; -+ } order; -+}; -+ -+struct ivi_layout_notification_callback { -+ void *callback; -+ void *data; -+}; -+ -+struct ivi_rectangle -+{ -+ int32_t x; -+ int32_t y; -+ int32_t width; -+ int32_t height; -+}; -+ -+static void -+remove_notification(struct wl_list *listener_list, void *callback, void *userdata); -+ -+static struct ivi_layout ivilayout = {0}; -+ -+struct ivi_layout * -+get_instance(void) -+{ -+ return &ivilayout; -+} -+ -+/** -+ * Internal API to add/remove a link to ivi_surface from ivi_layer. -+ */ -+static void -+add_link_to_surface(struct ivi_layout_layer *ivilayer, -+ struct link_layer *link_layer) -+{ -+ struct link_layer *link = NULL; -+ -+ wl_list_for_each(link, &ivilayer->link_to_surface, link_to_layer) { -+ if (link == link_layer) -+ return; -+ } -+ -+ wl_list_insert(&ivilayer->link_to_surface, &link_layer->link_to_layer); -+} -+ -+static void -+remove_link_to_surface(struct ivi_layout_layer *ivilayer) -+{ -+ struct link_layer *link = NULL; -+ struct link_layer *next = NULL; -+ -+ wl_list_for_each_safe(link, next, &ivilayer->link_to_surface, link_to_layer) { -+ wl_list_remove(&link->link_to_layer); -+ wl_list_remove(&link->link); -+ free(link); -+ } -+ -+ wl_list_init(&ivilayer->link_to_surface); -+} -+ -+/** -+ * Internal API to add a link to ivi_layer from ivi_screen. -+ */ -+static void -+add_link_to_layer(struct ivi_layout_screen *iviscrn, -+ struct link_screen *link_screen) -+{ -+ wl_list_insert(&iviscrn->link_to_layer, &link_screen->link_to_screen); -+} -+ -+/** -+ * Internal API to add/remove a ivi_surface from ivi_layer. -+ */ -+static void -+add_ordersurface_to_layer(struct ivi_layout_surface *ivisurf, -+ struct ivi_layout_layer *ivilayer) -+{ -+ struct link_layer *link_layer = NULL; -+ -+ link_layer = malloc(sizeof *link_layer); -+ if (link_layer == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return; -+ } -+ -+ link_layer->ivilayer = ivilayer; -+ wl_list_insert(&ivisurf->layer_list, &link_layer->link); -+ add_link_to_surface(ivilayer, link_layer); -+} -+ -+static void -+remove_ordersurface_from_layer(struct ivi_layout_surface *ivisurf) -+{ -+ struct link_layer *link_layer = NULL; -+ struct link_layer *next = NULL; -+ -+ wl_list_for_each_safe(link_layer, next, &ivisurf->layer_list, link) { -+ wl_list_remove(&link_layer->link); -+ wl_list_remove(&link_layer->link_to_layer); -+ free(link_layer); -+ } -+ wl_list_init(&ivisurf->layer_list); -+} -+ -+/** -+ * Internal API to add/remove a ivi_layer to/from ivi_screen. -+ */ -+static void -+add_orderlayer_to_screen(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_screen *iviscrn) -+{ -+ struct link_screen *link_scrn = NULL; -+ -+ link_scrn = malloc(sizeof *link_scrn); -+ if (link_scrn == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return; -+ } -+ -+ link_scrn->iviscrn = iviscrn; -+ wl_list_insert(&ivilayer->screen_list, &link_scrn->link); -+ add_link_to_layer(iviscrn, link_scrn); -+} -+ -+static void -+remove_orderlayer_from_screen(struct ivi_layout_layer *ivilayer) -+{ -+ struct link_screen *link_scrn = NULL; -+ struct link_screen *next = NULL; -+ -+ wl_list_for_each_safe(link_scrn, next, &ivilayer->screen_list, link) { -+ wl_list_remove(&link_scrn->link); -+ wl_list_remove(&link_scrn->link_to_screen); -+ free(link_scrn); -+ } -+ wl_list_init(&ivilayer->screen_list); -+} -+ -+/** -+ * Internal API to add/remove a ivi_layer to/from ivi_screen. -+ */ -+static struct ivi_layout_surface * -+get_surface(struct wl_list *surf_list, uint32_t id_surface) -+{ -+ struct ivi_layout_surface *ivisurf; -+ -+ wl_list_for_each(ivisurf, surf_list, link) { -+ if (ivisurf->id_surface == id_surface) { -+ return ivisurf; -+ } -+ } -+ -+ return NULL; -+} -+ -+static struct ivi_layout_layer * -+get_layer(struct wl_list *layer_list, uint32_t id_layer) -+{ -+ struct ivi_layout_layer *ivilayer; -+ -+ wl_list_for_each(ivilayer, layer_list, link) { -+ if (ivilayer->id_layer == id_layer) { -+ return ivilayer; -+ } -+ } -+ -+ return NULL; -+} -+ -+static void -+remove_configured_listener(struct ivi_layout_surface *ivisurf) -+{ -+ struct wl_listener *link = NULL; -+ struct wl_listener *next = NULL; -+ -+ wl_list_for_each_safe(link, next, &ivisurf->configured.listener_list, link) { -+ wl_list_remove(&link->link); -+ } -+} -+ -+static void -+remove_all_notification(struct wl_list *listener_list) -+{ -+ struct wl_listener *listener = NULL; -+ struct wl_listener *next = NULL; -+ -+ wl_list_for_each_safe(listener, next, listener_list, link) { -+ struct listener_layout_notification *notification = NULL; -+ wl_list_remove(&listener->link); -+ -+ notification = -+ container_of(listener, -+ struct listener_layout_notification, -+ listener); -+ -+ free(notification->userdata); -+ free(notification); -+ } -+} -+ -+static void -+ivi_layout_surface_remove_notification(struct ivi_layout_surface *ivisurf) -+{ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_remove_notification: invalid argument\n"); -+ return; -+ } -+ -+ remove_all_notification(&ivisurf->property_changed.listener_list); -+} -+ -+static void -+ivi_layout_surface_remove_notification_by_callback(struct ivi_layout_surface *ivisurf, -+ surface_property_notification_func callback, -+ void *userdata) -+{ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_remove_notification_by_callback: invalid argument\n"); -+ return; -+ } -+ -+ remove_notification(&ivisurf->property_changed.listener_list, callback, userdata); -+} -+ -+/** -+ * Called at destruction of wl_surface/ivi_surface -+ */ -+void -+ivi_layout_surface_destroy(struct ivi_layout_surface *ivisurf) -+{ -+ struct ivi_layout *layout = get_instance(); -+ -+ if (ivisurf == NULL) { -+ weston_log("%s: invalid argument\n", __func__); -+ return; -+ } -+ -+ wl_list_remove(&ivisurf->transform.link); -+ wl_list_remove(&ivisurf->pending.link); -+ wl_list_remove(&ivisurf->order.link); -+ wl_list_remove(&ivisurf->link); -+ remove_ordersurface_from_layer(ivisurf); -+ -+ wl_signal_emit(&layout->surface_notification.removed, ivisurf); -+ -+ remove_configured_listener(ivisurf); -+ -+ ivi_layout_surface_remove_notification(ivisurf); -+ -+ free(ivisurf); -+} -+ -+/** -+ * Internal API to check ivi_layer/ivi_surface already added in ivi_layer/ivi_screen. -+ * Called by ivi_layout_layer_add_surface/ivi_layout_screenAddLayer -+ */ -+static int -+is_surface_in_layer(struct ivi_layout_surface *ivisurf, -+ struct ivi_layout_layer *ivilayer) -+{ -+ struct ivi_layout_surface *surf = NULL; -+ -+ wl_list_for_each(surf, &ivilayer->pending.surface_list, pending.link) { -+ if (surf->id_surface == ivisurf->id_surface) { -+ return 1; -+ } -+ } -+ -+ return 0; -+} -+ -+static int -+is_layer_in_screen(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_screen *iviscrn) -+{ -+ struct ivi_layout_layer *layer = NULL; -+ -+ wl_list_for_each(layer, &iviscrn->pending.layer_list, pending.link) { -+ if (layer->id_layer == ivilayer->id_layer) { -+ return 1; -+ } -+ } -+ -+ return 0; -+} -+ -+/** -+ * Internal API to initialize ivi_screens found from output_list of weston_compositor. -+ * Called by ivi_layout_init_with_compositor. -+ */ -+static void -+create_screen(struct weston_compositor *ec) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_screen *iviscrn = NULL; -+ struct weston_output *output = NULL; -+ int32_t count = 0; -+ -+ wl_list_for_each(output, &ec->output_list, link) { -+ iviscrn = calloc(1, sizeof *iviscrn); -+ if (iviscrn == NULL) { -+ weston_log("fails to allocate memory\n"); -+ continue; -+ } -+ -+ iviscrn->layout = layout; -+ -+ iviscrn->id_screen = count; -+ count++; -+ -+ iviscrn->output = output; -+ -+ wl_list_init(&iviscrn->pending.layer_list); -+ wl_list_init(&iviscrn->pending.link); -+ -+ wl_list_init(&iviscrn->order.layer_list); -+ wl_list_init(&iviscrn->order.link); -+ -+ wl_list_init(&iviscrn->link_to_layer); -+ -+ wl_list_insert(&layout->screen_list, &iviscrn->link); -+ } -+} -+ -+/** -+ * Internal APIs to initialize properties of ivi_surface/ivi_layer when they are created. -+ */ -+static void -+init_layer_properties(struct ivi_layout_layer_properties *prop, -+ int32_t width, int32_t height) -+{ -+ memset(prop, 0, sizeof *prop); -+ prop->opacity = wl_fixed_from_double(1.0); -+ prop->source_width = width; -+ prop->source_height = height; -+ prop->dest_width = width; -+ prop->dest_height = height; -+} -+ -+static void -+init_surface_properties(struct ivi_layout_surface_properties *prop) -+{ -+ memset(prop, 0, sizeof *prop); -+ prop->opacity = wl_fixed_from_double(1.0); -+ /* -+ * FIXME: this shall be finxed by ivi-layout-transition. -+ */ -+ prop->dest_width = 1; -+ prop->dest_height = 1; -+} -+ -+/** -+ * Internal APIs to be called from ivi_layout_commit_changes. -+ */ -+static void -+update_opacity(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface *ivisurf) -+{ -+ double layer_alpha = wl_fixed_to_double(ivilayer->prop.opacity); -+ double surf_alpha = wl_fixed_to_double(ivisurf->prop.opacity); -+ -+ if ((ivilayer->event_mask & IVI_NOTIFICATION_OPACITY) || -+ (ivisurf->event_mask & IVI_NOTIFICATION_OPACITY)) { -+ struct weston_view *tmpview = NULL; -+ wl_list_for_each(tmpview, &ivisurf->surface->views, surface_link) { -+ if (tmpview == NULL) { -+ continue; -+ } -+ tmpview->alpha = layer_alpha * surf_alpha; -+ } -+ } -+} -+ -+static void -+get_rotate_values(enum wl_output_transform orientation, -+ float *v_sin, -+ float *v_cos) -+{ -+ switch (orientation) { -+ case WL_OUTPUT_TRANSFORM_90: -+ *v_sin = 1.0f; -+ *v_cos = 0.0f; -+ break; -+ case WL_OUTPUT_TRANSFORM_180: -+ *v_sin = 0.0f; -+ *v_cos = -1.0f; -+ break; -+ case WL_OUTPUT_TRANSFORM_270: -+ *v_sin = -1.0f; -+ *v_cos = 0.0f; -+ break; -+ case WL_OUTPUT_TRANSFORM_NORMAL: -+ default: -+ *v_sin = 0.0f; -+ *v_cos = 1.0f; -+ break; -+ } -+} -+ -+static void -+get_scale(enum wl_output_transform orientation, -+ float dest_width, -+ float dest_height, -+ float source_width, -+ float source_height, -+ float *scale_x, -+ float *scale_y) -+{ -+ switch (orientation) { -+ case WL_OUTPUT_TRANSFORM_90: -+ *scale_x = dest_width / source_height; -+ *scale_y = dest_height / source_width; -+ break; -+ case WL_OUTPUT_TRANSFORM_180: -+ *scale_x = dest_width / source_width; -+ *scale_y = dest_height / source_height; -+ break; -+ case WL_OUTPUT_TRANSFORM_270: -+ *scale_x = dest_width / source_height; -+ *scale_y = dest_height / source_width; -+ break; -+ case WL_OUTPUT_TRANSFORM_NORMAL: -+ default: -+ *scale_x = dest_width / source_width; -+ *scale_y = dest_height / source_height; -+ break; -+ } -+} -+ -+static void -+calc_transformation_matrix(struct ivi_rectangle *source_rect, -+ struct ivi_rectangle *dest_rect, -+ enum wl_output_transform orientation, -+ struct weston_matrix *m) -+{ -+ float source_center_x; -+ float source_center_y; -+ float vsin; -+ float vcos; -+ float scale_x; -+ float scale_y; -+ float translate_x; -+ float translate_y; -+ -+ source_center_x = source_rect->x + source_rect->width * 0.5f; -+ source_center_y = source_rect->y + source_rect->height * 0.5f; -+ weston_matrix_translate(m, -source_center_x, -source_center_y, 0.0f); -+ -+ get_rotate_values(orientation, &vsin, &vcos); -+ weston_matrix_rotate_xy(m, vcos, vsin); -+ -+ get_scale(orientation, -+ dest_rect->width, -+ dest_rect->height, -+ source_rect->width, -+ source_rect->height, -+ &scale_x, -+ &scale_y); -+ weston_matrix_scale(m, scale_x, scale_y, 1.0f); -+ -+ translate_x = dest_rect->width * 0.5f + dest_rect->x; -+ translate_y = dest_rect->height * 0.5f + dest_rect->y; -+ weston_matrix_translate(m, translate_x, translate_y, 0.0f); -+} -+ -+/* -+ * This computes intersected rect_output from two ivi_rectangles -+ */ -+static void -+ivi_rectangle_intersect(const struct ivi_rectangle *rect1, -+ const struct ivi_rectangle *rect2, -+ struct ivi_rectangle *rect_output) -+{ -+ int32_t rect1_right = rect1->x + rect1->width; -+ int32_t rect1_bottom = rect1->y + rect1->height; -+ int32_t rect2_right = rect2->x + rect2->width; -+ int32_t rect2_bottom = rect2->y + rect2->height; -+ -+ rect_output->x = max(rect1->x, rect2->x); -+ rect_output->y = max(rect1->y, rect2->y); -+ rect_output->width = rect1_right < rect2_right ? -+ rect1_right - rect_output->x : -+ rect2_right - rect_output->x; -+ rect_output->height = rect1_bottom < rect2_bottom ? -+ rect1_bottom - rect_output->y : -+ rect2_bottom - rect_output->y; -+ -+ if (rect_output->width < 0 || rect_output->height < 0) { -+ rect_output->width = 0; -+ rect_output->height = 0; -+ } -+} -+ -+/* -+ * Transform rect_input by the inverse of matrix, intersect with boundingbox, -+ * and store the result in rect_output. -+ * The boundingbox must be given in the same coordinate space as rect_output. -+ * Additionally, there are the following restrictions on the matrix: -+ * - no projective transformations -+ * - no skew -+ * - only multiples of 90-degree rotations supported -+ * -+ * In failure case of weston_matrix_invert, rect_output is set to boundingbox -+ * as a fail-safe with log. -+ */ -+static void -+calc_inverse_matrix_transform(const struct weston_matrix *matrix, -+ const struct ivi_rectangle *rect_input, -+ const struct ivi_rectangle *boundingbox, -+ struct ivi_rectangle *rect_output) -+{ -+ struct weston_matrix m; -+ struct weston_vector top_left; -+ struct weston_vector bottom_right; -+ -+ assert(boundingbox != rect_output); -+ -+ if (weston_matrix_invert(&m, matrix) < 0) { -+ weston_log("ivi-shell: calc_inverse_matrix_transform fails to invert a matrix.\n"); -+ weston_log("ivi-shell: boundingbox is set to the rect_output.\n"); -+ rect_output->x = boundingbox->x; -+ rect_output->y = boundingbox->y; -+ rect_output->width = boundingbox->width; -+ rect_output->height = boundingbox->height; -+ } -+ -+ /* The vectors and matrices involved will always produce f[3] == 1.0. */ -+ top_left.f[0] = rect_input->x; -+ top_left.f[1] = rect_input->y; -+ top_left.f[2] = 0.0f; -+ top_left.f[3] = 1.0f; -+ -+ bottom_right.f[0] = rect_input->x + rect_input->width; -+ bottom_right.f[1] = rect_input->y + rect_input->height; -+ bottom_right.f[2] = 0.0f; -+ bottom_right.f[3] = 1.0f; -+ -+ weston_matrix_transform(&m, &top_left); -+ weston_matrix_transform(&m, &bottom_right); -+ -+ if (top_left.f[0] < bottom_right.f[0]) { -+ rect_output->x = top_left.f[0]; -+ rect_output->width = bottom_right.f[0] - rect_output->x; -+ } else { -+ rect_output->x = bottom_right.f[0]; -+ rect_output->width = top_left.f[0] - rect_output->x; -+ } -+ -+ if (top_left.f[1] < bottom_right.f[1]) { -+ rect_output->y = top_left.f[1]; -+ rect_output->height = bottom_right.f[1] - rect_output->y; -+ } else { -+ rect_output->y = bottom_right.f[1]; -+ rect_output->height = top_left.f[1] - rect_output->y; -+ } -+ -+ ivi_rectangle_intersect(rect_output, boundingbox, rect_output); -+} -+ -+/** -+ * This computes the whole transformation matrix:m from surface-local -+ * coordinates to global coordinates. It is assumed that -+ * weston_view::geometry.{x,y} are zero. -+ * -+ * Additionally, this computes the mask on surface-local coordinates as a -+ * ivi_rectangle. This can be set to weston_view_set_mask. -+ * -+ * The mask is computed by following steps -+ * - destination rectangle of layer is inversed to surface-local cooodinates -+ * by inversed matrix:m. -+ * - the area is intersected by intersected area between weston_surface and -+ * source rectangle of ivi_surface. -+ */ -+static void -+calc_surface_to_global_matrix_and_mask_to_weston_surface( -+ struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface *ivisurf, -+ struct weston_matrix *m, -+ struct ivi_rectangle *result) -+{ -+ const struct ivi_layout_surface_properties *sp = &ivisurf->prop; -+ const struct ivi_layout_layer_properties *lp = &ivilayer->prop; -+ struct ivi_rectangle weston_surface_rect = { 0, -+ 0, -+ ivisurf->surface->width, -+ ivisurf->surface->height }; -+ struct ivi_rectangle surface_source_rect = { sp->source_x, -+ sp->source_y, -+ sp->source_width, -+ sp->source_height }; -+ struct ivi_rectangle surface_dest_rect = { sp->dest_x, -+ sp->dest_y, -+ sp->dest_width, -+ sp->dest_height }; -+ struct ivi_rectangle layer_source_rect = { lp->source_x, -+ lp->source_y, -+ lp->source_width, -+ lp->source_height }; -+ struct ivi_rectangle layer_dest_rect = { lp->dest_x, -+ lp->dest_y, -+ lp->dest_width, -+ lp->dest_height }; -+ struct ivi_rectangle surface_result; -+ -+ /* -+ * the whole transformation matrix:m from surface-local -+ * coordinates to global coordinates, which is computed by -+ * two steps, -+ * - surface-local coordinates to layer-local coordinates -+ * - layer-local coordinates to global coordinates -+ */ -+ calc_transformation_matrix(&surface_source_rect, -+ &surface_dest_rect, -+ sp->orientation, m); -+ -+ calc_transformation_matrix(&layer_source_rect, -+ &layer_dest_rect, -+ lp->orientation, m); -+ -+ /* this intersected ivi_rectangle would be used for masking -+ * weston_surface -+ */ -+ ivi_rectangle_intersect(&surface_source_rect, &weston_surface_rect, -+ &surface_result); -+ -+ /* calc masking area of weston_surface from m */ -+ calc_inverse_matrix_transform(m, -+ &layer_dest_rect, -+ &surface_result, -+ result); -+} -+ -+static void -+update_prop(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface *ivisurf) -+{ -+ struct weston_view *tmpview; -+ struct ivi_rectangle r; -+ bool can_calc = true; -+ -+ if (!ivilayer->event_mask && !ivisurf->event_mask) { -+ return; -+ } -+ -+ update_opacity(ivilayer, ivisurf); -+ -+ wl_list_for_each(tmpview, &ivisurf->surface->views, surface_link) { -+ if (tmpview != NULL) { -+ break; -+ } -+ } -+ -+ if (ivisurf->prop.source_width == 0 || ivisurf->prop.source_height == 0) { -+ weston_log("ivi-shell: source rectangle is not yet set by ivi_layout_surface_set_source_rectangle\n"); -+ can_calc = false; -+ } -+ -+ if (ivisurf->prop.dest_width == 0 || ivisurf->prop.dest_height == 0) { -+ weston_log("ivi-shell: destination rectangle is not yet set by ivi_layout_surface_set_destination_rectangle\n"); -+ can_calc = false; -+ } -+ -+ if (can_calc) { -+ wl_list_remove(&ivisurf->transform.link); -+ weston_matrix_init(&ivisurf->transform.matrix); -+ -+ calc_surface_to_global_matrix_and_mask_to_weston_surface( -+ ivilayer, ivisurf, &ivisurf->transform.matrix, &r); -+ -+ if (tmpview != NULL) { -+ wl_list_insert(&tmpview->geometry.transformation_list, -+ &ivisurf->transform.link); -+ -+ weston_view_set_transform_parent(tmpview, NULL); -+ } -+ } -+ -+ ivisurf->update_count++; -+ -+ if (tmpview != NULL) { -+ weston_view_geometry_dirty(tmpview); -+ } -+ -+ if (ivisurf->surface != NULL) { -+ weston_surface_damage(ivisurf->surface); -+ } -+} -+ -+static void -+commit_changes(struct ivi_layout *layout) -+{ -+ struct ivi_layout_screen *iviscrn = NULL; -+ struct ivi_layout_layer *ivilayer = NULL; -+ struct ivi_layout_surface *ivisurf = NULL; -+ -+ wl_list_for_each(iviscrn, &layout->screen_list, link) { -+ wl_list_for_each(ivilayer, &iviscrn->order.layer_list, order.link) { -+ wl_list_for_each(ivisurf, &ivilayer->order.surface_list, order.link) { -+ update_prop(ivilayer, ivisurf); -+ } -+ } -+ } -+} -+ -+static void -+commit_surface_list(struct ivi_layout *layout) -+{ -+ struct ivi_layout_surface *ivisurf = NULL; -+ int32_t dest_x = 0; -+ int32_t dest_y = 0; -+ int32_t dest_width = 0; -+ int32_t dest_height = 0; -+ int32_t configured = 0; -+ -+ wl_list_for_each(ivisurf, &layout->surface_list, link) { -+ if (ivisurf->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_VIEW_DEFAULT) { -+ dest_x = ivisurf->prop.dest_x; -+ dest_y = ivisurf->prop.dest_y; -+ dest_width = ivisurf->prop.dest_width; -+ dest_height = ivisurf->prop.dest_height; -+ -+ ivi_layout_transition_move_resize_view(ivisurf, -+ ivisurf->pending.prop.dest_x, -+ ivisurf->pending.prop.dest_y, -+ ivisurf->pending.prop.dest_width, -+ ivisurf->pending.prop.dest_height, -+ ivisurf->pending.prop.transition_duration); -+ -+ if (ivisurf->pending.prop.visibility) { -+ ivi_layout_transition_visibility_on(ivisurf, ivisurf->pending.prop.transition_duration); -+ } else { -+ ivi_layout_transition_visibility_off(ivisurf, ivisurf->pending.prop.transition_duration); -+ } -+ -+ ivisurf->prop = ivisurf->pending.prop; -+ ivisurf->prop.dest_x = dest_x; -+ ivisurf->prop.dest_y = dest_y; -+ ivisurf->prop.dest_width = dest_width; -+ ivisurf->prop.dest_height = dest_height; -+ ivisurf->prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; -+ ivisurf->pending.prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; -+ -+ } else if (ivisurf->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_VIEW_DEST_RECT_ONLY) { -+ dest_x = ivisurf->prop.dest_x; -+ dest_y = ivisurf->prop.dest_y; -+ dest_width = ivisurf->prop.dest_width; -+ dest_height = ivisurf->prop.dest_height; -+ -+ ivi_layout_transition_move_resize_view(ivisurf, -+ ivisurf->pending.prop.dest_x, -+ ivisurf->pending.prop.dest_y, -+ ivisurf->pending.prop.dest_width, -+ ivisurf->pending.prop.dest_height, -+ ivisurf->pending.prop.transition_duration); -+ -+ ivisurf->prop = ivisurf->pending.prop; -+ ivisurf->prop.dest_x = dest_x; -+ ivisurf->prop.dest_y = dest_y; -+ ivisurf->prop.dest_width = dest_width; -+ ivisurf->prop.dest_height = dest_height; -+ -+ ivisurf->prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; -+ ivisurf->pending.prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; -+ -+ } else if (ivisurf->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_VIEW_FADE_ONLY) { -+ configured = 0; -+ if (ivisurf->pending.prop.visibility) { -+ ivi_layout_transition_visibility_on(ivisurf, ivisurf->pending.prop.transition_duration); -+ } else { -+ ivi_layout_transition_visibility_off(ivisurf, ivisurf->pending.prop.transition_duration); -+ } -+ -+ if (ivisurf->prop.dest_width != ivisurf->pending.prop.dest_width || -+ ivisurf->prop.dest_height != ivisurf->pending.prop.dest_height) { -+ configured = 1; -+ } -+ -+ ivisurf->prop = ivisurf->pending.prop; -+ ivisurf->prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; -+ ivisurf->pending.prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; -+ -+ if (configured && !is_surface_transition(ivisurf)) -+ wl_signal_emit(&ivisurf->configured, ivisurf); -+ } else { -+ configured = 0; -+ if (ivisurf->prop.dest_width != ivisurf->pending.prop.dest_width || -+ ivisurf->prop.dest_height != ivisurf->pending.prop.dest_height) { -+ configured = 1; -+ } -+ -+ ivisurf->prop = ivisurf->pending.prop; -+ ivisurf->prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; -+ ivisurf->pending.prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; -+ -+ if (configured && !is_surface_transition(ivisurf)) -+ wl_signal_emit(&ivisurf->configured, ivisurf); -+ } -+ } -+} -+ -+static void -+commit_layer_list(struct ivi_layout *layout) -+{ -+ struct ivi_layout_layer *ivilayer = NULL; -+ struct ivi_layout_surface *ivisurf = NULL; -+ struct ivi_layout_surface *next = NULL; -+ -+ wl_list_for_each(ivilayer, &layout->layer_list, link) { -+ if (ivilayer->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_LAYER_MOVE) { -+ ivi_layout_transition_move_layer(ivilayer, ivilayer->pending.prop.dest_x, ivilayer->pending.prop.dest_y, ivilayer->pending.prop.transition_duration); -+ } else if (ivilayer->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_LAYER_FADE) { -+ ivi_layout_transition_fade_layer(ivilayer,ivilayer->pending.prop.is_fade_in, -+ ivilayer->pending.prop.start_alpha,ivilayer->pending.prop.end_alpha, -+ NULL, NULL, -+ ivilayer->pending.prop.transition_duration); -+ } -+ ivilayer->pending.prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; -+ -+ ivilayer->prop = ivilayer->pending.prop; -+ -+ if (!ivilayer->order.dirty) { -+ continue; -+ } -+ -+ wl_list_for_each_safe(ivisurf, next, &ivilayer->order.surface_list, -+ order.link) { -+ remove_ordersurface_from_layer(ivisurf); -+ wl_list_remove(&ivisurf->order.link); -+ wl_list_init(&ivisurf->order.link); -+ ivisurf->event_mask |= IVI_NOTIFICATION_REMOVE; -+ } -+ -+ assert(wl_list_empty(&ivilayer->order.surface_list)); -+ -+ wl_list_for_each(ivisurf, &ivilayer->pending.surface_list, -+ pending.link) { -+ wl_list_remove(&ivisurf->order.link); -+ wl_list_insert(&ivilayer->order.surface_list, -+ &ivisurf->order.link); -+ add_ordersurface_to_layer(ivisurf, ivilayer); -+ ivisurf->event_mask |= IVI_NOTIFICATION_ADD; -+ } -+ -+ ivilayer->order.dirty = 0; -+ } -+} -+ -+static void -+commit_screen_list(struct ivi_layout *layout) -+{ -+ struct ivi_layout_screen *iviscrn = NULL; -+ struct ivi_layout_layer *ivilayer = NULL; -+ struct ivi_layout_layer *next = NULL; -+ struct ivi_layout_surface *ivisurf = NULL; -+ -+ wl_list_for_each(iviscrn, &layout->screen_list, link) { -+ if (iviscrn->order.dirty) { -+ wl_list_for_each_safe(ivilayer, next, -+ &iviscrn->order.layer_list, order.link) { -+ remove_orderlayer_from_screen(ivilayer); -+ wl_list_remove(&ivilayer->order.link); -+ wl_list_init(&ivilayer->order.link); -+ ivilayer->event_mask |= IVI_NOTIFICATION_REMOVE; -+ } -+ -+ assert(wl_list_empty(&iviscrn->order.layer_list)); -+ -+ wl_list_for_each(ivilayer, &iviscrn->pending.layer_list, -+ pending.link) { -+ wl_list_insert(&iviscrn->order.layer_list, -+ &ivilayer->order.link); -+ add_orderlayer_to_screen(ivilayer, iviscrn); -+ ivilayer->event_mask |= IVI_NOTIFICATION_ADD; -+ } -+ -+ iviscrn->order.dirty = 0; -+ } -+ -+ /* Clear view list of layout ivi_layer */ -+ wl_list_init(&layout->layout_layer.view_list); -+ -+ wl_list_for_each(ivilayer, &iviscrn->order.layer_list, order.link) { -+ if (ivilayer->prop.visibility == false) -+ continue; -+ -+ wl_list_for_each(ivisurf, &ivilayer->order.surface_list, order.link) { -+ struct weston_view *tmpview = NULL; -+ wl_list_for_each(tmpview, &ivisurf->surface->views, surface_link) { -+ if (tmpview != NULL) { -+ break; -+ } -+ } -+ -+ if (ivisurf->prop.visibility == false) -+ continue; -+ if (ivisurf->surface == NULL || tmpview == NULL) -+ continue; -+ -+ wl_list_insert(&layout->layout_layer.view_list, -+ &tmpview->layer_link); -+ -+ ivisurf->surface->output = iviscrn->output; -+ } -+ } -+ -+ break; -+ } -+} -+ -+static void -+commit_transition(struct ivi_layout* layout) -+{ -+ if (wl_list_empty(&layout->pending_transition_list)) { -+ return; -+ } -+ -+ wl_list_insert_list(&layout->transitions->transition_list, -+ &layout->pending_transition_list); -+ -+ wl_list_init(&layout->pending_transition_list); -+ -+ wl_event_source_timer_update(layout->transitions->event_source, 1); -+} -+ -+static void -+send_surface_prop(struct ivi_layout_surface *ivisurf) -+{ -+ wl_signal_emit(&ivisurf->property_changed, ivisurf); -+ ivisurf->event_mask = 0; -+} -+ -+static void -+send_layer_prop(struct ivi_layout_layer *ivilayer) -+{ -+ wl_signal_emit(&ivilayer->property_changed, ivilayer); -+ ivilayer->event_mask = 0; -+} -+ -+static void -+send_prop(struct ivi_layout *layout) -+{ -+ struct ivi_layout_layer *ivilayer = NULL; -+ struct ivi_layout_surface *ivisurf = NULL; -+ -+ wl_list_for_each_reverse(ivilayer, &layout->layer_list, link) { -+ if (ivilayer->event_mask) -+ send_layer_prop(ivilayer); -+ } -+ -+ wl_list_for_each_reverse(ivisurf, &layout->surface_list, link) { -+ if (ivisurf->event_mask) -+ send_surface_prop(ivisurf); -+ } -+} -+ -+static void -+clear_surface_pending_list(struct ivi_layout_layer *ivilayer) -+{ -+ struct ivi_layout_surface *surface_link = NULL; -+ struct ivi_layout_surface *surface_next = NULL; -+ -+ wl_list_for_each_safe(surface_link, surface_next, -+ &ivilayer->pending.surface_list, pending.link) { -+ wl_list_remove(&surface_link->pending.link); -+ wl_list_init(&surface_link->pending.link); -+ } -+} -+ -+static void -+clear_surface_order_list(struct ivi_layout_layer *ivilayer) -+{ -+ struct ivi_layout_surface *surface_link = NULL; -+ struct ivi_layout_surface *surface_next = NULL; -+ -+ wl_list_for_each_safe(surface_link, surface_next, -+ &ivilayer->order.surface_list, order.link) { -+ wl_list_remove(&surface_link->order.link); -+ wl_list_init(&surface_link->order.link); -+ } -+} -+ -+static void -+layer_created(struct wl_listener *listener, void *data) -+{ -+ struct ivi_layout_layer *ivilayer = data; -+ -+ struct listener_layout_notification *notification = -+ container_of(listener, -+ struct listener_layout_notification, -+ listener); -+ -+ struct ivi_layout_notification_callback *created_callback = -+ notification->userdata; -+ -+ ((layer_create_notification_func)created_callback->callback) -+ (ivilayer, created_callback->data); -+} -+ -+static void -+layer_removed(struct wl_listener *listener, void *data) -+{ -+ struct ivi_layout_layer *ivilayer = data; -+ -+ struct listener_layout_notification *notification = -+ container_of(listener, -+ struct listener_layout_notification, -+ listener); -+ -+ struct ivi_layout_notification_callback *removed_callback = -+ notification->userdata; -+ -+ ((layer_remove_notification_func)removed_callback->callback) -+ (ivilayer, removed_callback->data); -+} -+ -+static void -+layer_prop_changed(struct wl_listener *listener, void *data) -+{ -+ struct ivi_layout_layer *ivilayer = data; -+ -+ struct listener_layout_notification *layout_listener = -+ container_of(listener, -+ struct listener_layout_notification, -+ listener); -+ -+ struct ivi_layout_notification_callback *prop_callback = -+ layout_listener->userdata; -+ -+ ((layer_property_notification_func)prop_callback->callback) -+ (ivilayer, &ivilayer->prop, ivilayer->event_mask, prop_callback->data); -+} -+ -+static void -+surface_created(struct wl_listener *listener, void *data) -+{ -+ struct ivi_layout_surface *ivisurface = data; -+ -+ struct listener_layout_notification *notification = -+ container_of(listener, -+ struct listener_layout_notification, -+ listener); -+ -+ struct ivi_layout_notification_callback *created_callback = -+ notification->userdata; -+ -+ ((surface_create_notification_func)created_callback->callback) -+ (ivisurface, created_callback->data); -+} -+ -+static void -+surface_removed(struct wl_listener *listener, void *data) -+{ -+ struct ivi_layout_surface *ivisurface = data; -+ -+ struct listener_layout_notification *notification = -+ container_of(listener, -+ struct listener_layout_notification, -+ listener); -+ -+ struct ivi_layout_notification_callback *removed_callback = -+ notification->userdata; -+ -+ ((surface_remove_notification_func)removed_callback->callback) -+ (ivisurface, removed_callback->data); -+} -+ -+static void -+surface_prop_changed(struct wl_listener *listener, void *data) -+{ -+ struct ivi_layout_surface *ivisurf = data; -+ -+ struct listener_layout_notification *layout_listener = -+ container_of(listener, -+ struct listener_layout_notification, -+ listener); -+ -+ struct ivi_layout_notification_callback *prop_callback = -+ layout_listener->userdata; -+ -+ ((surface_property_notification_func)prop_callback->callback) -+ (ivisurf, &ivisurf->prop, ivisurf->event_mask, prop_callback->data); -+ -+ ivisurf->event_mask = 0; -+} -+ -+static void -+surface_configure_changed(struct wl_listener *listener, -+ void *data) -+{ -+ struct ivi_layout_surface *ivisurface = data; -+ -+ struct listener_layout_notification *notification = -+ container_of(listener, -+ struct listener_layout_notification, -+ listener); -+ -+ struct ivi_layout_notification_callback *configure_changed_callback = -+ notification->userdata; -+ -+ ((surface_configure_notification_func)configure_changed_callback->callback) -+ (ivisurface, configure_changed_callback->data); -+} -+ -+static int32_t -+add_notification(struct wl_signal *signal, -+ wl_notify_func_t callback, -+ void *userdata) -+{ -+ struct listener_layout_notification *notification = NULL; -+ -+ notification = malloc(sizeof *notification); -+ if (notification == NULL) { -+ weston_log("fails to allocate memory\n"); -+ free(userdata); -+ return IVI_FAILED; -+ } -+ -+ notification->listener.notify = callback; -+ notification->userdata = userdata; -+ -+ wl_signal_add(signal, ¬ification->listener); -+ -+ return IVI_SUCCEEDED; -+} -+ -+static void -+remove_notification(struct wl_list *listener_list, void *callback, void *userdata) -+{ -+ struct wl_listener *listener = NULL; -+ struct wl_listener *next = NULL; -+ -+ wl_list_for_each_safe(listener, next, listener_list, link) { -+ struct listener_layout_notification *notification = -+ container_of(listener, -+ struct listener_layout_notification, -+ listener); -+ -+ struct ivi_layout_notification_callback *notification_callback = -+ notification->userdata; -+ -+ if ((notification_callback->callback != callback) || -+ (notification_callback->data != userdata)) { -+ continue; -+ } -+ -+ wl_list_remove(&listener->link); -+ -+ free(notification->userdata); -+ free(notification); -+ } -+} -+ -+/** -+ * Exported APIs of ivi-layout library are implemented from here. -+ * Brief of APIs is described in ivi-layout-export.h. -+ */ -+static int32_t -+ivi_layout_add_notification_create_layer(layer_create_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_notification_callback *created_callback = NULL; -+ -+ if (callback == NULL) { -+ weston_log("ivi_layout_add_notification_create_layer: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ created_callback = malloc(sizeof *created_callback); -+ if (created_callback == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ created_callback->callback = callback; -+ created_callback->data = userdata; -+ -+ return add_notification(&layout->layer_notification.created, -+ layer_created, -+ created_callback); -+} -+ -+static void -+ivi_layout_remove_notification_create_layer(layer_create_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ remove_notification(&layout->layer_notification.created.listener_list, callback, userdata); -+} -+ -+static int32_t -+ivi_layout_add_notification_remove_layer(layer_remove_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_notification_callback *removed_callback = NULL; -+ -+ if (callback == NULL) { -+ weston_log("ivi_layout_add_notification_remove_layer: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ removed_callback = malloc(sizeof *removed_callback); -+ if (removed_callback == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ removed_callback->callback = callback; -+ removed_callback->data = userdata; -+ return add_notification(&layout->layer_notification.removed, -+ layer_removed, -+ removed_callback); -+} -+ -+static void -+ivi_layout_remove_notification_remove_layer(layer_remove_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ remove_notification(&layout->layer_notification.removed.listener_list, callback, userdata); -+} -+ -+static int32_t -+ivi_layout_add_notification_create_surface(surface_create_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_notification_callback *created_callback = NULL; -+ -+ if (callback == NULL) { -+ weston_log("ivi_layout_add_notification_create_surface: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ created_callback = malloc(sizeof *created_callback); -+ if (created_callback == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ created_callback->callback = callback; -+ created_callback->data = userdata; -+ -+ return add_notification(&layout->surface_notification.created, -+ surface_created, -+ created_callback); -+} -+ -+static void -+ivi_layout_remove_notification_create_surface(surface_create_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ remove_notification(&layout->surface_notification.created.listener_list, callback, userdata); -+} -+ -+static int32_t -+ivi_layout_add_notification_remove_surface(surface_remove_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_notification_callback *removed_callback = NULL; -+ -+ if (callback == NULL) { -+ weston_log("ivi_layout_add_notification_remove_surface: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ removed_callback = malloc(sizeof *removed_callback); -+ if (removed_callback == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ removed_callback->callback = callback; -+ removed_callback->data = userdata; -+ -+ return add_notification(&layout->surface_notification.removed, -+ surface_removed, -+ removed_callback); -+} -+ -+static void -+ivi_layout_remove_notification_remove_surface(surface_remove_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ remove_notification(&layout->surface_notification.removed.listener_list, callback, userdata); -+} -+ -+static int32_t -+ivi_layout_add_notification_configure_surface(surface_configure_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_notification_callback *configure_changed_callback = NULL; -+ if (callback == NULL) { -+ weston_log("ivi_layout_add_notification_configure_surface: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ configure_changed_callback = malloc(sizeof *configure_changed_callback); -+ if (configure_changed_callback == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ configure_changed_callback->callback = callback; -+ configure_changed_callback->data = userdata; -+ -+ return add_notification(&layout->surface_notification.configure_changed, -+ surface_configure_changed, -+ configure_changed_callback); -+} -+ -+static void -+ivi_layout_remove_notification_configure_surface(surface_configure_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ remove_notification(&layout->surface_notification.configure_changed.listener_list, callback, userdata); -+} -+ -+uint32_t -+ivi_layout_get_id_of_surface(struct ivi_layout_surface *ivisurf) -+{ -+ return ivisurf->id_surface; -+} -+ -+static uint32_t -+ivi_layout_get_id_of_layer(struct ivi_layout_layer *ivilayer) -+{ -+ return ivilayer->id_layer; -+} -+ -+static uint32_t -+ivi_layout_get_id_of_screen(struct ivi_layout_screen *iviscrn) -+{ -+ return iviscrn->id_screen; -+} -+ -+static struct ivi_layout_layer * -+ivi_layout_get_layer_from_id(uint32_t id_layer) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_layer *ivilayer = NULL; -+ -+ wl_list_for_each(ivilayer, &layout->layer_list, link) { -+ if (ivilayer->id_layer == id_layer) { -+ return ivilayer; -+ } -+ } -+ -+ return NULL; -+} -+ -+struct ivi_layout_surface * -+ivi_layout_get_surface_from_id(uint32_t id_surface) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_surface *ivisurf = NULL; -+ -+ wl_list_for_each(ivisurf, &layout->surface_list, link) { -+ if (ivisurf->id_surface == id_surface) { -+ return ivisurf; -+ } -+ } -+ -+ return NULL; -+} -+ -+static struct ivi_layout_screen * -+ivi_layout_get_screen_from_id(uint32_t id_screen) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_screen *iviscrn = NULL; -+ -+ wl_list_for_each(iviscrn, &layout->screen_list, link) { -+/* FIXME : select iviscrn from screen_list by id_screen */ -+ return iviscrn; -+ break; -+ } -+ -+ return NULL; -+} -+ -+static int32_t -+ivi_layout_get_screen_resolution(struct ivi_layout_screen *iviscrn, -+ int32_t *pWidth, int32_t *pHeight) -+{ -+ struct weston_output *output = NULL; -+ -+ if (iviscrn == NULL || pWidth == NULL || pHeight == NULL) { -+ weston_log("ivi_layout_get_screen_resolution: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ output = iviscrn->output; -+ *pWidth = output->current_mode->width; -+ *pHeight = output->current_mode->height; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static int32_t -+ivi_layout_surface_add_notification(struct ivi_layout_surface *ivisurf, -+ surface_property_notification_func callback, -+ void *userdata) -+{ -+ struct listener_layout_notification* notification = NULL; -+ struct ivi_layout_notification_callback *prop_callback = NULL; -+ -+ if (ivisurf == NULL || callback == NULL) { -+ weston_log("ivi_layout_surface_add_notification: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ notification = malloc(sizeof *notification); -+ if (notification == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ prop_callback = malloc(sizeof *prop_callback); -+ if (prop_callback == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ prop_callback->callback = callback; -+ prop_callback->data = userdata; -+ -+ notification->listener.notify = surface_prop_changed; -+ notification->userdata = prop_callback; -+ -+ wl_signal_add(&ivisurf->property_changed, ¬ification->listener); -+ -+ return IVI_SUCCEEDED; -+} -+ -+static const struct ivi_layout_layer_properties * -+ivi_layout_get_properties_of_layer(struct ivi_layout_layer *ivilayer) -+{ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_get_properties_of_layer: invalid argument\n"); -+ return NULL; -+ } -+ -+ return &ivilayer->prop; -+} -+ -+static int32_t -+ivi_layout_get_screens(int32_t *pLength, struct ivi_layout_screen ***ppArray) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_screen *iviscrn = NULL; -+ int32_t length = 0; -+ int32_t n = 0; -+ -+ if (pLength == NULL || ppArray == NULL) { -+ weston_log("ivi_layout_get_screens: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ length = wl_list_length(&layout->screen_list); -+ -+ if (length != 0) { -+ /* the Array must be free by module which called this function */ -+ *ppArray = calloc(length, sizeof(struct ivi_layout_screen *)); -+ if (*ppArray == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ wl_list_for_each(iviscrn, &layout->screen_list, link) { -+ (*ppArray)[n++] = iviscrn; -+ } -+ } -+ -+ *pLength = length; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static int32_t -+ivi_layout_get_screens_under_layer(struct ivi_layout_layer *ivilayer, -+ int32_t *pLength, -+ struct ivi_layout_screen ***ppArray) -+{ -+ struct link_screen *link_scrn = NULL; -+ int32_t length = 0; -+ int32_t n = 0; -+ -+ if (ivilayer == NULL || pLength == NULL || ppArray == NULL) { -+ weston_log("ivi_layout_get_screens_under_layer: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ length = wl_list_length(&ivilayer->screen_list); -+ -+ if (length != 0) { -+ /* the Array must be free by module which called this function */ -+ *ppArray = calloc(length, sizeof(struct ivi_layout_screen *)); -+ if (*ppArray == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ wl_list_for_each(link_scrn, &ivilayer->screen_list, link) { -+ (*ppArray)[n++] = link_scrn->iviscrn; -+ } -+ } -+ -+ *pLength = length; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static int32_t -+ivi_layout_get_layers(int32_t *pLength, struct ivi_layout_layer ***ppArray) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_layer *ivilayer = NULL; -+ int32_t length = 0; -+ int32_t n = 0; -+ -+ if (pLength == NULL || ppArray == NULL) { -+ weston_log("ivi_layout_get_layers: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ length = wl_list_length(&layout->layer_list); -+ -+ if (length != 0) { -+ /* the Array must be free by module which called this function */ -+ *ppArray = calloc(length, sizeof(struct ivi_layout_layer *)); -+ if (*ppArray == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ wl_list_for_each(ivilayer, &layout->layer_list, link) { -+ (*ppArray)[n++] = ivilayer; -+ } -+ } -+ -+ *pLength = length; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static int32_t -+ivi_layout_get_layers_on_screen(struct ivi_layout_screen *iviscrn, -+ int32_t *pLength, -+ struct ivi_layout_layer ***ppArray) -+{ -+ struct ivi_layout_layer *ivilayer = NULL; -+ int32_t length = 0; -+ int32_t n = 0; -+ -+ if (iviscrn == NULL || pLength == NULL || ppArray == NULL) { -+ weston_log("ivi_layout_get_layers_on_screen: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ length = wl_list_length(&iviscrn->order.layer_list); -+ -+ if (length != 0) { -+ /* the Array must be free by module which called this function */ -+ *ppArray = calloc(length, sizeof(struct ivi_layout_layer *)); -+ if (*ppArray == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ wl_list_for_each(ivilayer, &iviscrn->order.layer_list, order.link) { -+ (*ppArray)[n++] = ivilayer; -+ } -+ } -+ -+ *pLength = length; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static int32_t -+ivi_layout_get_layers_under_surface(struct ivi_layout_surface *ivisurf, -+ int32_t *pLength, -+ struct ivi_layout_layer ***ppArray) -+{ -+ struct link_layer *link_layer = NULL; -+ int32_t length = 0; -+ int32_t n = 0; -+ -+ if (ivisurf == NULL || pLength == NULL || ppArray == NULL) { -+ weston_log("ivi_layout_getLayers: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ length = wl_list_length(&ivisurf->layer_list); -+ -+ if (length != 0) { -+ /* the Array must be free by module which called this function */ -+ *ppArray = calloc(length, sizeof(struct ivi_layout_layer *)); -+ if (*ppArray == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ wl_list_for_each(link_layer, &ivisurf->layer_list, link) { -+ (*ppArray)[n++] = link_layer->ivilayer; -+ } -+ } -+ -+ *pLength = length; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static -+int32_t -+ivi_layout_get_surfaces(int32_t *pLength, struct ivi_layout_surface ***ppArray) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_surface *ivisurf = NULL; -+ int32_t length = 0; -+ int32_t n = 0; -+ -+ if (pLength == NULL || ppArray == NULL) { -+ weston_log("ivi_layout_get_surfaces: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ length = wl_list_length(&layout->surface_list); -+ -+ if (length != 0) { -+ /* the Array must be free by module which called this function */ -+ *ppArray = calloc(length, sizeof(struct ivi_layout_surface *)); -+ if (*ppArray == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ wl_list_for_each(ivisurf, &layout->surface_list, link) { -+ (*ppArray)[n++] = ivisurf; -+ } -+ } -+ -+ *pLength = length; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static int32_t -+ivi_layout_get_surfaces_on_layer(struct ivi_layout_layer *ivilayer, -+ int32_t *pLength, -+ struct ivi_layout_surface ***ppArray) -+{ -+ struct ivi_layout_surface *ivisurf = NULL; -+ int32_t length = 0; -+ int32_t n = 0; -+ -+ if (ivilayer == NULL || pLength == NULL || ppArray == NULL) { -+ weston_log("ivi_layout_getSurfaceIDsOnLayer: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ length = wl_list_length(&ivilayer->order.surface_list); -+ -+ if (length != 0) { -+ /* the Array must be free by module which called this function */ -+ *ppArray = calloc(length, sizeof(struct ivi_layout_surface *)); -+ if (*ppArray == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ wl_list_for_each(ivisurf, &ivilayer->order.surface_list, order.link) { -+ (*ppArray)[n++] = ivisurf; -+ } -+ } -+ -+ *pLength = length; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static struct ivi_layout_layer * -+ivi_layout_layer_create_with_dimension(uint32_t id_layer, -+ int32_t width, int32_t height) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_layer *ivilayer = NULL; -+ -+ ivilayer = get_layer(&layout->layer_list, id_layer); -+ if (ivilayer != NULL) { -+ weston_log("id_layer is already created\n"); -+ ++ivilayer->ref_count; -+ return ivilayer; -+ } -+ -+ ivilayer = calloc(1, sizeof *ivilayer); -+ if (ivilayer == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return NULL; -+ } -+ -+ ivilayer->ref_count = 1; -+ wl_signal_init(&ivilayer->property_changed); -+ wl_list_init(&ivilayer->screen_list); -+ wl_list_init(&ivilayer->link_to_surface); -+ ivilayer->layout = layout; -+ ivilayer->id_layer = id_layer; -+ -+ init_layer_properties(&ivilayer->prop, width, height); -+ ivilayer->event_mask = 0; -+ -+ wl_list_init(&ivilayer->pending.surface_list); -+ wl_list_init(&ivilayer->pending.link); -+ ivilayer->pending.prop = ivilayer->prop; -+ -+ wl_list_init(&ivilayer->order.surface_list); -+ wl_list_init(&ivilayer->order.link); -+ -+ wl_list_insert(&layout->layer_list, &ivilayer->link); -+ -+ wl_signal_emit(&layout->layer_notification.created, ivilayer); -+ -+ return ivilayer; -+} -+ -+static void -+ivi_layout_layer_remove_notification(struct ivi_layout_layer *ivilayer) -+{ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_remove_notification: invalid argument\n"); -+ return; -+ } -+ -+ remove_all_notification(&ivilayer->property_changed.listener_list); -+} -+ -+static void -+ivi_layout_layer_remove_notification_by_callback(struct ivi_layout_layer *ivilayer, -+ layer_property_notification_func callback, -+ void *userdata) -+{ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_remove_notification_by_callback: invalid argument\n"); -+ return; -+ } -+ -+ remove_notification(&ivilayer->property_changed.listener_list, callback, userdata); -+} -+ -+static void -+ivi_layout_layer_destroy(struct ivi_layout_layer *ivilayer) -+{ -+ struct ivi_layout *layout = get_instance(); -+ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_remove: invalid argument\n"); -+ return; -+ } -+ -+ if (--ivilayer->ref_count > 0) -+ return; -+ -+ wl_signal_emit(&layout->layer_notification.removed, ivilayer); -+ -+ clear_surface_pending_list(ivilayer); -+ clear_surface_order_list(ivilayer); -+ -+ wl_list_remove(&ivilayer->pending.link); -+ wl_list_remove(&ivilayer->order.link); -+ wl_list_remove(&ivilayer->link); -+ -+ remove_orderlayer_from_screen(ivilayer); -+ remove_link_to_surface(ivilayer); -+ ivi_layout_layer_remove_notification(ivilayer); -+ -+ free(ivilayer); -+} -+ -+int32_t -+ivi_layout_layer_set_visibility(struct ivi_layout_layer *ivilayer, -+ bool newVisibility) -+{ -+ struct ivi_layout_layer_properties *prop = NULL; -+ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_set_visibility: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivilayer->pending.prop; -+ prop->visibility = newVisibility; -+ -+ if (ivilayer->prop.visibility != newVisibility) -+ ivilayer->event_mask |= IVI_NOTIFICATION_VISIBILITY; -+ else -+ ivilayer->event_mask &= ~IVI_NOTIFICATION_VISIBILITY; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static bool -+ivi_layout_layer_get_visibility(struct ivi_layout_layer *ivilayer) -+{ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_get_visibility: invalid argument\n"); -+ return false; -+ } -+ -+ return ivilayer->prop.visibility; -+} -+ -+int32_t -+ivi_layout_layer_set_opacity(struct ivi_layout_layer *ivilayer, -+ wl_fixed_t opacity) -+{ -+ struct ivi_layout_layer_properties *prop = NULL; -+ -+ if (ivilayer == NULL || -+ opacity < wl_fixed_from_double(0.0) || -+ wl_fixed_from_double(1.0) < opacity) { -+ weston_log("ivi_layout_layer_set_opacity: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivilayer->pending.prop; -+ prop->opacity = opacity; -+ -+ if (ivilayer->prop.opacity != opacity) -+ ivilayer->event_mask |= IVI_NOTIFICATION_OPACITY; -+ else -+ ivilayer->event_mask &= ~IVI_NOTIFICATION_OPACITY; -+ -+ return IVI_SUCCEEDED; -+} -+ -+wl_fixed_t -+ivi_layout_layer_get_opacity(struct ivi_layout_layer *ivilayer) -+{ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_get_opacity: invalid argument\n"); -+ return wl_fixed_from_double(0.0); -+ } -+ -+ return ivilayer->prop.opacity; -+} -+ -+static int32_t -+ivi_layout_layer_set_source_rectangle(struct ivi_layout_layer *ivilayer, -+ int32_t x, int32_t y, -+ int32_t width, int32_t height) -+{ -+ struct ivi_layout_layer_properties *prop = NULL; -+ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_set_source_rectangle: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivilayer->pending.prop; -+ prop->source_x = x; -+ prop->source_y = y; -+ prop->source_width = width; -+ prop->source_height = height; -+ -+ if (ivilayer->prop.source_x != x || ivilayer->prop.source_y != y || -+ ivilayer->prop.source_width != width || -+ ivilayer->prop.source_height != height) -+ ivilayer->event_mask |= IVI_NOTIFICATION_SOURCE_RECT; -+ else -+ ivilayer->event_mask &= ~IVI_NOTIFICATION_SOURCE_RECT; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static int32_t -+ivi_layout_layer_set_destination_rectangle(struct ivi_layout_layer *ivilayer, -+ int32_t x, int32_t y, -+ int32_t width, int32_t height) -+{ -+ struct ivi_layout_layer_properties *prop = NULL; -+ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_set_destination_rectangle: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivilayer->pending.prop; -+ prop->dest_x = x; -+ prop->dest_y = y; -+ prop->dest_width = width; -+ prop->dest_height = height; -+ -+ if (ivilayer->prop.dest_x != x || ivilayer->prop.dest_y != y || -+ ivilayer->prop.dest_width != width || -+ ivilayer->prop.dest_height != height) -+ ivilayer->event_mask |= IVI_NOTIFICATION_DEST_RECT; -+ else -+ ivilayer->event_mask &= ~IVI_NOTIFICATION_DEST_RECT; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static int32_t -+ivi_layout_layer_get_dimension(struct ivi_layout_layer *ivilayer, -+ int32_t *dest_width, int32_t *dest_height) -+{ -+ if (ivilayer == NULL || dest_width == NULL || dest_height == NULL) { -+ weston_log("ivi_layout_layer_get_dimension: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ *dest_width = ivilayer->prop.dest_width; -+ *dest_height = ivilayer->prop.dest_height; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static int32_t -+ivi_layout_layer_set_dimension(struct ivi_layout_layer *ivilayer, -+ int32_t dest_width, int32_t dest_height) -+{ -+ struct ivi_layout_layer_properties *prop = NULL; -+ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_set_dimension: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivilayer->pending.prop; -+ -+ prop->dest_width = dest_width; -+ prop->dest_height = dest_height; -+ -+ if (ivilayer->prop.dest_width != dest_width || -+ ivilayer->prop.dest_height != dest_height) -+ ivilayer->event_mask |= IVI_NOTIFICATION_DIMENSION; -+ else -+ ivilayer->event_mask &= ~IVI_NOTIFICATION_DIMENSION; -+ -+ return IVI_SUCCEEDED; -+} -+ -+int32_t -+ivi_layout_layer_get_position(struct ivi_layout_layer *ivilayer, -+ int32_t *dest_x, int32_t *dest_y) -+{ -+ if (ivilayer == NULL || dest_x == NULL || dest_y == NULL) { -+ weston_log("ivi_layout_layer_get_position: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ *dest_x = ivilayer->prop.dest_x; -+ *dest_y = ivilayer->prop.dest_y; -+ -+ return IVI_SUCCEEDED; -+} -+ -+int32_t -+ivi_layout_layer_set_position(struct ivi_layout_layer *ivilayer, -+ int32_t dest_x, int32_t dest_y) -+{ -+ struct ivi_layout_layer_properties *prop = NULL; -+ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_set_position: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivilayer->pending.prop; -+ prop->dest_x = dest_x; -+ prop->dest_y = dest_y; -+ -+ if (ivilayer->prop.dest_x != dest_x || ivilayer->prop.dest_y != dest_y) -+ ivilayer->event_mask |= IVI_NOTIFICATION_POSITION; -+ else -+ ivilayer->event_mask &= ~IVI_NOTIFICATION_POSITION; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static int32_t -+ivi_layout_layer_set_orientation(struct ivi_layout_layer *ivilayer, -+ enum wl_output_transform orientation) -+{ -+ struct ivi_layout_layer_properties *prop = NULL; -+ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_set_orientation: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivilayer->pending.prop; -+ prop->orientation = orientation; -+ -+ if (ivilayer->prop.orientation != orientation) -+ ivilayer->event_mask |= IVI_NOTIFICATION_ORIENTATION; -+ else -+ ivilayer->event_mask &= ~IVI_NOTIFICATION_ORIENTATION; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static enum wl_output_transform -+ivi_layout_layer_get_orientation(struct ivi_layout_layer *ivilayer) -+{ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_get_orientation: invalid argument\n"); -+ return 0; -+ } -+ -+ return ivilayer->prop.orientation; -+} -+ -+int32_t -+ivi_layout_layer_set_render_order(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface **pSurface, -+ int32_t number) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_surface *ivisurf = NULL; -+ struct ivi_layout_surface *next = NULL; -+ uint32_t *id_surface = NULL; -+ int32_t i = 0; -+ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_set_render_order: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ clear_surface_pending_list(ivilayer); -+ -+ for (i = 0; i < number; i++) { -+ id_surface = &pSurface[i]->id_surface; -+ -+ wl_list_for_each_safe(ivisurf, next, &layout->surface_list, link) { -+ if (*id_surface != ivisurf->id_surface) { -+ continue; -+ } -+ -+ wl_list_remove(&ivisurf->pending.link); -+ wl_list_insert(&ivilayer->pending.surface_list, -+ &ivisurf->pending.link); -+ break; -+ } -+ } -+ -+ ivilayer->order.dirty = 1; -+ -+ return IVI_SUCCEEDED; -+} -+ -+int32_t -+ivi_layout_surface_set_visibility(struct ivi_layout_surface *ivisurf, -+ bool newVisibility) -+{ -+ struct ivi_layout_surface_properties *prop = NULL; -+ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_set_visibility: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivisurf->pending.prop; -+ prop->visibility = newVisibility; -+ -+ if (ivisurf->prop.visibility != newVisibility) -+ ivisurf->event_mask |= IVI_NOTIFICATION_VISIBILITY; -+ else -+ ivisurf->event_mask &= ~IVI_NOTIFICATION_VISIBILITY; -+ -+ return IVI_SUCCEEDED; -+} -+ -+bool -+ivi_layout_surface_get_visibility(struct ivi_layout_surface *ivisurf) -+{ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_get_visibility: invalid argument\n"); -+ return false; -+ } -+ -+ return ivisurf->prop.visibility; -+} -+ -+int32_t -+ivi_layout_surface_set_opacity(struct ivi_layout_surface *ivisurf, -+ wl_fixed_t opacity) -+{ -+ struct ivi_layout_surface_properties *prop = NULL; -+ -+ if (ivisurf == NULL || -+ opacity < wl_fixed_from_double(0.0) || -+ wl_fixed_from_double(1.0) < opacity) { -+ weston_log("ivi_layout_surface_set_opacity: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivisurf->pending.prop; -+ prop->opacity = opacity; -+ -+ if (ivisurf->prop.opacity != opacity) -+ ivisurf->event_mask |= IVI_NOTIFICATION_OPACITY; -+ else -+ ivisurf->event_mask &= ~IVI_NOTIFICATION_OPACITY; -+ -+ return IVI_SUCCEEDED; -+} -+ -+wl_fixed_t -+ivi_layout_surface_get_opacity(struct ivi_layout_surface *ivisurf) -+{ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_get_opacity: invalid argument\n"); -+ return wl_fixed_from_double(0.0); -+ } -+ -+ return ivisurf->prop.opacity; -+} -+ -+int32_t -+ivi_layout_surface_set_destination_rectangle(struct ivi_layout_surface *ivisurf, -+ int32_t x, int32_t y, -+ int32_t width, int32_t height) -+{ -+ struct ivi_layout_surface_properties *prop = NULL; -+ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_set_destination_rectangle: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivisurf->pending.prop; -+ prop->start_x = prop->dest_x; -+ prop->start_y = prop->dest_y; -+ prop->dest_x = x; -+ prop->dest_y = y; -+ prop->start_width = prop->dest_width; -+ prop->start_height = prop->dest_height; -+ prop->dest_width = width; -+ prop->dest_height = height; -+ -+ if (ivisurf->prop.dest_x != x || ivisurf->prop.dest_y != y || -+ ivisurf->prop.dest_width != width || -+ ivisurf->prop.dest_height != height) -+ ivisurf->event_mask |= IVI_NOTIFICATION_DEST_RECT; -+ else -+ ivisurf->event_mask &= ~IVI_NOTIFICATION_DEST_RECT; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static int32_t -+ivi_layout_surface_set_dimension(struct ivi_layout_surface *ivisurf, -+ int32_t dest_width, int32_t dest_height) -+{ -+ struct ivi_layout_surface_properties *prop = NULL; -+ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_set_dimension: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivisurf->pending.prop; -+ prop->dest_width = dest_width; -+ prop->dest_height = dest_height; -+ -+ if (ivisurf->prop.dest_width != dest_width || -+ ivisurf->prop.dest_height != dest_height) -+ ivisurf->event_mask |= IVI_NOTIFICATION_DIMENSION; -+ else -+ ivisurf->event_mask &= ~IVI_NOTIFICATION_DIMENSION; -+ -+ return IVI_SUCCEEDED; -+} -+ -+int32_t -+ivi_layout_surface_get_dimension(struct ivi_layout_surface *ivisurf, -+ int32_t *dest_width, int32_t *dest_height) -+{ -+ if (ivisurf == NULL || dest_width == NULL || dest_height == NULL) { -+ weston_log("ivi_layout_surface_get_dimension: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ *dest_width = ivisurf->prop.dest_width; -+ *dest_height = ivisurf->prop.dest_height; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static int32_t -+ivi_layout_surface_set_position(struct ivi_layout_surface *ivisurf, -+ int32_t dest_x, int32_t dest_y) -+{ -+ struct ivi_layout_surface_properties *prop = NULL; -+ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_set_position: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivisurf->pending.prop; -+ prop->dest_x = dest_x; -+ prop->dest_y = dest_y; -+ -+ if (ivisurf->prop.dest_x != dest_x || ivisurf->prop.dest_y != dest_y) -+ ivisurf->event_mask |= IVI_NOTIFICATION_POSITION; -+ else -+ ivisurf->event_mask &= ~IVI_NOTIFICATION_POSITION; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static int32_t -+ivi_layout_surface_get_position(struct ivi_layout_surface *ivisurf, -+ int32_t *dest_x, int32_t *dest_y) -+{ -+ if (ivisurf == NULL || dest_x == NULL || dest_y == NULL) { -+ weston_log("ivi_layout_surface_get_position: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ *dest_x = ivisurf->prop.dest_x; -+ *dest_y = ivisurf->prop.dest_y; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static int32_t -+ivi_layout_surface_set_orientation(struct ivi_layout_surface *ivisurf, -+ enum wl_output_transform orientation) -+{ -+ struct ivi_layout_surface_properties *prop = NULL; -+ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_set_orientation: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivisurf->pending.prop; -+ prop->orientation = orientation; -+ -+ if (ivisurf->prop.orientation != orientation) -+ ivisurf->event_mask |= IVI_NOTIFICATION_ORIENTATION; -+ else -+ ivisurf->event_mask &= ~IVI_NOTIFICATION_ORIENTATION; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static enum wl_output_transform -+ivi_layout_surface_get_orientation(struct ivi_layout_surface *ivisurf) -+{ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_get_orientation: invalid argument\n"); -+ return 0; -+ } -+ -+ return ivisurf->prop.orientation; -+} -+ -+static int32_t -+ivi_layout_screen_add_layer(struct ivi_layout_screen *iviscrn, -+ struct ivi_layout_layer *addlayer) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_layer *ivilayer = NULL; -+ struct ivi_layout_layer *next = NULL; -+ int is_layer_in_scrn = 0; -+ -+ if (iviscrn == NULL || addlayer == NULL) { -+ weston_log("ivi_layout_screen_add_layer: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ is_layer_in_scrn = is_layer_in_screen(addlayer, iviscrn); -+ if (is_layer_in_scrn == 1) { -+ weston_log("ivi_layout_screen_add_layer: addlayer is already available\n"); -+ return IVI_SUCCEEDED; -+ } -+ -+ wl_list_for_each_safe(ivilayer, next, &layout->layer_list, link) { -+ if (ivilayer->id_layer == addlayer->id_layer) { -+ wl_list_remove(&ivilayer->pending.link); -+ wl_list_insert(&iviscrn->pending.layer_list, -+ &ivilayer->pending.link); -+ break; -+ } -+ } -+ -+ iviscrn->order.dirty = 1; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static int32_t -+ivi_layout_screen_set_render_order(struct ivi_layout_screen *iviscrn, -+ struct ivi_layout_layer **pLayer, -+ const int32_t number) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_layer *ivilayer = NULL; -+ struct ivi_layout_layer *next = NULL; -+ uint32_t *id_layer = NULL; -+ int32_t i = 0; -+ -+ if (iviscrn == NULL) { -+ weston_log("ivi_layout_screen_set_render_order: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ wl_list_for_each_safe(ivilayer, next, -+ &iviscrn->pending.layer_list, pending.link) { -+ wl_list_remove(&ivilayer->pending.link); -+ wl_list_init(&ivilayer->pending.link); -+ } -+ -+ assert(wl_list_empty(&iviscrn->pending.layer_list)); -+ -+ for (i = 0; i < number; i++) { -+ id_layer = &pLayer[i]->id_layer; -+ wl_list_for_each(ivilayer, &layout->layer_list, link) { -+ if (*id_layer != ivilayer->id_layer) { -+ continue; -+ } -+ -+ wl_list_remove(&ivilayer->pending.link); -+ wl_list_insert(&iviscrn->pending.layer_list, -+ &ivilayer->pending.link); -+ break; -+ } -+ } -+ -+ iviscrn->order.dirty = 1; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static struct weston_output * -+ivi_layout_screen_get_output(struct ivi_layout_screen *iviscrn) -+{ -+ return iviscrn->output; -+} -+ -+/** -+ * This function is used by the additional ivi-module because of dumping ivi_surface sceenshot. -+ * The ivi-module, e.g. ivi-controller.so, is in wayland-ivi-extension of Genivi's Layer Management. -+ * This function is used to get the result of drawing by clients. -+ */ -+static struct weston_surface * -+ivi_layout_surface_get_weston_surface(struct ivi_layout_surface *ivisurf) -+{ -+ return ivisurf != NULL ? ivisurf->surface : NULL; -+} -+ -+static int32_t -+ivi_layout_surface_get_size(struct ivi_layout_surface *ivisurf, -+ int32_t *width, int32_t *height, -+ int32_t *stride) -+{ -+ int32_t w; -+ int32_t h; -+ const size_t bytespp = 4; /* PIXMAN_a8b8g8r8 */ -+ -+ if (ivisurf == NULL || ivisurf->surface == NULL) { -+ weston_log("%s: invalid argument\n", __func__); -+ return IVI_FAILED; -+ } -+ -+ weston_surface_get_content_size(ivisurf->surface, &w, &h); -+ -+ if (width != NULL) -+ *width = w; -+ -+ if (height != NULL) -+ *height = h; -+ -+ if (stride != NULL) -+ *stride = w * bytespp; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static int32_t -+ivi_layout_layer_add_notification(struct ivi_layout_layer *ivilayer, -+ layer_property_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout_notification_callback *prop_callback = NULL; -+ -+ if (ivilayer == NULL || callback == NULL) { -+ weston_log("ivi_layout_layer_add_notification: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop_callback = malloc(sizeof *prop_callback); -+ if (prop_callback == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ prop_callback->callback = callback; -+ prop_callback->data = userdata; -+ -+ return add_notification(&ivilayer->property_changed, -+ layer_prop_changed, -+ prop_callback); -+} -+ -+static const struct ivi_layout_surface_properties * -+ivi_layout_get_properties_of_surface(struct ivi_layout_surface *ivisurf) -+{ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_get_properties_of_surface: invalid argument\n"); -+ return NULL; -+ } -+ -+ return &ivisurf->prop; -+} -+ -+static int32_t -+ivi_layout_layer_add_surface(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface *addsurf) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_surface *ivisurf = NULL; -+ struct ivi_layout_surface *next = NULL; -+ int is_surf_in_layer = 0; -+ -+ if (ivilayer == NULL || addsurf == NULL) { -+ weston_log("ivi_layout_layer_add_surface: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ is_surf_in_layer = is_surface_in_layer(addsurf, ivilayer); -+ if (is_surf_in_layer == 1) { -+ weston_log("ivi_layout_layer_add_surface: addsurf is already available\n"); -+ return IVI_SUCCEEDED; -+ } -+ -+ wl_list_for_each_safe(ivisurf, next, &layout->surface_list, link) { -+ if (ivisurf->id_surface == addsurf->id_surface) { -+ wl_list_remove(&ivisurf->pending.link); -+ wl_list_insert(&ivilayer->pending.surface_list, -+ &ivisurf->pending.link); -+ break; -+ } -+ } -+ -+ ivilayer->order.dirty = 1; -+ -+ return IVI_SUCCEEDED; -+} -+ -+static void -+ivi_layout_layer_remove_surface(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface *remsurf) -+{ -+ struct ivi_layout_surface *ivisurf = NULL; -+ struct ivi_layout_surface *next = NULL; -+ -+ if (ivilayer == NULL || remsurf == NULL) { -+ weston_log("ivi_layout_layer_remove_surface: invalid argument\n"); -+ return; -+ } -+ -+ wl_list_for_each_safe(ivisurf, next, -+ &ivilayer->pending.surface_list, pending.link) { -+ if (ivisurf->id_surface == remsurf->id_surface) { -+ wl_list_remove(&ivisurf->pending.link); -+ wl_list_init(&ivisurf->pending.link); -+ break; -+ } -+ } -+ -+ ivilayer->order.dirty = 1; -+} -+ -+static int32_t -+ivi_layout_surface_set_source_rectangle(struct ivi_layout_surface *ivisurf, -+ int32_t x, int32_t y, -+ int32_t width, int32_t height) -+{ -+ struct ivi_layout_surface_properties *prop = NULL; -+ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_set_source_rectangle: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivisurf->pending.prop; -+ prop->source_x = x; -+ prop->source_y = y; -+ prop->source_width = width; -+ prop->source_height = height; -+ -+ if (ivisurf->prop.source_x != x || ivisurf->prop.source_y != y || -+ ivisurf->prop.source_width != width || -+ ivisurf->prop.source_height != height) -+ ivisurf->event_mask |= IVI_NOTIFICATION_SOURCE_RECT; -+ else -+ ivisurf->event_mask &= ~IVI_NOTIFICATION_SOURCE_RECT; -+ -+ return IVI_SUCCEEDED; -+} -+ -+int32_t -+ivi_layout_commit_changes(void) -+{ -+ struct ivi_layout *layout = get_instance(); -+ -+ commit_surface_list(layout); -+ commit_layer_list(layout); -+ commit_screen_list(layout); -+ -+ commit_transition(layout); -+ -+ commit_changes(layout); -+ send_prop(layout); -+ weston_compositor_schedule_repaint(layout->compositor); -+ -+ return IVI_SUCCEEDED; -+} -+ -+static int32_t -+ivi_layout_layer_set_transition(struct ivi_layout_layer *ivilayer, -+ enum ivi_layout_transition_type type, -+ uint32_t duration) -+{ -+ if (ivilayer == NULL) { -+ weston_log("%s: invalid argument\n", __func__); -+ return -1; -+ } -+ -+ ivilayer->pending.prop.transition_type = type; -+ ivilayer->pending.prop.transition_duration = duration; -+ -+ return 0; -+} -+ -+static int32_t -+ivi_layout_layer_set_fade_info(struct ivi_layout_layer* ivilayer, -+ uint32_t is_fade_in, -+ double start_alpha, double end_alpha) -+{ -+ if (ivilayer == NULL) { -+ weston_log("%s: invalid argument\n", __func__); -+ return -1; -+ } -+ -+ ivilayer->pending.prop.is_fade_in = is_fade_in; -+ ivilayer->pending.prop.start_alpha = start_alpha; -+ ivilayer->pending.prop.end_alpha = end_alpha; -+ -+ return 0; -+} -+ -+static int32_t -+ivi_layout_surface_set_transition_duration(struct ivi_layout_surface *ivisurf, -+ uint32_t duration) -+{ -+ struct ivi_layout_surface_properties *prop; -+ -+ if (ivisurf == NULL) { -+ weston_log("%s: invalid argument\n", __func__); -+ return -1; -+ } -+ -+ prop = &ivisurf->pending.prop; -+ prop->transition_duration = duration*10; -+ return 0; -+} -+ -+static int32_t -+ivi_layout_surface_set_transition(struct ivi_layout_surface *ivisurf, -+ enum ivi_layout_transition_type type, -+ uint32_t duration) -+{ -+ struct ivi_layout_surface_properties *prop; -+ -+ if (ivisurf == NULL) { -+ weston_log("%s: invalid argument\n", __func__); -+ return -1; -+ } -+ -+ prop = &ivisurf->pending.prop; -+ prop->transition_type = type; -+ prop->transition_duration = duration; -+ return 0; -+} -+ -+static int32_t -+ivi_layout_surface_dump(struct weston_surface *surface, -+ void *target, size_t size,int32_t x, int32_t y, -+ int32_t width, int32_t height) -+{ -+ int result = 0; -+ -+ if (surface == NULL) { -+ weston_log("%s: invalid argument\n", __func__); -+ return IVI_FAILED; -+ } -+ -+ result = weston_surface_copy_content( -+ surface, target, size, -+ x, y, width, height); -+ -+ return result == 0 ? IVI_SUCCEEDED : IVI_FAILED; -+} -+ -+/** -+ * methods of interaction between ivi-shell with ivi-layout -+ */ -+struct weston_view * -+ivi_layout_get_weston_view(struct ivi_layout_surface *surface) -+{ -+ struct weston_view *tmpview = NULL; -+ -+ if (surface == NULL) -+ return NULL; -+ -+ wl_list_for_each(tmpview, &surface->surface->views, surface_link) -+ { -+ if (tmpview != NULL) { -+ break; -+ } -+ } -+ return tmpview; -+} -+ -+void -+ivi_layout_surface_configure(struct ivi_layout_surface *ivisurf, -+ int32_t width, int32_t height) -+{ -+ struct ivi_layout *layout = get_instance(); -+ -+ /* emit callback which is set by ivi-layout api user */ -+ wl_signal_emit(&layout->surface_notification.configure_changed, -+ ivisurf); -+} -+ -+static int32_t -+ivi_layout_surface_set_content_observer(struct ivi_layout_surface *ivisurf, -+ ivi_controller_surface_content_callback callback, -+ void* userdata) -+{ -+ int32_t ret = IVI_FAILED; -+ -+ if (ivisurf != NULL) { -+ ivisurf->content_observer.callback = callback; -+ ivisurf->content_observer.userdata = userdata; -+ ret = IVI_SUCCEEDED; -+ } -+ return ret; -+} -+ -+struct ivi_layout_surface* -+ivi_layout_surface_create(struct weston_surface *wl_surface, -+ uint32_t id_surface) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_surface *ivisurf = NULL; -+ struct weston_view *tmpview = NULL; -+ -+ if (wl_surface == NULL) { -+ weston_log("ivi_layout_surface_create: invalid argument\n"); -+ return NULL; -+ } -+ -+ ivisurf = get_surface(&layout->surface_list, id_surface); -+ if (ivisurf != NULL) { -+ if (ivisurf->surface != NULL) { -+ weston_log("id_surface(%d) is already created\n", id_surface); -+ return NULL; -+ } -+ } -+ -+ ivisurf = calloc(1, sizeof *ivisurf); -+ if (ivisurf == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return NULL; -+ } -+ -+ wl_signal_init(&ivisurf->property_changed); -+ wl_signal_init(&ivisurf->configured); -+ wl_list_init(&ivisurf->layer_list); -+ ivisurf->id_surface = id_surface; -+ ivisurf->layout = layout; -+ -+ ivisurf->surface = wl_surface; -+ -+ tmpview = weston_view_create(wl_surface); -+ if (tmpview == NULL) { -+ weston_log("fails to allocate memory\n"); -+ } -+ -+ ivisurf->surface->width_from_buffer = 0; -+ ivisurf->surface->height_from_buffer = 0; -+ -+ weston_matrix_init(&ivisurf->transform.matrix); -+ wl_list_init(&ivisurf->transform.link); -+ -+ init_surface_properties(&ivisurf->prop); -+ ivisurf->event_mask = 0; -+ -+ ivisurf->pending.prop = ivisurf->prop; -+ wl_list_init(&ivisurf->pending.link); -+ -+ wl_list_init(&ivisurf->order.link); -+ wl_list_init(&ivisurf->order.layer_list); -+ -+ wl_list_insert(&layout->surface_list, &ivisurf->link); -+ -+ wl_signal_emit(&layout->surface_notification.created, ivisurf); -+ -+ return ivisurf; -+} -+ -+void -+ivi_layout_init_with_compositor(struct weston_compositor *ec) -+{ -+ struct ivi_layout *layout = get_instance(); -+ -+ layout->compositor = ec; -+ -+ wl_list_init(&layout->surface_list); -+ wl_list_init(&layout->layer_list); -+ wl_list_init(&layout->screen_list); -+ -+ wl_signal_init(&layout->layer_notification.created); -+ wl_signal_init(&layout->layer_notification.removed); -+ -+ wl_signal_init(&layout->surface_notification.created); -+ wl_signal_init(&layout->surface_notification.removed); -+ wl_signal_init(&layout->surface_notification.configure_changed); -+ -+ /* Add layout_layer at the last of weston_compositor.layer_list */ -+ weston_layer_init(&layout->layout_layer, ec->layer_list.prev); -+ -+ create_screen(ec); -+ -+ layout->transitions = ivi_layout_transition_set_create(ec); -+ wl_list_init(&layout->pending_transition_list); -+} -+ -+ -+void -+ivi_layout_surface_add_configured_listener(struct ivi_layout_surface* ivisurf, -+ struct wl_listener* listener) -+{ -+ wl_signal_add(&ivisurf->configured, listener); -+} -+ -+static struct ivi_controller_interface ivi_controller_interface = { -+ /** -+ * commit all changes -+ */ -+ .commit_changes = ivi_layout_commit_changes, -+ -+ /** -+ * surface controller interfaces -+ */ -+ .add_notification_create_surface = ivi_layout_add_notification_create_surface, -+ .remove_notification_create_surface = ivi_layout_remove_notification_create_surface, -+ .add_notification_remove_surface = ivi_layout_add_notification_remove_surface, -+ .remove_notification_remove_surface = ivi_layout_remove_notification_remove_surface, -+ .add_notification_configure_surface = ivi_layout_add_notification_configure_surface, -+ .remove_notification_configure_surface = ivi_layout_remove_notification_configure_surface, -+ .get_surfaces = ivi_layout_get_surfaces, -+ .get_id_of_surface = ivi_layout_get_id_of_surface, -+ .get_surface_from_id = ivi_layout_get_surface_from_id, -+ .get_properties_of_surface = ivi_layout_get_properties_of_surface, -+ .get_surfaces_on_layer = ivi_layout_get_surfaces_on_layer, -+ .surface_set_visibility = ivi_layout_surface_set_visibility, -+ .surface_get_visibility = ivi_layout_surface_get_visibility, -+ .surface_set_opacity = ivi_layout_surface_set_opacity, -+ .surface_get_opacity = ivi_layout_surface_get_opacity, -+ .surface_set_source_rectangle = ivi_layout_surface_set_source_rectangle, -+ .surface_set_destination_rectangle = ivi_layout_surface_set_destination_rectangle, -+ .surface_set_position = ivi_layout_surface_set_position, -+ .surface_get_position = ivi_layout_surface_get_position, -+ .surface_set_dimension = ivi_layout_surface_set_dimension, -+ .surface_get_dimension = ivi_layout_surface_get_dimension, -+ .surface_set_orientation = ivi_layout_surface_set_orientation, -+ .surface_get_orientation = ivi_layout_surface_get_orientation, -+ .surface_set_content_observer = ivi_layout_surface_set_content_observer, -+ .surface_add_notification = ivi_layout_surface_add_notification, -+ .surface_remove_notification = ivi_layout_surface_remove_notification, -+ .surface_get_weston_surface = ivi_layout_surface_get_weston_surface, -+ .surface_set_transition = ivi_layout_surface_set_transition, -+ .surface_set_transition_duration = ivi_layout_surface_set_transition_duration, -+ -+ /** -+ * layer controller interfaces -+ */ -+ .add_notification_create_layer = ivi_layout_add_notification_create_layer, -+ .remove_notification_create_layer = ivi_layout_remove_notification_create_layer, -+ .add_notification_remove_layer = ivi_layout_add_notification_remove_layer, -+ .remove_notification_remove_layer = ivi_layout_remove_notification_remove_layer, -+ .layer_create_with_dimension = ivi_layout_layer_create_with_dimension, -+ .layer_destroy = ivi_layout_layer_destroy, -+ .get_layers = ivi_layout_get_layers, -+ .get_id_of_layer = ivi_layout_get_id_of_layer, -+ .get_layer_from_id = ivi_layout_get_layer_from_id, -+ .get_properties_of_layer = ivi_layout_get_properties_of_layer, -+ .get_layers_under_surface = ivi_layout_get_layers_under_surface, -+ .get_layers_on_screen = ivi_layout_get_layers_on_screen, -+ .layer_set_visibility = ivi_layout_layer_set_visibility, -+ .layer_get_visibility = ivi_layout_layer_get_visibility, -+ .layer_set_opacity = ivi_layout_layer_set_opacity, -+ .layer_get_opacity = ivi_layout_layer_get_opacity, -+ .layer_set_source_rectangle = ivi_layout_layer_set_source_rectangle, -+ .layer_set_destination_rectangle = ivi_layout_layer_set_destination_rectangle, -+ .layer_set_position = ivi_layout_layer_set_position, -+ .layer_get_position = ivi_layout_layer_get_position, -+ .layer_set_dimension = ivi_layout_layer_set_dimension, -+ .layer_get_dimension = ivi_layout_layer_get_dimension, -+ .layer_set_orientation = ivi_layout_layer_set_orientation, -+ .layer_get_orientation = ivi_layout_layer_get_orientation, -+ .layer_add_surface = ivi_layout_layer_add_surface, -+ .layer_remove_surface = ivi_layout_layer_remove_surface, -+ .layer_set_render_order = ivi_layout_layer_set_render_order, -+ .layer_add_notification = ivi_layout_layer_add_notification, -+ .layer_remove_notification = ivi_layout_layer_remove_notification, -+ .layer_set_transition = ivi_layout_layer_set_transition, -+ -+ /** -+ * screen controller interfaces part1 -+ */ -+ .get_screen_from_id = ivi_layout_get_screen_from_id, -+ .get_screen_resolution = ivi_layout_get_screen_resolution, -+ .get_screens = ivi_layout_get_screens, -+ .get_screens_under_layer = ivi_layout_get_screens_under_layer, -+ .screen_add_layer = ivi_layout_screen_add_layer, -+ .screen_set_render_order = ivi_layout_screen_set_render_order, -+ .screen_get_output = ivi_layout_screen_get_output, -+ -+ /** -+ * animation -+ */ -+ .transition_move_layer_cancel = ivi_layout_transition_move_layer_cancel, -+ .layer_set_fade_info = ivi_layout_layer_set_fade_info, -+ -+ /** -+ * surface content dumping for debugging -+ */ -+ .surface_get_size = ivi_layout_surface_get_size, -+ .surface_dump = ivi_layout_surface_dump, -+ -+ /** -+ * remove notification by callback on property changes of ivi_surface/layer -+ */ -+ .surface_remove_notification_by_callback = ivi_layout_surface_remove_notification_by_callback, -+ .layer_remove_notification_by_callback = ivi_layout_layer_remove_notification_by_callback, -+ -+ /** -+ * screen controller interfaces part2 -+ */ -+ .get_id_of_screen = ivi_layout_get_id_of_screen -+}; -+ -+int -+load_controller_modules(struct weston_compositor *compositor, const char *modules, -+ int *argc, char *argv[]) -+{ -+ const char *p, *end; -+ char buffer[256]; -+ int (*controller_module_init)(struct weston_compositor *compositor, -+ int *argc, char *argv[], -+ const struct ivi_controller_interface *interface, -+ size_t interface_version); -+ -+ if (modules == NULL) -+ return 0; -+ -+ p = modules; -+ while (*p) { -+ end = strchrnul(p, ','); -+ snprintf(buffer, sizeof buffer, "%.*s", (int)(end - p), p); -+ -+ controller_module_init = weston_load_module(buffer, "controller_module_init"); -+ if (!controller_module_init) -+ return -1; -+ -+ if (controller_module_init(compositor, argc, argv, -+ &ivi_controller_interface, -+ sizeof(struct ivi_controller_interface)) != 0) { -+ weston_log("ivi-shell: Initialization of controller module fails"); -+ return -1; -+ } -+ -+ p = end; -+ while (*p == ',') -+ p++; -+ } -+ -+ return 0; -+} -diff --git a/ivi-shell/ivi-shell.c b/ivi-shell/ivi-shell.c -new file mode 100644 -index 0000000..220a508 ---- /dev/null -+++ b/ivi-shell/ivi-shell.c -@@ -0,0 +1,469 @@ -+/* -+ * Copyright (C) 2013 DENSO CORPORATION -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining -+ * a copy of this software and associated documentation files (the -+ * "Software"), to deal in the Software without restriction, including -+ * without limitation the rights to use, copy, modify, merge, publish, -+ * distribute, sublicense, and/or sell copies of the Software, and to -+ * permit persons to whom the Software is furnished to do so, subject to -+ * the following conditions: -+ * -+ * The above copyright notice and this permission notice (including the -+ * next paragraph) shall be included in all copies or substantial -+ * portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -+ * SOFTWARE. -+ */ -+ -+/* -+ * ivi-shell supports a type of shell for In-Vehicle Infotainment system. -+ * In-Vehicle Infotainment system traditionally manages surfaces with global -+ * identification. A protocol, ivi_application, supports such a feature -+ * by implementing a request, ivi_application::surface_creation defined in -+ * ivi_application.xml. -+ * -+ * The ivi-shell explicitly loads a module to add business logic like how to -+ * layout surfaces by using internal ivi-layout APIs. -+ */ -+#include "config.h" -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include "ivi-shell.h" -+#include "ivi-application-server-protocol.h" -+#include "ivi-layout-export.h" -+#include "ivi-layout-private.h" -+#include "shared/helpers.h" -+ -+/* Representation of ivi_surface protocol object. */ -+struct ivi_shell_surface -+{ -+ struct wl_resource* resource; -+ struct ivi_shell *shell; -+ struct ivi_layout_surface *layout_surface; -+ -+ struct weston_surface *surface; -+ struct wl_listener surface_destroy_listener; -+ -+ uint32_t id_surface; -+ -+ int32_t width; -+ int32_t height; -+ -+ struct wl_list link; -+ -+ struct wl_listener configured_listener; -+}; -+ -+struct ivi_shell_setting -+{ -+ char *ivi_module; -+ int developermode; -+}; -+ -+/* -+ * Implementation of ivi_surface -+ */ -+ -+static void -+surface_configure_notify(struct wl_listener *listener, void *data) -+{ -+ struct ivi_layout_surface *layout_surf = -+ (struct ivi_layout_surface *)data; -+ -+ struct ivi_shell_surface *shell_surf = -+ container_of(listener, -+ struct ivi_shell_surface, -+ configured_listener); -+ -+ int32_t dest_width = 0; -+ int32_t dest_height = 0; -+ -+ ivi_layout_surface_get_dimension(layout_surf, -+ &dest_width, &dest_height); -+ -+ if (shell_surf->resource) -+ ivi_surface_send_configure(shell_surf->resource, -+ dest_width, dest_height); -+} -+ -+static void -+ivi_shell_surface_configure(struct weston_surface *, int32_t, int32_t); -+ -+static struct ivi_shell_surface * -+get_ivi_shell_surface(struct weston_surface *surface) -+{ -+ if (surface->configure == ivi_shell_surface_configure) -+ return surface->configure_private; -+ -+ return NULL; -+} -+ -+static void -+ivi_shell_surface_configure(struct weston_surface *surface, -+ int32_t sx, int32_t sy) -+{ -+ struct ivi_shell_surface *ivisurf = get_ivi_shell_surface(surface); -+ -+ if (surface->width == 0 || surface->height == 0 || ivisurf == NULL) -+ return; -+ -+ if (ivisurf->width != surface->width || -+ ivisurf->height != surface->height) { -+ ivisurf->width = surface->width; -+ ivisurf->height = surface->height; -+ -+ ivi_layout_surface_configure(ivisurf->layout_surface, -+ surface->width, surface->height); -+ } -+} -+ -+static void -+layout_surface_cleanup(struct ivi_shell_surface *ivisurf) -+{ -+ assert(ivisurf->layout_surface != NULL); -+ -+ ivi_layout_surface_destroy(ivisurf->layout_surface); -+ ivisurf->layout_surface = NULL; -+ -+ ivisurf->surface->configure = NULL; -+ ivisurf->surface->configure_private = NULL; -+ ivisurf->surface = NULL; -+ -+ // destroy weston_surface destroy signal. -+ wl_list_remove(&ivisurf->surface_destroy_listener.link); -+} -+ -+/* -+ * The ivi_surface wl_resource destructor. -+ * -+ * Gets called via ivi_surface.destroy request or automatic wl_client clean-up. -+ */ -+static void -+shell_destroy_shell_surface(struct wl_resource *resource) -+{ -+ struct ivi_shell_surface *ivisurf = wl_resource_get_user_data(resource); -+ -+ if (ivisurf == NULL) -+ return; -+ -+ assert(ivisurf->resource == resource); -+ -+ if (ivisurf->layout_surface != NULL) -+ layout_surface_cleanup(ivisurf); -+ -+ wl_list_remove(&ivisurf->link); -+ -+ free(ivisurf); -+} -+ -+/* Gets called through the weston_surface destroy signal. */ -+static void -+shell_handle_surface_destroy(struct wl_listener *listener, void *data) -+{ -+ struct ivi_shell_surface *ivisurf = -+ container_of(listener, struct ivi_shell_surface, -+ surface_destroy_listener); -+ -+ assert(ivisurf != NULL); -+ -+ if (ivisurf->layout_surface != NULL) -+ layout_surface_cleanup(ivisurf); -+} -+ -+/* Gets called, when a client sends ivi_surface.destroy request. */ -+static void -+surface_destroy(struct wl_client *client, struct wl_resource *resource) -+{ -+ /* -+ * Fires the wl_resource destroy signal, and then calls -+ * ivi_surface wl_resource destructor: shell_destroy_shell_surface() -+ */ -+ wl_resource_destroy(resource); -+} -+ -+static const struct ivi_surface_interface surface_implementation = { -+ surface_destroy, -+}; -+ -+/** -+ * Request handler for ivi_application.surface_create. -+ * -+ * Creates an ivi_surface protocol object associated with the given wl_surface. -+ * ivi_surface protocol object is represented by struct ivi_shell_surface. -+ * -+ * \param client The client. -+ * \param resource The ivi_application protocol object. -+ * \param id_surface The IVI surface ID. -+ * \param surface_resource The wl_surface protocol object. -+ * \param id The protocol object id for the new ivi_surface protocol object. -+ * -+ * The wl_surface is given the ivi_surface role and associated with a unique -+ * IVI ID which is used to identify the surface in a controller -+ * (window manager). -+ */ -+static void -+application_surface_create(struct wl_client *client, -+ struct wl_resource *resource, -+ uint32_t id_surface, -+ struct wl_resource *surface_resource, -+ uint32_t id) -+{ -+ struct ivi_shell *shell = wl_resource_get_user_data(resource); -+ struct ivi_shell_surface *ivisurf; -+ struct ivi_layout_surface *layout_surface; -+ struct weston_surface *weston_surface = -+ wl_resource_get_user_data(surface_resource); -+ struct wl_resource *res; -+ -+ /* check if a surface already has another role */ -+ if (weston_surface->configure) { -+ wl_resource_post_error(weston_surface->resource, -+ WL_DISPLAY_ERROR_INVALID_OBJECT, -+ "surface->configure already " -+ "set"); -+ return; -+ } -+ -+ layout_surface = ivi_layout_surface_create(weston_surface, id_surface); -+ -+ /* check if id_ivi is already used for wl_surface*/ -+ if (layout_surface == NULL) { -+ wl_resource_post_error(resource, -+ IVI_APPLICATION_ERROR_IVI_ID, -+ "surface_id is already assigned " -+ "by another app"); -+ return; -+ } -+ -+ ivisurf = zalloc(sizeof *ivisurf); -+ if (ivisurf == NULL) { -+ wl_resource_post_no_memory(resource); -+ return; -+ } -+ -+ wl_list_init(&ivisurf->link); -+ wl_list_insert(&shell->ivi_surface_list, &ivisurf->link); -+ -+ ivisurf->shell = shell; -+ ivisurf->id_surface = id_surface; -+ -+ ivisurf->width = 0; -+ ivisurf->height = 0; -+ ivisurf->layout_surface = layout_surface; -+ ivisurf->configured_listener.notify = surface_configure_notify; -+ ivi_layout_surface_add_configured_listener(layout_surface, -+ &ivisurf->configured_listener); -+ /* -+ * The following code relies on wl_surface destruction triggering -+ * immediateweston_surface destruction -+ */ -+ ivisurf->surface_destroy_listener.notify = shell_handle_surface_destroy; -+ wl_signal_add(&weston_surface->destroy_signal, -+ &ivisurf->surface_destroy_listener); -+ -+ ivisurf->surface = weston_surface; -+ -+ weston_surface->configure = ivi_shell_surface_configure; -+ weston_surface->configure_private = ivisurf; -+ -+ res = wl_resource_create(client, &ivi_surface_interface, 1, id); -+ if (res == NULL) { -+ wl_client_post_no_memory(client); -+ return; -+ } -+ -+ ivisurf->resource = res; -+ -+ wl_resource_set_implementation(res, &surface_implementation, -+ ivisurf, shell_destroy_shell_surface); -+} -+ -+static const struct ivi_application_interface application_implementation = { -+ application_surface_create -+}; -+ -+/* -+ * Handle wl_registry.bind of ivi_application global singleton. -+ */ -+static void -+bind_ivi_application(struct wl_client *client, -+ void *data, uint32_t version, uint32_t id) -+{ -+ struct ivi_shell *shell = data; -+ struct wl_resource *resource; -+ -+ resource = wl_resource_create(client, &ivi_application_interface, -+ 1, id); -+ -+ wl_resource_set_implementation(resource, -+ &application_implementation, -+ shell, NULL); -+} -+ -+struct weston_view * -+get_default_view(struct weston_surface *surface) -+{ -+ struct ivi_shell_surface *shsurf; -+ struct weston_view *view; -+ -+ if (!surface || wl_list_empty(&surface->views)) -+ return NULL; -+ -+ shsurf = get_ivi_shell_surface(surface); -+ if (shsurf && shsurf->layout_surface) { -+ view = ivi_layout_get_weston_view(shsurf->layout_surface); -+ if (view) -+ return view; -+ } -+ -+ wl_list_for_each(view, &surface->views, surface_link) { -+ if (weston_view_is_mapped(view)) -+ return view; -+ } -+ -+ return container_of(surface->views.next, -+ struct weston_view, surface_link); -+} -+ -+/* -+ * Called through the compositor's destroy signal. -+ */ -+static void -+shell_destroy(struct wl_listener *listener, void *data) -+{ -+ struct ivi_shell *shell = -+ container_of(listener, struct ivi_shell, destroy_listener); -+ struct ivi_shell_surface *ivisurf, *next; -+ -+ input_panel_destroy(shell); -+ -+ wl_list_for_each_safe(ivisurf, next, &shell->ivi_surface_list, link) { -+ wl_list_remove(&ivisurf->link); -+ free(ivisurf); -+ } -+ -+ free(shell); -+} -+ -+static void -+terminate_binding(struct weston_seat *seat, uint32_t time, -+ uint32_t key, void *data) -+{ -+ struct weston_compositor *compositor = data; -+ -+ wl_display_terminate(compositor->wl_display); -+} -+ -+static void -+init_ivi_shell(struct weston_compositor *compositor, struct ivi_shell *shell, -+ const struct ivi_shell_setting *setting) -+{ -+ shell->compositor = compositor; -+ -+ wl_list_init(&shell->ivi_surface_list); -+ -+ weston_layer_init(&shell->input_panel_layer, NULL); -+ -+ if (setting->developermode) { -+#if 0 -+ weston_install_debug_key_binding(compositor, MODIFIER_SUPER); -+#endif -+ -+ weston_compositor_add_key_binding(compositor, KEY_BACKSPACE, -+ MODIFIER_CTRL | MODIFIER_ALT, -+ terminate_binding, -+ compositor); -+ } -+} -+ -+static int -+ivi_shell_setting_create(struct ivi_shell_setting *dest, -+ struct weston_compositor *compositor, -+ int *argc, char *argv[]) -+{ -+ int result = 0; -+ struct weston_config *config = compositor->config; -+ struct weston_config_section *section; -+ -+ const struct weston_option ivi_shell_options[] = { -+ { WESTON_OPTION_STRING, "ivi-module", 0, &dest->ivi_module }, -+ }; -+ -+ parse_options(ivi_shell_options, ARRAY_LENGTH(ivi_shell_options), -+ argc, argv); -+ -+ section = weston_config_get_section(config, "ivi-shell", NULL, NULL); -+ -+ if (!dest->ivi_module && -+ weston_config_section_get_string(section, "ivi-module", -+ &dest->ivi_module, NULL) < 0) { -+ weston_log("Error: ivi-shell: No ivi-module set\n"); -+ result = -1; -+ } -+ -+ weston_config_section_get_bool(section, "developermode", -+ &dest->developermode, 0); -+ -+ return result; -+} -+ -+/* -+ * Initialization of ivi-shell. -+ */ -+WL_EXPORT int -+module_init(struct weston_compositor *compositor, -+ int *argc, char *argv[]) -+{ -+ struct ivi_shell *shell; -+ struct ivi_shell_setting setting = { }; -+ int retval = -1; -+ -+ shell = zalloc(sizeof *shell); -+ if (shell == NULL) -+ return -1; -+ -+ if (ivi_shell_setting_create(&setting, compositor, argc, argv) != 0) -+ return -1; -+ -+ init_ivi_shell(compositor, shell, &setting); -+ -+ shell->destroy_listener.notify = shell_destroy; -+ wl_signal_add(&compositor->destroy_signal, &shell->destroy_listener); -+ -+ if (input_panel_setup(shell) < 0) -+ goto out_settings; -+ -+ text_backend_init(compositor); -+ -+ if (wl_global_create(compositor->wl_display, -+ &ivi_application_interface, 1, -+ shell, bind_ivi_application) == NULL) -+ goto out_settings; -+ -+ ivi_layout_init_with_compositor(compositor); -+ -+ /* Call module_init of ivi-modules which are defined in weston.ini */ -+ if (load_controller_modules(compositor, setting.ivi_module, -+ argc, argv) < 0) -+ goto out_settings; -+ -+ retval = 0; -+ -+out_settings: -+ free(setting.ivi_module); -+ -+ return retval; -+} -diff --git a/ivi-shell/ivi-shell.h b/ivi-shell/ivi-shell.h -new file mode 100644 -index 0000000..9a05eb2 ---- /dev/null -+++ b/ivi-shell/ivi-shell.h -@@ -0,0 +1,67 @@ -+/* -+ * Copyright (C) 2013 DENSO CORPORATION -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining -+ * a copy of this software and associated documentation files (the -+ * "Software"), to deal in the Software without restriction, including -+ * without limitation the rights to use, copy, modify, merge, publish, -+ * distribute, sublicense, and/or sell copies of the Software, and to -+ * permit persons to whom the Software is furnished to do so, subject to -+ * the following conditions: -+ * -+ * The above copyright notice and this permission notice (including the -+ * next paragraph) shall be included in all copies or substantial -+ * portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -+ * SOFTWARE. -+ */ -+ -+#include -+ -+#include "compositor.h" -+ -+struct ivi_shell -+{ -+ struct wl_listener destroy_listener; -+ -+ struct weston_compositor *compositor; -+ -+ struct wl_list ivi_surface_list; /* struct ivi_shell_surface::link */ -+ -+ struct text_backend *text_backend; -+ -+ struct wl_listener show_input_panel_listener; -+ struct wl_listener hide_input_panel_listener; -+ struct wl_listener update_input_panel_listener; -+ -+ struct weston_layer input_panel_layer; -+ -+ bool locked; -+ bool showing_input_panels; -+ -+ struct { -+ struct weston_surface *surface; -+ pixman_box32_t cursor_rectangle; -+ } text_input; -+ -+ struct { -+ struct wl_resource *binding; -+ struct wl_list surfaces; -+ } input_panel; -+}; -+ -+struct weston_view * -+get_default_view(struct weston_surface *surface); -+ -+int -+input_panel_setup(struct ivi_shell *shell); -+ -+void -+input_panel_destroy(struct ivi_shell *shell); -diff --git a/ivi-shell/weston.ini.in b/ivi-shell/weston.ini.in -new file mode 100644 -index 0000000..6c22633 ---- /dev/null -+++ b/ivi-shell/weston.ini.in -@@ -0,0 +1,98 @@ -+[core] -+shell=@plugin_prefix@ivi-shell.so -+ -+[ivi-shell] -+ivi-module=@plugin_prefix@hmi-controller.so -+ivi-shell-user-interface=@abs_top_builddir@/weston-ivi-shell-user-interface -+ -+#developermode=true -+ -+cursor-theme=default -+cursor-size=32 -+ -+base-layer-id=1000 -+workspace-background-layer-id=2000 -+workspace-layer-id=3000 -+application-layer-id=4000 -+ -+transition-duration=300 -+ -+background-image=@abs_top_srcdir@/data/background.png -+background-id=1001 -+panel-image=@abs_top_srcdir@/data/panel.png -+panel-id=1002 -+tiling-image=@abs_top_srcdir@/data/tiling.png -+tiling-id=1003 -+sidebyside-image=@abs_top_srcdir@/data/sidebyside.png -+sidebyside-id=1004 -+fullscreen-image=@abs_top_srcdir@/data/fullscreen.png -+fullscreen-id=1005 -+random-image=@abs_top_srcdir@/data/random.png -+random-id=1006 -+home-image=@abs_top_srcdir@/data/home.png -+home-id=1007 -+workspace-background-color=0x99000000 -+workspace-background-id=2001 -+ -+[input-method] -+path=@libexecdir@/weston-keyboard -+ -+[ivi-launcher] -+workspace-id=0 -+icon-id=4001 -+icon=@abs_top_srcdir@/data/icon_ivi_flower.png -+path=@abs_top_builddir@/weston-flower -+ -+[ivi-launcher] -+workspace-id=0 -+icon-id=4002 -+icon=@abs_top_srcdir@/data/icon_ivi_clickdot.png -+path=@abs_top_builddir@/weston-clickdot -+ -+[ivi-launcher] -+workspace-id=1 -+icon-id=4003 -+icon=@abs_top_srcdir@/data/icon_ivi_simple-egl.png -+path=@abs_top_builddir@/weston-simple-egl -+ -+[ivi-launcher] -+workspace-id=1 -+icon-id=4004 -+icon=@abs_top_srcdir@/data/icon_ivi_simple-shm.png -+path=@abs_top_builddir@/weston-simple-shm -+ -+[ivi-launcher] -+workspace-id=2 -+icon-id=4005 -+icon=@abs_top_srcdir@/data/icon_ivi_smoke.png -+path=@abs_top_builddir@/weston-smoke -+ -+[ivi-launcher] -+workspace-id=3 -+icon-id=4006 -+icon=@abs_top_srcdir@/data/icon_ivi_flower.png -+path=@abs_top_builddir@/weston-flower -+ -+[ivi-launcher] -+workspace-id=3 -+icon-id=4007 -+icon=@abs_top_srcdir@/data/icon_ivi_clickdot.png -+path=@abs_top_builddir@/weston-clickdot -+ -+[ivi-launcher] -+workspace-id=3 -+icon-id=4008 -+icon=@abs_top_srcdir@/data/icon_ivi_simple-egl.png -+path=@abs_top_builddir@/weston-simple-egl -+ -+[ivi-launcher] -+workspace-id=3 -+icon-id=4009 -+icon=@abs_top_srcdir@/data/icon_ivi_simple-shm.png -+path=@abs_top_builddir@/weston-simple-shm -+ -+[ivi-launcher] -+workspace-id=3 -+icon-id=4010 -+icon=@abs_top_srcdir@/data/icon_ivi_smoke.png -+path=@abs_top_builddir@/weston-smoke -diff --git a/protocol/ivi-application.xml b/protocol/ivi-application.xml -new file mode 100644 -index 0000000..8f24226 ---- /dev/null -+++ b/protocol/ivi-application.xml -@@ -0,0 +1,100 @@ -+ -+ -+ -+ -+ Copyright (C) 2013 DENSO CORPORATION -+ Copyright (c) 2013 BMW Car IT GmbH -+ -+ Permission is hereby granted, free of charge, to any person obtaining a -+ copy of this software and associated documentation files (the "Software"), -+ to deal in the Software without restriction, including without limitation -+ the rights to use, copy, modify, merge, publish, distribute, sublicense, -+ and/or sell copies of the Software, and to permit persons to whom the -+ Software is furnished to do so, subject to the following conditions: -+ -+ The above copyright notice and this permission notice (including the next -+ paragraph) shall be included in all copies or substantial portions of the -+ Software. -+ -+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -+ DEALINGS IN THE SOFTWARE. -+ -+ -+ -+ -+ -+ -+ -+ This removes link from ivi_id to wl_surface and destroys ivi_surface. -+ The ID, ivi_id, is free and can be used for surface_create again. -+ -+ -+ -+ -+ -+ The configure event asks the client to resize its surface. -+ -+ The size is a hint, in the sense that the client is free to -+ ignore it if it doesn't resize, pick a smaller size (to -+ satisfy aspect ratio or resize in steps of NxM pixels). -+ -+ The client is free to dismiss all but the last configure -+ event it received. -+ -+ The width and height arguments specify the size of the window -+ in surface local coordinates. -+ -+ -+ -+ -+ -+ -+ -+ -+ This interface is exposed as a global singleton. -+ This interface is implemented by servers that provide IVI-style user interfaces. -+ It allows clients to associate a ivi_surface with wl_surface. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ This request gives the wl_surface the role of an IVI Surface. Creating more than -+ one ivi_surface for a wl_surface is not allowed. Note, that this still allows the -+ following example: -+ -+ 1. create a wl_surface -+ 2. create ivi_surface for the wl_surface -+ 3. destroy the ivi_surface -+ 4. create ivi_surface for the wl_surface (with the same or another ivi_id as before) -+ -+ surface_create will create a interface:ivi_surface with numeric ID; ivi_id in -+ ivi compositor. These ivi_ids are defined as unique in the system to identify -+ it inside of ivi compositor. The ivi compositor implements business logic how to -+ set properties of the surface with ivi_id according to status of the system. -+ E.g. a unique ID for Car Navigation application is used for implementing special -+ logic of the application about where it shall be located. -+ The server regards following cases as protocol errors and disconnects the client. -+ - wl_surface already has an nother role. -+ - ivi_id is already assigned to an another wl_surface. -+ -+ If client destroys ivi_surface or wl_surface which is assigne to the ivi_surface, -+ ivi_id which is assigned to the ivi_surface is free for reuse. -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/protocol/ivi-hmi-controller.xml b/protocol/ivi-hmi-controller.xml -new file mode 100644 -index 0000000..826763c ---- /dev/null -+++ b/protocol/ivi-hmi-controller.xml -@@ -0,0 +1,98 @@ -+ -+ -+ -+ -+ Copyright (C) 2013 DENSO CORPORATION -+ Copyright (c) 2013 BMW Car IT GmbH -+ -+ Permission is hereby granted, free of charge, to any person obtaining a -+ copy of this software and associated documentation files (the "Software"), -+ to deal in the Software without restriction, including without limitation -+ the rights to use, copy, modify, merge, publish, distribute, sublicense, -+ and/or sell copies of the Software, and to permit persons to whom the -+ Software is furnished to do so, subject to the following conditions: -+ -+ The above copyright notice and this permission notice (including the next -+ paragraph) shall be included in all copies or substantial portions of the -+ Software. -+ -+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -+ DEALINGS IN THE SOFTWARE. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Reference protocol to control a surface by server. -+ To control a surface by server, it gives seat to the server -+ to e.g. control Home screen. Home screen has several workspaces -+ to group launchers of wayland application. These workspaces -+ are drawn on a horizontally long surface to be controlled -+ by motion of input device. E.g. A motion from right to left -+ happens, the viewport of surface is controlled in the ivi-shell -+ by using ivi-layout. client can recognizes the end of controlling -+ by event "workspace_end_control". -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ hmi-controller loaded to ivi-shall implements 4 types of layout -+ as a reference; tiling, side by side, full_screen, and random. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ home screen is a reference implementation of launcher to launch -+ wayland applications. The home screen has several workspaces to -+ group wayland applications. By defining the following keys in -+ weston.ini, user can add launcher icon to launch a wayland application -+ to a workspace. -+ [ivi-launcher] -+ workspace-id=0 -+ : id of workspace to add a launcher -+ icon-id=4001 -+ : ivi id of ivi_surface to draw a icon -+ icon=/home/user/review/build-ivi-shell/data/icon_ivi_flower.png -+ : path to icon image -+ path=/home/user/review/build-ivi-shell/weston-dnd -+ : path to wayland application -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/shared/helpers.h b/shared/helpers.h -new file mode 100644 -index 0000000..1d1e458 ---- /dev/null -+++ b/shared/helpers.h -@@ -0,0 +1,96 @@ -+/* -+ * Copyright © 2015 Samsung Electronics Co., Ltd -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining -+ * a copy of this software and associated documentation files (the -+ * "Software"), to deal in the Software without restriction, including -+ * without limitation the rights to use, copy, modify, merge, publish, -+ * distribute, sublicense, and/or sell copies of the Software, and to -+ * permit persons to whom the Software is furnished to do so, subject to -+ * the following conditions: -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -+ * SOFTWARE. -+ */ -+ -+#ifndef WESTON_HELPERS_H -+#define WESTON_HELPERS_H -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+/** -+ * @file -+ * Simple misc helper macros. -+ */ -+ -+/** -+ * Compile-time computation of number of items in a hardcoded array. -+ * -+ * @param a the array being measured. -+ * @return the number of items hardcoded into the array. -+ */ -+#ifndef ARRAY_LENGTH -+#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0]) -+#endif -+ -+/** -+ * Returns the smaller of two values. -+ * -+ * @param x the first item to compare. -+ * @param y the second item to compare. -+ * @return the value that evaluates to lesser than the other. -+ */ -+#ifndef MIN -+#define MIN(x,y) (((x) < (y)) ? (x) : (y)) -+#endif -+ -+/** -+ * Returns a pointer the the containing struct of a given member item. -+ * -+ * To demonstrate, the following example retrieves a pointer to -+ * `example_container` given only its `destroy_listener` member: -+ * -+ * @code -+ * struct example_container { -+ * struct wl_listener destroy_listener; -+ * // other members... -+ * }; -+ * -+ * void example_container_destroy(struct wl_listener *listener, void *data) -+ * { -+ * struct example_container *ctr; -+ * -+ * ctr = wl_container_of(listener, ctr, destroy_listener); -+ * // destroy ctr... -+ * } -+ * @endcode -+ * -+ * @param ptr A valid pointer to the contained item. -+ * -+ * @param type A pointer to the type of content that the list item -+ * stores. Type does not need be a valid pointer; a null or -+ * an uninitialised pointer will suffice. -+ * -+ * @param member The named location of ptr within the sample type. -+ * -+ * @return The container for the specified pointer. -+ */ -+#ifndef container_of -+#define container_of(ptr, type, member) ({ \ -+ const __typeof__( ((type *)0)->member ) *__mptr = (ptr); \ -+ (type *)( (char *)__mptr - offsetof(type,member) );}) -+#endif -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* WESTON_HELPERS_H */ -diff --git a/src/compositor.c b/src/compositor.c -index 574db2d..e9c46a4 100644 ---- a/src/compositor.c -+++ b/src/compositor.c -@@ -2503,6 +2503,54 @@ weston_surface_get_main_surface(struct weston_surface *surface) - return surface; - } - -+/** Get the size of surface contents */ -+WL_EXPORT void -+weston_surface_get_content_size(struct weston_surface *surface, -+ int *width, int *height) -+{ -+ struct weston_renderer *rer = surface->compositor->renderer; -+ -+ if (!rer->surface_get_content_size) { -+ *width = 0; -+ *height = 0; -+ return; -+ } -+ -+ rer->surface_get_content_size(surface, width, height); -+} -+ -+/** Copy surface contents to system memory */ -+WL_EXPORT int -+weston_surface_copy_content(struct weston_surface *surface, -+ void *target, size_t size, -+ int src_x, int src_y, -+ int width, int height) -+{ -+ struct weston_renderer *rer = surface->compositor->renderer; -+ int cw, ch; -+ const size_t bytespp = 4; /* PIXMAN_a8b8g8r8 */ -+ -+ if (!rer->surface_copy_content) -+ return -1; -+ -+ weston_surface_get_content_size(surface, &cw, &ch); -+ -+ if (src_x < 0 || src_y < 0) -+ return -1; -+ -+ if (width <= 0 || height <= 0) -+ return -1; -+ -+ if (src_x + width > cw || src_y + height > ch) -+ return -1; -+ -+ if (width * bytespp * height > size) -+ return -1; -+ -+ return rer->surface_copy_content(surface, target, size, -+ src_x, src_y, width, height); -+} -+ - static void - subsurface_set_position(struct wl_client *client, - struct wl_resource *resource, int32_t x, int32_t y) -diff --git a/src/compositor.h b/src/compositor.h -index 057f8be..2a8da6b 100644 ---- a/src/compositor.h -+++ b/src/compositor.h -@@ -552,6 +552,16 @@ struct weston_renderer { - float red, float green, - float blue, float alpha); - void (*destroy)(struct weston_compositor *ec); -+ -+ /** See weston_surface_get_content_size() */ -+ void (*surface_get_content_size)(struct weston_surface *surface, -+ int *width, int *height); -+ -+ /** See weston_surface__copy_content() */ -+ int (*surface_copy_content)(struct weston_surface *surface, -+ void *target, size_t size, -+ int src_x, int src_y, -+ int width, int height); - }; - - enum weston_capability { -@@ -1205,6 +1215,16 @@ weston_surface_unmap(struct weston_surface *surface); - struct weston_surface * - weston_surface_get_main_surface(struct weston_surface *surface); - -+void -+weston_surface_get_content_size(struct weston_surface *surface, -+ int *width, int *height); -+ -+int -+weston_surface_copy_content(struct weston_surface *surface, -+ void *target, size_t size, -+ int src_x, int src_y, -+ int width, int height); -+ - struct weston_buffer * - weston_buffer_from_resource(struct wl_resource *resource); - -diff --git a/src/gl-renderer.c b/src/gl-renderer.c -index 63af75d..55b612c 100644 ---- a/src/gl-renderer.c -+++ b/src/gl-renderer.c -@@ -77,6 +77,7 @@ struct gl_output_state { - - enum buffer_type { - BUFFER_TYPE_NULL, -+ BUFFER_TYPE_SOLID, /* internal solid color surfaces without a buffer */ - BUFFER_TYPE_SHM, - BUFFER_TYPE_EGL - }; -@@ -1297,11 +1298,157 @@ gl_renderer_surface_set_color(struct weston_surface *surface, - gs->color[1] = green; - gs->color[2] = blue; - gs->color[3] = alpha; -+ gs->buffer_type = BUFFER_TYPE_SOLID; - - gs->shader = &gr->solid_shader; - } - - static void -+gl_renderer_surface_get_content_size(struct weston_surface *surface, -+ int *width, int *height) -+{ -+ struct gl_surface_state *gs = get_surface_state(surface); -+ -+ if (gs->buffer_type == BUFFER_TYPE_NULL) { -+ *width = 0; -+ *height = 0; -+ } else { -+ *width = gs->pitch; -+ *height = gs->height; -+ } -+} -+ -+static uint32_t -+pack_color(pixman_format_code_t format, float *c) -+{ -+ uint8_t r = round(c[0] * 255.0f); -+ uint8_t g = round(c[1] * 255.0f); -+ uint8_t b = round(c[2] * 255.0f); -+ uint8_t a = round(c[3] * 255.0f); -+ -+ switch (format) { -+ case PIXMAN_a8b8g8r8: -+ return (a << 24) | (b << 16) | (g << 8) | r; -+ default: -+ assert(0); -+ return 0; -+ } -+} -+ -+static int -+gl_renderer_surface_copy_content(struct weston_surface *surface, -+ void *target, size_t size, -+ int src_x, int src_y, -+ int width, int height) -+{ -+ static const GLfloat verts[4 * 2] = { -+ 0.0f, 0.0f, -+ 1.0f, 0.0f, -+ 1.0f, 1.0f, -+ 0.0f, 1.0f -+ }; -+ static const GLfloat projmat_normal[16] = { /* transpose */ -+ 2.0f, 0.0f, 0.0f, 0.0f, -+ 0.0f, 2.0f, 0.0f, 0.0f, -+ 0.0f, 0.0f, 1.0f, 0.0f, -+ -1.0f, -1.0f, 0.0f, 1.0f -+ }; -+ static const GLfloat projmat_yinvert[16] = { /* transpose */ -+ 2.0f, 0.0f, 0.0f, 0.0f, -+ 0.0f, -2.0f, 0.0f, 0.0f, -+ 0.0f, 0.0f, 1.0f, 0.0f, -+ -1.0f, 1.0f, 0.0f, 1.0f -+ }; -+ const pixman_format_code_t format = PIXMAN_a8b8g8r8; -+ const size_t bytespp = 4; /* PIXMAN_a8b8g8r8 */ -+ const GLenum gl_format = GL_RGBA; /* PIXMAN_a8b8g8r8 little-endian */ -+ struct gl_renderer *gr = get_renderer(surface->compositor); -+ struct gl_surface_state *gs = get_surface_state(surface); -+ int cw, ch; -+ GLuint fbo; -+ GLuint tex; -+ GLenum status; -+ const GLfloat *proj; -+ int i; -+ -+ gl_renderer_surface_get_content_size(surface, &cw, &ch); -+ -+ switch (gs->buffer_type) { -+ case BUFFER_TYPE_NULL: -+ return -1; -+ case BUFFER_TYPE_SOLID: -+ *(uint32_t *)target = pack_color(format, gs->color); -+ return 0; -+ case BUFFER_TYPE_SHM: -+ gl_renderer_flush_damage(surface); -+ /* fall through */ -+ case BUFFER_TYPE_EGL: -+ break; -+ } -+ -+ glGenTextures(1, &tex); -+ glBindTexture(GL_TEXTURE_2D, tex); -+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, cw, ch, -+ 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); -+ glBindTexture(GL_TEXTURE_2D, 0); -+ -+ glGenFramebuffers(1, &fbo); -+ glBindFramebuffer(GL_FRAMEBUFFER, fbo); -+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, -+ GL_TEXTURE_2D, tex, 0); -+ -+ status = glCheckFramebufferStatus(GL_FRAMEBUFFER); -+ if (status != GL_FRAMEBUFFER_COMPLETE) { -+ weston_log("%s: fbo error: %#x\n", __func__, status); -+ glDeleteFramebuffers(1, &fbo); -+ glDeleteTextures(1, &tex); -+ return -1; -+ } -+ -+ glViewport(0, 0, cw, ch); -+ glDisable(GL_BLEND); -+ use_shader(gr, gs->shader); -+ if (gs->y_inverted) -+ proj = projmat_normal; -+ else -+ proj = projmat_yinvert; -+ -+ glUniformMatrix4fv(gs->shader->proj_uniform, 1, GL_FALSE, proj); -+ glUniform1f(gs->shader->alpha_uniform, 1.0f); -+ -+ for (i = 0; i < gs->num_textures; i++) { -+ glUniform1i(gs->shader->tex_uniforms[i], i); -+ -+ glActiveTexture(GL_TEXTURE0 + i); -+ glBindTexture(gs->target, gs->textures[i]); -+ glTexParameteri(gs->target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); -+ glTexParameteri(gs->target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); -+ } -+ -+ /* position: */ -+ glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, verts); -+ glEnableVertexAttribArray(0); -+ -+ /* texcoord: */ -+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, verts); -+ glEnableVertexAttribArray(1); -+ -+ glDrawArrays(GL_TRIANGLE_FAN, 0, 4); -+ -+ glDisableVertexAttribArray(1); -+ glDisableVertexAttribArray(0); -+ -+ glPixelStorei(GL_PACK_ALIGNMENT, bytespp); -+ glReadPixels(src_x, src_y, width, height, gl_format, -+ GL_UNSIGNED_BYTE, target); -+ -+ glDeleteFramebuffers(1, &fbo); -+ glDeleteTextures(1, &tex); -+ -+ return 0; -+} -+ -+static void - surface_state_destroy(struct gl_surface_state *gs, struct gl_renderer *gr) - { - int i; -@@ -1932,6 +2079,9 @@ gl_renderer_create(struct weston_compositor *ec, EGLNativeDisplayType display, - gr->base.attach = gl_renderer_attach; - gr->base.surface_set_color = gl_renderer_surface_set_color; - gr->base.destroy = gl_renderer_destroy; -+ gr->base.surface_get_content_size = -+ gl_renderer_surface_get_content_size; -+ gr->base.surface_copy_content = gl_renderer_surface_copy_content; - - gr->egl_display = eglGetDisplay(display); - if (gr->egl_display == EGL_NO_DISPLAY) { -diff --git a/src/pixman-renderer.c b/src/pixman-renderer.c -index 93be968..c9d5038 100644 ---- a/src/pixman-renderer.c -+++ b/src/pixman-renderer.c -@@ -674,6 +674,53 @@ pixman_renderer_destroy(struct weston_compositor *ec) - } - - static void -+pixman_renderer_surface_get_content_size(struct weston_surface *surface, -+ int *width, int *height) -+{ -+ struct pixman_surface_state *ps = get_surface_state(surface); -+ -+ if (ps->image) { -+ *width = pixman_image_get_width(ps->image); -+ *height = pixman_image_get_height(ps->image); -+ } else { -+ *width = 0; -+ *height = 0; -+ } -+} -+ -+static int -+pixman_renderer_surface_copy_content(struct weston_surface *surface, -+ void *target, size_t size, -+ int src_x, int src_y, -+ int width, int height) -+{ -+ const pixman_format_code_t format = PIXMAN_a8b8g8r8; -+ const size_t bytespp = 4; /* PIXMAN_a8b8g8r8 */ -+ struct pixman_surface_state *ps = get_surface_state(surface); -+ pixman_image_t *out_buf; -+ -+ if (!ps->image) -+ return -1; -+ -+ out_buf = pixman_image_create_bits(format, width, height, -+ target, width * bytespp); -+ -+ pixman_image_set_transform(ps->image, NULL); -+ pixman_image_composite32(PIXMAN_OP_SRC, -+ ps->image, /* src */ -+ NULL, /* mask */ -+ out_buf, /* dest */ -+ src_x, src_y, /* src_x, src_y */ -+ 0, 0, /* mask_x, mask_y */ -+ 0, 0, /* dest_x, dest_y */ -+ width, height); -+ -+ pixman_image_unref(out_buf); -+ -+ return 0; -+} -+ -+static void - debug_binding(struct weston_seat *seat, uint32_t time, uint32_t key, - void *data) - { -@@ -711,6 +758,10 @@ pixman_renderer_init(struct weston_compositor *ec) - renderer->base.attach = pixman_renderer_attach; - renderer->base.surface_set_color = pixman_renderer_surface_set_color; - renderer->base.destroy = pixman_renderer_destroy; -+ renderer->base.surface_get_content_size = -+ pixman_renderer_surface_get_content_size; -+ renderer->base.surface_copy_content = -+ pixman_renderer_surface_copy_content; - ec->renderer = &renderer->base; - ec->capabilities |= WESTON_CAP_ROTATION_ANY; - ec->capabilities |= WESTON_CAP_CAPTURE_YFLIP; --- -1.8.3.1 - diff --git a/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/0001-IVI-Shell-Backport-from-Weston-1.9.0-to-1.8.0.patch b/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/0001-IVI-Shell-Backport-from-Weston-1.9.0-to-1.8.0.patch new file mode 100644 index 000000000..33476a8f3 --- /dev/null +++ b/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/0001-IVI-Shell-Backport-from-Weston-1.9.0-to-1.8.0.patch @@ -0,0 +1,2392 @@ +From fb20221f0c0068a4a75fe62f2873d9d3c5566e73 Mon Sep 17 00:00:00 2001 +From: Manuel Bachmann +Date: Wed, 13 Jan 2016 18:42:26 +0100 +Subject: [PATCH] [PATCH] Backport IVI-Shell from Weston 1.9.0 to 1.8.0 + +IVI-Shell is the alternative Weston shell implementing the +eponymous protocol, and supported in client toolkits such +as EFL, Qt... + +We backport only what is necessary, without modifying core +compositor code. + +Signed-off-by: Manuel Bachmann +--- + ivi-shell/hmi-controller.c | 140 +++--- + ivi-shell/input-panel-ivi.c | 41 +- + ivi-shell/ivi-layout-export.h | 58 ++- + ivi-shell/ivi-layout-private.h | 47 +- + ivi-shell/ivi-layout-transition.c | 39 +- + ivi-shell/ivi-layout.c | 983 +++++++++++++++++++------------------- + ivi-shell/ivi-shell.c | 91 ++-- + ivi-shell/ivi-shell.h | 37 +- + 8 files changed, 758 insertions(+), 678 deletions(-) + +diff --git a/ivi-shell/hmi-controller.c b/ivi-shell/hmi-controller.c +index 88e9333..2f18217 100644 +--- a/ivi-shell/hmi-controller.c ++++ b/ivi-shell/hmi-controller.c +@@ -1,23 +1,26 @@ + /* + * Copyright (C) 2014 DENSO CORPORATION + * +- * Permission to use, copy, modify, distribute, and sell this software and +- * its documentation for any purpose is hereby granted without fee, provided +- * that the above copyright notice appear in all copies and that both that +- * copyright notice and this permission notice appear in supporting +- * documentation, and that the name of the copyright holders not be used in +- * advertising or publicity pertaining to distribution of the software +- * without specific, written prior permission. The copyright holders make +- * no representations about the suitability of this software for any +- * purpose. It is provided "as is" without express or implied warranty. ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * "Software"), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sublicense, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: + * +- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS +- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY +- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +- * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ * The above copyright notice and this permission notice (including the ++ * next paragraph) shall be included in all copies or substantial ++ * portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS ++ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ++ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ++ * SOFTWARE. + */ + + /** +@@ -721,27 +724,9 @@ hmi_controller_create(struct weston_compositor *ec) + ivi_controller_interface->layer_set_visibility( + hmi_ctrl->workspace_background_layer.ivilayer, false); + +- /* init workspace ivi_layer */ +- hmi_ctrl->workspace_layer.x = hmi_ctrl->workspace_background_layer.x; +- hmi_ctrl->workspace_layer.y = hmi_ctrl->workspace_background_layer.y; +- hmi_ctrl->workspace_layer.width = +- hmi_ctrl->workspace_background_layer.width; +- hmi_ctrl->workspace_layer.height = +- hmi_ctrl->workspace_background_layer.height; +- hmi_ctrl->workspace_layer.id_layer = +- hmi_ctrl->hmi_setting->workspace_layer_id; +- +- create_layer(iviscrn, &hmi_ctrl->workspace_layer); +- ivi_controller_interface->layer_set_opacity(hmi_ctrl->workspace_layer.ivilayer, 0); +- ivi_controller_interface->layer_set_visibility(hmi_ctrl->workspace_layer.ivilayer, +- false); + + wl_list_init(&hmi_ctrl->workspace_fade.layer_list); + tmp_link_layer = MEM_ALLOC(sizeof(*tmp_link_layer)); +- tmp_link_layer->layout_layer = hmi_ctrl->workspace_layer.ivilayer; +- wl_list_insert(&hmi_ctrl->workspace_fade.layer_list, +- &tmp_link_layer->link); +- tmp_link_layer = MEM_ALLOC(sizeof(*tmp_link_layer)); + tmp_link_layer->layout_layer = + hmi_ctrl->workspace_background_layer.ivilayer; + wl_list_insert(&hmi_ctrl->workspace_fade.layer_list, +@@ -976,12 +961,11 @@ static void + ivi_hmi_controller_add_launchers(struct hmi_controller *hmi_ctrl, + int32_t icon_size) + { +- struct ivi_layout_layer *layer = hmi_ctrl->workspace_layer.ivilayer; + int32_t minspace_x = 10; + int32_t minspace_y = minspace_x; + +- int32_t width = hmi_ctrl->workspace_layer.width; +- int32_t height = hmi_ctrl->workspace_layer.height; ++ int32_t width = hmi_ctrl->workspace_background_layer.width; ++ int32_t height = hmi_ctrl->workspace_background_layer.height; + + int32_t x_count = (width - minspace_x) / (minspace_x + icon_size); + int32_t space_x = (int32_t)((width - x_count * icon_size) / (1.0 + x_count)); +@@ -1011,6 +995,11 @@ ivi_hmi_controller_add_launchers(struct hmi_controller *hmi_ctrl, + struct ivi_layout_surface* layout_surface = NULL; + uint32_t *add_surface_id = NULL; + ++ struct ivi_layout_screen *iviscrn = NULL; ++ struct link_layer *tmp_link_layer = NULL; ++ struct ivi_layout_screen **pp_screen = NULL; ++ int32_t screen_length = 0; ++ + if (0 == x_count) + x_count = 1; + +@@ -1087,16 +1076,10 @@ ivi_hmi_controller_add_launchers(struct hmi_controller *hmi_ctrl, + ivi_controller_interface->get_surface_from_id(data->surface_id); + assert(layout_surface); + +- ret = ivi_controller_interface->layer_add_surface(layer, layout_surface); +- assert(!ret); +- + ret = ivi_controller_interface->surface_set_destination_rectangle( + layout_surface, x, y, icon_size, icon_size); + assert(!ret); + +- ret = ivi_controller_interface->surface_set_visibility(layout_surface, true); +- assert(!ret); +- + nx++; + + if (x_count == nx) { +@@ -1105,6 +1088,43 @@ ivi_hmi_controller_add_launchers(struct hmi_controller *hmi_ctrl, + } + } + ++ /* init workspace ivi_layer */ ++ hmi_ctrl->workspace_layer.x = hmi_ctrl->workspace_background_layer.x; ++ hmi_ctrl->workspace_layer.y = hmi_ctrl->workspace_background_layer.y; ++ hmi_ctrl->workspace_layer.width = ++ hmi_ctrl->workspace_background_layer.width * hmi_ctrl->workspace_count; ++ hmi_ctrl->workspace_layer.height = ++ hmi_ctrl->workspace_background_layer.height; ++ hmi_ctrl->workspace_layer.id_layer = ++ hmi_ctrl->hmi_setting->workspace_layer_id; ++ ++ ivi_controller_interface->get_screens(&screen_length, &pp_screen); ++ iviscrn = pp_screen[0]; ++ free(pp_screen); ++ create_layer(iviscrn, &hmi_ctrl->workspace_layer); ++ ivi_controller_interface->layer_set_opacity(hmi_ctrl->workspace_layer.ivilayer, 0); ++ ivi_controller_interface->layer_set_visibility(hmi_ctrl->workspace_layer.ivilayer, ++ false); ++ ++ tmp_link_layer = MEM_ALLOC(sizeof(*tmp_link_layer)); ++ tmp_link_layer->layout_layer = hmi_ctrl->workspace_layer.ivilayer; ++ wl_list_insert(&hmi_ctrl->workspace_fade.layer_list, ++ &tmp_link_layer->link); ++ ++ /* Add surface to layer */ ++ wl_array_for_each(data, &launchers) { ++ layout_surface = ++ ivi_controller_interface->get_surface_from_id(data->surface_id); ++ assert(layout_surface); ++ ++ ret = ivi_controller_interface->layer_add_surface(hmi_ctrl->workspace_layer.ivilayer, ++ layout_surface); ++ assert(!ret); ++ ++ ret = ivi_controller_interface->surface_set_visibility(layout_surface, true); ++ assert(!ret); ++ } ++ + wl_array_release(&launchers); + ivi_controller_interface->commit_changes(); + } +@@ -1266,8 +1286,8 @@ move_workspace_grab_end(struct move_grab *move, struct wl_resource* resource, + duration); + ivi_controller_interface->layer_set_destination_rectangle(layer, + end_pos, pos_y, +- hmi_ctrl->workspace_background_layer.width, +- hmi_ctrl->workspace_background_layer.height); ++ hmi_ctrl->workspace_layer.width, ++ hmi_ctrl->workspace_layer.height); + ivi_controller_interface->commit_changes(); + } + +@@ -1465,15 +1485,18 @@ enum HMI_GRAB_DEVICE { + static enum HMI_GRAB_DEVICE + get_hmi_grab_device(struct weston_seat *seat, uint32_t serial) + { +- if (seat->pointer && +- seat->pointer->focus && +- seat->pointer->button_count && +- seat->pointer->grab_serial == serial) ++ struct weston_pointer *pointer = seat->pointer; ++ struct weston_touch *touch = seat->touch; ++ ++ if (pointer && ++ pointer->focus && ++ pointer->button_count && ++ pointer->grab_serial == serial) + return HMI_GRAB_DEVICE_POINTER; + +- if (seat->touch && +- seat->touch->focus && +- seat->touch->grab_serial == serial) ++ if (touch && ++ touch->focus && ++ touch->grab_serial == serial) + return HMI_GRAB_DEVICE_TOUCH; + + return HMI_GRAB_DEVICE_NONE; +@@ -1564,6 +1587,9 @@ ivi_hmi_controller_workspace_control(struct wl_client *client, + struct pointer_move_grab *pnt_move_grab = NULL; + struct touch_move_grab *tch_move_grab = NULL; + struct weston_seat *seat = NULL; ++ struct weston_pointer *pointer; ++ struct weston_touch *touch; ++ + enum HMI_GRAB_DEVICE device; + + if (hmi_ctrl->workspace_count < 2) +@@ -1582,21 +1608,23 @@ ivi_hmi_controller_workspace_control(struct wl_client *client, + + switch (device) { + case HMI_GRAB_DEVICE_POINTER: +- pnt_move_grab = create_workspace_pointer_move(seat->pointer, ++ pointer = seat->pointer; ++ pnt_move_grab = create_workspace_pointer_move(pointer, + resource); + + pointer_grab_start(&pnt_move_grab->base, layer, + &pointer_move_grab_workspace_interface, +- seat->pointer); ++ pointer); + break; + + case HMI_GRAB_DEVICE_TOUCH: +- tch_move_grab = create_workspace_touch_move(seat->touch, ++ touch = seat->touch; ++ tch_move_grab = create_workspace_touch_move(touch, + resource); + + touch_grab_start(&tch_move_grab->base, layer, + &touch_move_grab_workspace_interface, +- seat->touch); ++ touch); + break; + + default: +diff --git a/ivi-shell/input-panel-ivi.c b/ivi-shell/input-panel-ivi.c +index 6b89177..3eefb68 100644 +--- a/ivi-shell/input-panel-ivi.c ++++ b/ivi-shell/input-panel-ivi.c +@@ -3,23 +3,26 @@ + * Copyright © 2011-2012 Collabora, Ltd. + * Copyright © 2013 Raspberry Pi Foundation + * +- * Permission to use, copy, modify, distribute, and sell this software and +- * its documentation for any purpose is hereby granted without fee, provided +- * that the above copyright notice appear in all copies and that both that +- * copyright notice and this permission notice appear in supporting +- * documentation, and that the name of the copyright holders not be used in +- * advertising or publicity pertaining to distribution of the software +- * without specific, written prior permission. The copyright holders make +- * no representations about the suitability of this software for any +- * purpose. It is provided "as is" without express or implied warranty. ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * "Software"), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sublicense, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: + * +- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS +- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY +- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +- * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ * The above copyright notice and this permission notice (including the ++ * next paragraph) shall be included in all copies or substantial ++ * portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS ++ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ++ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ++ * SOFTWARE. + */ + + #include "config.h" +@@ -66,9 +69,11 @@ show_input_panel_surface(struct input_panel_surface *ipsurf) + float x, y; + + wl_list_for_each(seat, &shell->compositor->seat_list, link) { +- if (!seat->keyboard || !seat->keyboard->focus) ++ struct weston_keyboard *keyboard = seat->keyboard; ++ ++ if (!keyboard || !keyboard->focus) + continue; +- focus = weston_surface_get_main_surface(seat->keyboard->focus); ++ focus = weston_surface_get_main_surface(keyboard->focus); + ipsurf->output = focus->output; + x = ipsurf->output->x + (ipsurf->output->width - ipsurf->surface->width) / 2; + y = ipsurf->output->y + ipsurf->output->height - ipsurf->surface->height; +diff --git a/ivi-shell/ivi-layout-export.h b/ivi-shell/ivi-layout-export.h +index 4b4328c..8a92009 100644 +--- a/ivi-shell/ivi-layout-export.h ++++ b/ivi-shell/ivi-layout-export.h +@@ -1,23 +1,26 @@ + /* + * Copyright (C) 2013 DENSO CORPORATION + * +- * Permission to use, copy, modify, distribute, and sell this software and +- * its documentation for any purpose is hereby granted without fee, provided +- * that the above copyright notice appear in all copies and that both that +- * copyright notice and this permission notice appear in supporting +- * documentation, and that the name of the copyright holders not be used in +- * advertising or publicity pertaining to distribution of the software +- * without specific, written prior permission. The copyright holders make +- * no representations about the suitability of this software for any +- * purpose. It is provided "as is" without express or implied warranty. ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * "Software"), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sublicense, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: + * +- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS +- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY +- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +- * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ * The above copyright notice and this permission notice (including the ++ * next paragraph) shall be included in all copies or substantial ++ * portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS ++ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ++ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ++ * SOFTWARE. + */ + + /** +@@ -467,7 +470,7 @@ struct ivi_controller_interface { + /** + * \brief Removes a ivi_layer which is currently managed by the service + */ +- void (*layer_remove)(struct ivi_layout_layer *ivilayer); ++ void (*layer_destroy)(struct ivi_layout_layer *ivilayer); + + /** + * \brief Get all ivi_layers which are currently registered and managed +@@ -780,6 +783,27 @@ struct ivi_controller_interface { + int32_t x, int32_t y, + int32_t width, int32_t height); + ++ /** ++ * remove notification by callback on property changes of ivi_surface ++ */ ++ void (*surface_remove_notification_by_callback)(struct ivi_layout_surface *ivisurf, ++ surface_property_notification_func callback, ++ void *userdata); ++ ++ /** ++ * \brief remove notification by callback on property changes of ivi_layer ++ */ ++ void (*layer_remove_notification_by_callback)(struct ivi_layout_layer *ivilayer, ++ layer_property_notification_func callback, ++ void *userdata); ++ ++ /** ++ * \brief get id of ivi_screen from ivi_layout_screen ++ * ++ * ++ * \return id of ivi_screen ++ */ ++ uint32_t (*get_id_of_screen)(struct ivi_layout_screen *iviscrn); + }; + + #ifdef __cplusplus +diff --git a/ivi-shell/ivi-layout-private.h b/ivi-shell/ivi-layout-private.h +index 4531748..074d598 100644 +--- a/ivi-shell/ivi-layout-private.h ++++ b/ivi-shell/ivi-layout-private.h +@@ -1,23 +1,26 @@ + /* + * Copyright (C) 2014 DENSO CORPORATION + * +- * Permission to use, copy, modify, distribute, and sell this software and +- * its documentation for any purpose is hereby granted without fee, provided +- * that the above copyright notice appear in all copies and that both that +- * copyright notice and this permission notice appear in supporting +- * documentation, and that the name of the copyright holders not be used in +- * advertising or publicity pertaining to distribution of the software +- * without specific, written prior permission. The copyright holders make +- * no representations about the suitability of this software for any +- * purpose. It is provided "as is" without express or implied warranty. ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * "Software"), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sublicense, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: + * +- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS +- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY +- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +- * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ * The above copyright notice and this permission notice (including the ++ * next paragraph) shall be included in all copies or substantial ++ * portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS ++ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ++ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ++ * SOFTWARE. + */ + + #ifndef _ivi_layout_PRIVATE_H_ +@@ -36,12 +39,7 @@ struct ivi_layout_surface { + struct ivi_layout *layout; + struct weston_surface *surface; + +- struct wl_listener surface_destroy_listener; +- struct weston_transform surface_rotation; +- struct weston_transform layer_rotation; +- struct weston_transform surface_pos; +- struct weston_transform layer_pos; +- struct weston_transform scaling; ++ struct weston_transform transform; + + struct ivi_layout_surface_properties prop; + uint32_t event_mask; +@@ -83,9 +81,12 @@ struct ivi_layout_layer { + } pending; + + struct { ++ int dirty; + struct wl_list surface_list; + struct wl_list link; + } order; ++ ++ int32_t ref_count; + }; + + struct ivi_layout { +@@ -223,4 +224,6 @@ ivi_layout_transition_move_layer_cancel(struct ivi_layout_layer *layer); + int + load_controller_modules(struct weston_compositor *compositor, const char *modules, + int *argc, char *argv[]); ++void ++ivi_layout_surface_destroy(struct ivi_layout_surface *ivisurf); + #endif +diff --git a/ivi-shell/ivi-layout-transition.c b/ivi-shell/ivi-layout-transition.c +index f691d35..d12a8f4 100644 +--- a/ivi-shell/ivi-layout-transition.c ++++ b/ivi-shell/ivi-layout-transition.c +@@ -1,23 +1,26 @@ + /* + * Copyright (C) 2014 DENSO CORPORATION + * +- * Permission to use, copy, modify, distribute, and sell this software and +- * its documentation for any purpose is hereby granted without fee, provided +- * that the above copyright notice appear in all copies and that both that +- * copyright notice and this permission notice appear in supporting +- * documentation, and that the name of the copyright holders not be used in +- * advertising or publicity pertaining to distribution of the software +- * without specific, written prior permission. The copyright holders make +- * no representations about the suitability of this software for any +- * purpose. It is provided "as is" without express or implied warranty. ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * "Software"), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sublicense, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: + * +- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS +- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY +- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +- * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ * The above copyright notice and this permission notice (including the ++ * next paragraph) shall be included in all copies or substantial ++ * portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS ++ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ++ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ++ * SOFTWARE. + */ + + #include +@@ -226,7 +229,7 @@ layout_transition_destroy(struct ivi_layout_transition *transition) + struct ivi_layout *layout = get_instance(); + + remove_transition(layout, transition); +- if(transition->destroy_func) ++ if (transition->destroy_func) + transition->destroy_func(transition); + free(transition); + } +@@ -660,7 +663,7 @@ transition_move_layer_destroy(struct ivi_layout_transition *transition) + { + struct move_layer_data *data = transition->private_data; + +- if(data->destroy_func) ++ if (data->destroy_func) + data->destroy_func(transition->user_data); + + free(data); +diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c +index abfba70..c153884 100644 +--- a/ivi-shell/ivi-layout.c ++++ b/ivi-shell/ivi-layout.c +@@ -1,23 +1,26 @@ + /* + * Copyright (C) 2013 DENSO CORPORATION + * +- * Permission to use, copy, modify, distribute, and sell this software and +- * its documentation for any purpose is hereby granted without fee, provided +- * that the above copyright notice appear in all copies and that both that +- * copyright notice and this permission notice appear in supporting +- * documentation, and that the name of the copyright holders not be used in +- * advertising or publicity pertaining to distribution of the software +- * without specific, written prior permission. The copyright holders make +- * no representations about the suitability of this software for any +- * purpose. It is provided "as is" without express or implied warranty. ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * "Software"), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sublicense, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: + * +- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS +- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY +- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +- * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ * The above copyright notice and this permission notice (including the ++ * next paragraph) shall be included in all copies or substantial ++ * portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS ++ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ++ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ++ * SOFTWARE. + */ + + /** +@@ -55,12 +58,15 @@ + #include "config.h" + + #include ++#include + + #include "compositor.h" + #include "ivi-layout-export.h" + #include "ivi-layout-private.h" + +-#include "../shared/os-compatibility.h" ++#include "shared/os-compatibility.h" ++ ++#define max(a, b) ((a) > (b) ? (a) : (b)) + + struct link_layer { + struct ivi_layout_layer *ivilayer; +@@ -89,14 +95,13 @@ struct ivi_layout_screen { + struct ivi_layout *layout; + struct weston_output *output; + +- uint32_t event_mask; +- + struct { + struct wl_list layer_list; + struct wl_list link; + } pending; + + struct { ++ int dirty; + struct wl_list layer_list; + struct wl_list link; + } order; +@@ -107,6 +112,17 @@ struct ivi_layout_notification_callback { + void *data; + }; + ++struct ivi_rectangle ++{ ++ int32_t x; ++ int32_t y; ++ int32_t width; ++ int32_t height; ++}; ++ ++static void ++remove_notification(struct wl_list *listener_list, void *callback, void *userdata); ++ + static struct ivi_layout ivilayout = {0}; + + struct ivi_layout * +@@ -139,12 +155,8 @@ remove_link_to_surface(struct ivi_layout_layer *ivilayer) + struct link_layer *next = NULL; + + wl_list_for_each_safe(link, next, &ivilayer->link_to_surface, link_to_layer) { +- if (!wl_list_empty(&link->link_to_layer)) { +- wl_list_remove(&link->link_to_layer); +- } +- if (!wl_list_empty(&link->link)) { +- wl_list_remove(&link->link); +- } ++ wl_list_remove(&link->link_to_layer); ++ wl_list_remove(&link->link); + free(link); + } + +@@ -158,7 +170,6 @@ static void + add_link_to_layer(struct ivi_layout_screen *iviscrn, + struct link_screen *link_screen) + { +- wl_list_init(&link_screen->link_to_screen); + wl_list_insert(&iviscrn->link_to_layer, &link_screen->link_to_screen); + } + +@@ -178,7 +189,6 @@ add_ordersurface_to_layer(struct ivi_layout_surface *ivisurf, + } + + link_layer->ivilayer = ivilayer; +- wl_list_init(&link_layer->link); + wl_list_insert(&ivisurf->layer_list, &link_layer->link); + add_link_to_surface(ivilayer, link_layer); + } +@@ -190,12 +200,8 @@ remove_ordersurface_from_layer(struct ivi_layout_surface *ivisurf) + struct link_layer *next = NULL; + + wl_list_for_each_safe(link_layer, next, &ivisurf->layer_list, link) { +- if (!wl_list_empty(&link_layer->link)) { +- wl_list_remove(&link_layer->link); +- } +- if (!wl_list_empty(&link_layer->link_to_layer)) { +- wl_list_remove(&link_layer->link_to_layer); +- } ++ wl_list_remove(&link_layer->link); ++ wl_list_remove(&link_layer->link_to_layer); + free(link_layer); + } + wl_list_init(&ivisurf->layer_list); +@@ -217,7 +223,6 @@ add_orderlayer_to_screen(struct ivi_layout_layer *ivilayer, + } + + link_scrn->iviscrn = iviscrn; +- wl_list_init(&link_scrn->link); + wl_list_insert(&ivilayer->screen_list, &link_scrn->link); + add_link_to_layer(iviscrn, link_scrn); + } +@@ -229,12 +234,8 @@ remove_orderlayer_from_screen(struct ivi_layout_layer *ivilayer) + struct link_screen *next = NULL; + + wl_list_for_each_safe(link_scrn, next, &ivilayer->screen_list, link) { +- if (!wl_list_empty(&link_scrn->link)) { +- wl_list_remove(&link_scrn->link); +- } +- if (!wl_list_empty(&link_scrn->link_to_screen)) { +- wl_list_remove(&link_scrn->link_to_screen); +- } ++ wl_list_remove(&link_scrn->link); ++ wl_list_remove(&link_scrn->link_to_screen); + free(link_scrn); + } + wl_list_init(&ivilayer->screen_list); +@@ -290,9 +291,7 @@ remove_all_notification(struct wl_list *listener_list) + + wl_list_for_each_safe(listener, next, listener_list, link) { + struct listener_layout_notification *notification = NULL; +- if (!wl_list_empty(&listener->link)) { +- wl_list_remove(&listener->link); +- } ++ wl_list_remove(&listener->link); + + notification = + container_of(listener, +@@ -315,29 +314,36 @@ ivi_layout_surface_remove_notification(struct ivi_layout_surface *ivisurf) + remove_all_notification(&ivisurf->property_changed.listener_list); + } + ++static void ++ivi_layout_surface_remove_notification_by_callback(struct ivi_layout_surface *ivisurf, ++ surface_property_notification_func callback, ++ void *userdata) ++{ ++ if (ivisurf == NULL) { ++ weston_log("ivi_layout_surface_remove_notification_by_callback: invalid argument\n"); ++ return; ++ } ++ ++ remove_notification(&ivisurf->property_changed.listener_list, callback, userdata); ++} ++ + /** +- * this shall not be called from controller because this is triggered by ivi_surface.destroy +- * This means that this is called from westonsurface_destroy_from_ivisurface. ++ * Called at destruction of wl_surface/ivi_surface + */ +-static void +-ivi_layout_surface_remove(struct ivi_layout_surface *ivisurf) ++void ++ivi_layout_surface_destroy(struct ivi_layout_surface *ivisurf) + { + struct ivi_layout *layout = get_instance(); + + if (ivisurf == NULL) { +- weston_log("ivi_layout_surface_remove: invalid argument\n"); ++ weston_log("%s: invalid argument\n", __func__); + return; + } + +- if (!wl_list_empty(&ivisurf->pending.link)) { +- wl_list_remove(&ivisurf->pending.link); +- } +- if (!wl_list_empty(&ivisurf->order.link)) { +- wl_list_remove(&ivisurf->order.link); +- } +- if (!wl_list_empty(&ivisurf->link)) { +- wl_list_remove(&ivisurf->link); +- } ++ wl_list_remove(&ivisurf->transform.link); ++ wl_list_remove(&ivisurf->pending.link); ++ wl_list_remove(&ivisurf->order.link); ++ wl_list_remove(&ivisurf->link); + remove_ordersurface_from_layer(ivisurf); + + wl_signal_emit(&layout->surface_notification.removed, ivisurf); +@@ -350,27 +356,6 @@ ivi_layout_surface_remove(struct ivi_layout_surface *ivisurf) + } + + /** +- * Called at destruction of ivi_surface +- */ +-static void +-westonsurface_destroy_from_ivisurface(struct wl_listener *listener, void *data) +-{ +- struct ivi_layout_surface *ivisurf = NULL; +- +- ivisurf = container_of(listener, struct ivi_layout_surface, +- surface_destroy_listener); +- +- wl_list_remove(&ivisurf->surface_rotation.link); +- wl_list_remove(&ivisurf->layer_rotation.link); +- wl_list_remove(&ivisurf->surface_pos.link); +- wl_list_remove(&ivisurf->layer_pos.link); +- wl_list_remove(&ivisurf->scaling.link); +- +- ivisurf->surface = NULL; +- ivi_layout_surface_remove(ivisurf); +-} +- +-/** + * Internal API to check ivi_layer/ivi_surface already added in ivi_layer/ivi_screen. + * Called by ivi_layout_layer_add_surface/ivi_layout_screenAddLayer + */ +@@ -423,14 +408,12 @@ create_screen(struct weston_compositor *ec) + continue; + } + +- wl_list_init(&iviscrn->link); + iviscrn->layout = layout; + + iviscrn->id_screen = count; + count++; + + iviscrn->output = output; +- iviscrn->event_mask = 0; + + wl_list_init(&iviscrn->pending.layer_list); + wl_list_init(&iviscrn->pending.link); +@@ -494,293 +477,319 @@ update_opacity(struct ivi_layout_layer *ivilayer, + } + + static void +-update_surface_orientation(struct ivi_layout_layer *ivilayer, +- struct ivi_layout_surface *ivisurf) +-{ +- struct weston_view *view; +- struct weston_matrix *matrix = &ivisurf->surface_rotation.matrix; +- float width = 0.0f; +- float height = 0.0f; +- float v_sin = 0.0f; +- float v_cos = 0.0f; +- float cx = 0.0f; +- float cy = 0.0f; +- float sx = 1.0f; +- float sy = 1.0f; +- +- wl_list_for_each(view, &ivisurf->surface->views, surface_link) { +- if (view != NULL) { +- break; +- } +- } +- +- if (view == NULL) { +- return; +- } +- +- if ((ivilayer->prop.dest_width == 0) || +- (ivilayer->prop.dest_height == 0)) { +- return; +- } +- width = (float)ivilayer->prop.dest_width; +- height = (float)ivilayer->prop.dest_height; +- +- switch (ivisurf->prop.orientation) { +- case WL_OUTPUT_TRANSFORM_NORMAL: +- v_sin = 0.0f; +- v_cos = 1.0f; +- break; ++get_rotate_values(enum wl_output_transform orientation, ++ float *v_sin, ++ float *v_cos) ++{ ++ switch (orientation) { + case WL_OUTPUT_TRANSFORM_90: +- v_sin = 1.0f; +- v_cos = 0.0f; +- sx = width / height; +- sy = height / width; ++ *v_sin = 1.0f; ++ *v_cos = 0.0f; + break; + case WL_OUTPUT_TRANSFORM_180: +- v_sin = 0.0f; +- v_cos = -1.0f; ++ *v_sin = 0.0f; ++ *v_cos = -1.0f; + break; + case WL_OUTPUT_TRANSFORM_270: ++ *v_sin = -1.0f; ++ *v_cos = 0.0f; ++ break; ++ case WL_OUTPUT_TRANSFORM_NORMAL: + default: +- v_sin = -1.0f; +- v_cos = 0.0f; +- sx = width / height; +- sy = height / width; ++ *v_sin = 0.0f; ++ *v_cos = 1.0f; + break; + } +- wl_list_remove(&ivisurf->surface_rotation.link); +- weston_view_geometry_dirty(view); +- +- weston_matrix_init(matrix); +- cx = 0.5f * width; +- cy = 0.5f * height; +- weston_matrix_translate(matrix, -cx, -cy, 0.0f); +- weston_matrix_rotate_xy(matrix, v_cos, v_sin); +- weston_matrix_scale(matrix, sx, sy, 1.0); +- weston_matrix_translate(matrix, cx, cy, 0.0f); +- wl_list_insert(&view->geometry.transformation_list, +- &ivisurf->surface_rotation.link); +- +- weston_view_set_transform_parent(view, NULL); +- weston_view_update_transform(view); + } + + static void +-update_layer_orientation(struct ivi_layout_layer *ivilayer, +- struct ivi_layout_surface *ivisurf) +-{ +- struct weston_surface *es = ivisurf->surface; +- struct weston_view *view; +- struct weston_matrix *matrix = &ivisurf->layer_rotation.matrix; +- struct weston_output *output = NULL; +- float width = 0.0f; +- float height = 0.0f; +- float v_sin = 0.0f; +- float v_cos = 0.0f; +- float cx = 0.0f; +- float cy = 0.0f; +- float sx = 1.0f; +- float sy = 1.0f; +- +- wl_list_for_each(view, &ivisurf->surface->views, surface_link) { +- if (view != NULL) { +- break; +- } +- } +- +- if (es == NULL || view == NULL) { +- return; +- } +- +- output = es->output; +- if (output == NULL) { +- return; +- } +- if ((output->width == 0) || (output->height == 0)) { +- return; +- } +- width = (float)output->width; +- height = (float)output->height; +- +- switch (ivilayer->prop.orientation) { +- case WL_OUTPUT_TRANSFORM_NORMAL: +- v_sin = 0.0f; +- v_cos = 1.0f; +- break; ++get_scale(enum wl_output_transform orientation, ++ float dest_width, ++ float dest_height, ++ float source_width, ++ float source_height, ++ float *scale_x, ++ float *scale_y) ++{ ++ switch (orientation) { + case WL_OUTPUT_TRANSFORM_90: +- v_sin = 1.0f; +- v_cos = 0.0f; +- sx = width / height; +- sy = height / width; ++ *scale_x = dest_width / source_height; ++ *scale_y = dest_height / source_width; + break; + case WL_OUTPUT_TRANSFORM_180: +- v_sin = 0.0f; +- v_cos = -1.0f; ++ *scale_x = dest_width / source_width; ++ *scale_y = dest_height / source_height; + break; + case WL_OUTPUT_TRANSFORM_270: ++ *scale_x = dest_width / source_height; ++ *scale_y = dest_height / source_width; ++ break; ++ case WL_OUTPUT_TRANSFORM_NORMAL: + default: +- v_sin = -1.0f; +- v_cos = 0.0f; +- sx = width / height; +- sy = height / width; ++ *scale_x = dest_width / source_width; ++ *scale_y = dest_height / source_height; + break; + } +- wl_list_remove(&ivisurf->layer_rotation.link); +- weston_view_geometry_dirty(view); +- +- weston_matrix_init(matrix); +- cx = 0.5f * width; +- cy = 0.5f * height; +- weston_matrix_translate(matrix, -cx, -cy, 0.0f); +- weston_matrix_rotate_xy(matrix, v_cos, v_sin); +- weston_matrix_scale(matrix, sx, sy, 1.0); +- weston_matrix_translate(matrix, cx, cy, 0.0f); +- wl_list_insert(&view->geometry.transformation_list, +- &ivisurf->layer_rotation.link); ++} + +- weston_view_set_transform_parent(view, NULL); +- weston_view_update_transform(view); ++static void ++calc_transformation_matrix(struct ivi_rectangle *source_rect, ++ struct ivi_rectangle *dest_rect, ++ enum wl_output_transform orientation, ++ struct weston_matrix *m) ++{ ++ float source_center_x; ++ float source_center_y; ++ float vsin; ++ float vcos; ++ float scale_x; ++ float scale_y; ++ float translate_x; ++ float translate_y; ++ ++ source_center_x = source_rect->x + source_rect->width * 0.5f; ++ source_center_y = source_rect->y + source_rect->height * 0.5f; ++ weston_matrix_translate(m, -source_center_x, -source_center_y, 0.0f); ++ ++ get_rotate_values(orientation, &vsin, &vcos); ++ weston_matrix_rotate_xy(m, vcos, vsin); ++ ++ get_scale(orientation, ++ dest_rect->width, ++ dest_rect->height, ++ source_rect->width, ++ source_rect->height, ++ &scale_x, ++ &scale_y); ++ weston_matrix_scale(m, scale_x, scale_y, 1.0f); ++ ++ translate_x = dest_rect->width * 0.5f + dest_rect->x; ++ translate_y = dest_rect->height * 0.5f + dest_rect->y; ++ weston_matrix_translate(m, translate_x, translate_y, 0.0f); + } + ++/* ++ * This computes intersected rect_output from two ivi_rectangles ++ */ + static void +-update_surface_position(struct ivi_layout_surface *ivisurf) ++ivi_rectangle_intersect(const struct ivi_rectangle *rect1, ++ const struct ivi_rectangle *rect2, ++ struct ivi_rectangle *rect_output) + { +- struct weston_view *view; +- float tx = (float)ivisurf->prop.dest_x; +- float ty = (float)ivisurf->prop.dest_y; +- struct weston_matrix *matrix = &ivisurf->surface_pos.matrix; ++ int32_t rect1_right = rect1->x + rect1->width; ++ int32_t rect1_bottom = rect1->y + rect1->height; ++ int32_t rect2_right = rect2->x + rect2->width; ++ int32_t rect2_bottom = rect2->y + rect2->height; + +- wl_list_for_each(view, &ivisurf->surface->views, surface_link) { +- if (view != NULL) { +- break; +- } +- } ++ rect_output->x = max(rect1->x, rect2->x); ++ rect_output->y = max(rect1->y, rect2->y); ++ rect_output->width = rect1_right < rect2_right ? ++ rect1_right - rect_output->x : ++ rect2_right - rect_output->x; ++ rect_output->height = rect1_bottom < rect2_bottom ? ++ rect1_bottom - rect_output->y : ++ rect2_bottom - rect_output->y; + +- if (view == NULL) { +- return; ++ if (rect_output->width < 0 || rect_output->height < 0) { ++ rect_output->width = 0; ++ rect_output->height = 0; + } +- +- wl_list_remove(&ivisurf->surface_pos.link); +- +- weston_matrix_init(matrix); +- weston_matrix_translate(matrix, tx, ty, 0.0f); +- wl_list_insert(&view->geometry.transformation_list, +- &ivisurf->surface_pos.link); +- +- weston_view_set_transform_parent(view, NULL); +- weston_view_update_transform(view); + } + ++/* ++ * Transform rect_input by the inverse of matrix, intersect with boundingbox, ++ * and store the result in rect_output. ++ * The boundingbox must be given in the same coordinate space as rect_output. ++ * Additionally, there are the following restrictions on the matrix: ++ * - no projective transformations ++ * - no skew ++ * - only multiples of 90-degree rotations supported ++ * ++ * In failure case of weston_matrix_invert, rect_output is set to boundingbox ++ * as a fail-safe with log. ++ */ + static void +-update_layer_position(struct ivi_layout_layer *ivilayer, +- struct ivi_layout_surface *ivisurf) ++calc_inverse_matrix_transform(const struct weston_matrix *matrix, ++ const struct ivi_rectangle *rect_input, ++ const struct ivi_rectangle *boundingbox, ++ struct ivi_rectangle *rect_output) + { +- struct weston_view *view; +- struct weston_matrix *matrix = &ivisurf->layer_pos.matrix; +- float tx = (float)ivilayer->prop.dest_x; +- float ty = (float)ivilayer->prop.dest_y; ++ struct weston_matrix m; ++ struct weston_vector top_left; ++ struct weston_vector bottom_right; + +- wl_list_for_each(view, &ivisurf->surface->views, surface_link) { +- if (view != NULL) { +- break; +- } +- } ++ assert(boundingbox != rect_output); + +- if (view == NULL) { +- return; ++ if (weston_matrix_invert(&m, matrix) < 0) { ++ weston_log("ivi-shell: calc_inverse_matrix_transform fails to invert a matrix.\n"); ++ weston_log("ivi-shell: boundingbox is set to the rect_output.\n"); ++ rect_output->x = boundingbox->x; ++ rect_output->y = boundingbox->y; ++ rect_output->width = boundingbox->width; ++ rect_output->height = boundingbox->height; + } + +- wl_list_remove(&ivisurf->layer_pos.link); ++ /* The vectors and matrices involved will always produce f[3] == 1.0. */ ++ top_left.f[0] = rect_input->x; ++ top_left.f[1] = rect_input->y; ++ top_left.f[2] = 0.0f; ++ top_left.f[3] = 1.0f; + +- weston_matrix_init(matrix); +- weston_matrix_translate(matrix, tx, ty, 0.0f); +- wl_list_insert(&view->geometry.transformation_list, +- &ivisurf->layer_pos.link); ++ bottom_right.f[0] = rect_input->x + rect_input->width; ++ bottom_right.f[1] = rect_input->y + rect_input->height; ++ bottom_right.f[2] = 0.0f; ++ bottom_right.f[3] = 1.0f; + +- weston_view_set_transform_parent(view, NULL); +- weston_view_update_transform(view); +-} ++ weston_matrix_transform(&m, &top_left); ++ weston_matrix_transform(&m, &bottom_right); + +-static void +-update_scale(struct ivi_layout_layer *ivilayer, +- struct ivi_layout_surface *ivisurf) +-{ +- struct weston_view *view; +- struct weston_matrix *matrix = &ivisurf->scaling.matrix; +- float sx = 0.0f; +- float sy = 0.0f; +- float lw = 0.0f; +- float sw = 0.0f; +- float lh = 0.0f; +- float sh = 0.0f; +- +- wl_list_for_each(view, &ivisurf->surface->views, surface_link) { +- if (view != NULL) { +- break; +- } ++ if (top_left.f[0] < bottom_right.f[0]) { ++ rect_output->x = top_left.f[0]; ++ rect_output->width = bottom_right.f[0] - rect_output->x; ++ } else { ++ rect_output->x = bottom_right.f[0]; ++ rect_output->width = top_left.f[0] - rect_output->x; + } + +- if (view == NULL) { +- return; ++ if (top_left.f[1] < bottom_right.f[1]) { ++ rect_output->y = top_left.f[1]; ++ rect_output->height = bottom_right.f[1] - rect_output->y; ++ } else { ++ rect_output->y = bottom_right.f[1]; ++ rect_output->height = top_left.f[1] - rect_output->y; + } + +- if (ivisurf->prop.source_width == 0 || ivisurf->prop.source_height == 0) { +- weston_log("ivi-shell: source rectangle is not yet set by ivi_layout_surface_set_source_rectangle\n"); +- return; +- } ++ ivi_rectangle_intersect(rect_output, boundingbox, rect_output); ++} + +- if (ivisurf->prop.dest_width == 0 || ivisurf->prop.dest_height == 0) { +- weston_log("ivi-shell: destination rectangle is not yet set by ivi_layout_surface_set_destination_rectangle\n"); +- return; +- } ++/** ++ * This computes the whole transformation matrix:m from surface-local ++ * coordinates to global coordinates. It is assumed that ++ * weston_view::geometry.{x,y} are zero. ++ * ++ * Additionally, this computes the mask on surface-local coordinates as a ++ * ivi_rectangle. This can be set to weston_view_set_mask. ++ * ++ * The mask is computed by following steps ++ * - destination rectangle of layer is inversed to surface-local cooodinates ++ * by inversed matrix:m. ++ * - the area is intersected by intersected area between weston_surface and ++ * source rectangle of ivi_surface. ++ */ ++static void ++calc_surface_to_global_matrix_and_mask_to_weston_surface( ++ struct ivi_layout_layer *ivilayer, ++ struct ivi_layout_surface *ivisurf, ++ struct weston_matrix *m, ++ struct ivi_rectangle *result) ++{ ++ const struct ivi_layout_surface_properties *sp = &ivisurf->prop; ++ const struct ivi_layout_layer_properties *lp = &ivilayer->prop; ++ struct ivi_rectangle weston_surface_rect = { 0, ++ 0, ++ ivisurf->surface->width, ++ ivisurf->surface->height }; ++ struct ivi_rectangle surface_source_rect = { sp->source_x, ++ sp->source_y, ++ sp->source_width, ++ sp->source_height }; ++ struct ivi_rectangle surface_dest_rect = { sp->dest_x, ++ sp->dest_y, ++ sp->dest_width, ++ sp->dest_height }; ++ struct ivi_rectangle layer_source_rect = { lp->source_x, ++ lp->source_y, ++ lp->source_width, ++ lp->source_height }; ++ struct ivi_rectangle layer_dest_rect = { lp->dest_x, ++ lp->dest_y, ++ lp->dest_width, ++ lp->dest_height }; ++ struct ivi_rectangle surface_result; + +- lw = ((float)ivilayer->prop.dest_width / (float)ivilayer->prop.source_width ); +- sw = ((float)ivisurf->prop.dest_width / (float)ivisurf->prop.source_width ); +- lh = ((float)ivilayer->prop.dest_height / (float)ivilayer->prop.source_height); +- sh = ((float)ivisurf->prop.dest_height / (float)ivisurf->prop.source_height ); +- sx = sw * lw; +- sy = sh * lh; ++ /* ++ * the whole transformation matrix:m from surface-local ++ * coordinates to global coordinates, which is computed by ++ * two steps, ++ * - surface-local coordinates to layer-local coordinates ++ * - layer-local coordinates to global coordinates ++ */ ++ calc_transformation_matrix(&surface_source_rect, ++ &surface_dest_rect, ++ sp->orientation, m); + +- wl_list_remove(&ivisurf->scaling.link); +- weston_matrix_init(matrix); +- weston_matrix_scale(matrix, sx, sy, 1.0f); ++ calc_transformation_matrix(&layer_source_rect, ++ &layer_dest_rect, ++ lp->orientation, m); + +- wl_list_insert(&view->geometry.transformation_list, +- &ivisurf->scaling.link); ++ /* this intersected ivi_rectangle would be used for masking ++ * weston_surface ++ */ ++ ivi_rectangle_intersect(&surface_source_rect, &weston_surface_rect, ++ &surface_result); + +- weston_view_set_transform_parent(view, NULL); +- weston_view_update_transform(view); ++ /* calc masking area of weston_surface from m */ ++ calc_inverse_matrix_transform(m, ++ &layer_dest_rect, ++ &surface_result, ++ result); + } + + static void + update_prop(struct ivi_layout_layer *ivilayer, + struct ivi_layout_surface *ivisurf) + { +- if (ivilayer->event_mask | ivisurf->event_mask) { +- struct weston_view *tmpview; +- update_opacity(ivilayer, ivisurf); +- update_layer_orientation(ivilayer, ivisurf); +- update_layer_position(ivilayer, ivisurf); +- update_surface_position(ivisurf); +- update_surface_orientation(ivilayer, ivisurf); +- update_scale(ivilayer, ivisurf); ++ struct weston_view *tmpview; ++ struct ivi_rectangle r; ++ bool can_calc = true; + +- ivisurf->update_count++; ++ if (!ivilayer->event_mask && !ivisurf->event_mask) { ++ return; ++ } + +- wl_list_for_each(tmpview, &ivisurf->surface->views, surface_link) { +- if (tmpview != NULL) { +- break; +- } +- } ++ update_opacity(ivilayer, ivisurf); + ++ wl_list_for_each(tmpview, &ivisurf->surface->views, surface_link) { + if (tmpview != NULL) { +- weston_view_geometry_dirty(tmpview); ++ break; + } ++ } + +- if (ivisurf->surface != NULL) { +- weston_surface_damage(ivisurf->surface); ++ if (ivisurf->prop.source_width == 0 || ivisurf->prop.source_height == 0) { ++ weston_log("ivi-shell: source rectangle is not yet set by ivi_layout_surface_set_source_rectangle\n"); ++ can_calc = false; ++ } ++ ++ if (ivisurf->prop.dest_width == 0 || ivisurf->prop.dest_height == 0) { ++ weston_log("ivi-shell: destination rectangle is not yet set by ivi_layout_surface_set_destination_rectangle\n"); ++ can_calc = false; ++ } ++ ++ if (can_calc) { ++ wl_list_remove(&ivisurf->transform.link); ++ weston_matrix_init(&ivisurf->transform.matrix); ++ ++ calc_surface_to_global_matrix_and_mask_to_weston_surface( ++ ivilayer, ivisurf, &ivisurf->transform.matrix, &r); ++ ++ if (tmpview != NULL) { ++ weston_view_set_mask(tmpview, r.x, r.y, r.width, r.height); ++ wl_list_insert(&tmpview->geometry.transformation_list, ++ &ivisurf->transform.link); ++ ++ weston_view_set_transform_parent(tmpview, NULL); + } + } ++ ++ ivisurf->update_count++; ++ ++ if (tmpview != NULL) { ++ weston_view_geometry_dirty(tmpview); ++ } ++ ++ if (ivisurf->surface != NULL) { ++ weston_surface_damage(ivisurf->surface); ++ } + } + + static void +@@ -810,7 +819,7 @@ commit_surface_list(struct ivi_layout *layout) + int32_t configured = 0; + + wl_list_for_each(ivisurf, &layout->surface_list, link) { +- if(ivisurf->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_VIEW_DEFAULT) { ++ if (ivisurf->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_VIEW_DEFAULT) { + dest_x = ivisurf->prop.dest_x; + dest_y = ivisurf->prop.dest_y; + dest_width = ivisurf->prop.dest_width; +@@ -823,7 +832,7 @@ commit_surface_list(struct ivi_layout *layout) + ivisurf->pending.prop.dest_height, + ivisurf->pending.prop.transition_duration); + +- if(ivisurf->pending.prop.visibility) { ++ if (ivisurf->pending.prop.visibility) { + ivi_layout_transition_visibility_on(ivisurf, ivisurf->pending.prop.transition_duration); + } else { + ivi_layout_transition_visibility_off(ivisurf, ivisurf->pending.prop.transition_duration); +@@ -837,7 +846,7 @@ commit_surface_list(struct ivi_layout *layout) + ivisurf->prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; + ivisurf->pending.prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; + +- } else if(ivisurf->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_VIEW_DEST_RECT_ONLY){ ++ } else if (ivisurf->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_VIEW_DEST_RECT_ONLY) { + dest_x = ivisurf->prop.dest_x; + dest_y = ivisurf->prop.dest_y; + dest_width = ivisurf->prop.dest_width; +@@ -859,9 +868,9 @@ commit_surface_list(struct ivi_layout *layout) + ivisurf->prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; + ivisurf->pending.prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; + +- } else if(ivisurf->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_VIEW_FADE_ONLY){ ++ } else if (ivisurf->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_VIEW_FADE_ONLY) { + configured = 0; +- if(ivisurf->pending.prop.visibility) { ++ if (ivisurf->pending.prop.visibility) { + ivi_layout_transition_visibility_on(ivisurf, ivisurf->pending.prop.transition_duration); + } else { + ivi_layout_transition_visibility_off(ivisurf, ivisurf->pending.prop.transition_duration); +@@ -903,9 +912,9 @@ commit_layer_list(struct ivi_layout *layout) + struct ivi_layout_surface *next = NULL; + + wl_list_for_each(ivilayer, &layout->layer_list, link) { +- if(ivilayer->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_LAYER_MOVE) { ++ if (ivilayer->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_LAYER_MOVE) { + ivi_layout_transition_move_layer(ivilayer, ivilayer->pending.prop.dest_x, ivilayer->pending.prop.dest_y, ivilayer->pending.prop.transition_duration); +- } else if(ivilayer->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_LAYER_FADE) { ++ } else if (ivilayer->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_LAYER_FADE) { + ivi_layout_transition_fade_layer(ivilayer,ivilayer->pending.prop.is_fade_in, + ivilayer->pending.prop.start_alpha,ivilayer->pending.prop.end_alpha, + NULL, NULL, +@@ -915,53 +924,30 @@ commit_layer_list(struct ivi_layout *layout) + + ivilayer->prop = ivilayer->pending.prop; + +- if (!(ivilayer->event_mask & +- (IVI_NOTIFICATION_ADD | IVI_NOTIFICATION_REMOVE)) ) { ++ if (!ivilayer->order.dirty) { + continue; + } + +- if (ivilayer->event_mask & IVI_NOTIFICATION_REMOVE) { +- wl_list_for_each_safe(ivisurf, next, +- &ivilayer->order.surface_list, order.link) { +- remove_ordersurface_from_layer(ivisurf); +- +- if (!wl_list_empty(&ivisurf->order.link)) { +- wl_list_remove(&ivisurf->order.link); +- } +- +- wl_list_init(&ivisurf->order.link); +- ivisurf->event_mask |= IVI_NOTIFICATION_REMOVE; +- } +- +- wl_list_init(&ivilayer->order.surface_list); ++ wl_list_for_each_safe(ivisurf, next, &ivilayer->order.surface_list, ++ order.link) { ++ remove_ordersurface_from_layer(ivisurf); ++ wl_list_remove(&ivisurf->order.link); ++ wl_list_init(&ivisurf->order.link); ++ ivisurf->event_mask |= IVI_NOTIFICATION_REMOVE; + } + +- if (ivilayer->event_mask & IVI_NOTIFICATION_ADD) { +- wl_list_for_each_safe(ivisurf, next, +- &ivilayer->order.surface_list, order.link) { +- remove_ordersurface_from_layer(ivisurf); +- +- if (!wl_list_empty(&ivisurf->order.link)) { +- wl_list_remove(&ivisurf->order.link); +- } +- +- wl_list_init(&ivisurf->order.link); +- } ++ assert(wl_list_empty(&ivilayer->order.surface_list)); + +- wl_list_init(&ivilayer->order.surface_list); +- wl_list_for_each(ivisurf, &ivilayer->pending.surface_list, ++ wl_list_for_each(ivisurf, &ivilayer->pending.surface_list, + pending.link) { +- if(!wl_list_empty(&ivisurf->order.link)){ +- wl_list_remove(&ivisurf->order.link); +- wl_list_init(&ivisurf->order.link); +- } +- +- wl_list_insert(&ivilayer->order.surface_list, +- &ivisurf->order.link); +- add_ordersurface_to_layer(ivisurf, ivilayer); +- ivisurf->event_mask |= IVI_NOTIFICATION_ADD; +- } ++ wl_list_remove(&ivisurf->order.link); ++ wl_list_insert(&ivilayer->order.surface_list, ++ &ivisurf->order.link); ++ add_ordersurface_to_layer(ivisurf, ivilayer); ++ ivisurf->event_mask |= IVI_NOTIFICATION_ADD; + } ++ ++ ivilayer->order.dirty = 0; + } + } + +@@ -974,33 +960,17 @@ commit_screen_list(struct ivi_layout *layout) + struct ivi_layout_surface *ivisurf = NULL; + + wl_list_for_each(iviscrn, &layout->screen_list, link) { +- if (iviscrn->event_mask & IVI_NOTIFICATION_REMOVE) { ++ if (iviscrn->order.dirty) { + wl_list_for_each_safe(ivilayer, next, + &iviscrn->order.layer_list, order.link) { + remove_orderlayer_from_screen(ivilayer); +- +- if (!wl_list_empty(&ivilayer->order.link)) { +- wl_list_remove(&ivilayer->order.link); +- } +- ++ wl_list_remove(&ivilayer->order.link); + wl_list_init(&ivilayer->order.link); + ivilayer->event_mask |= IVI_NOTIFICATION_REMOVE; + } +- } + +- if (iviscrn->event_mask & IVI_NOTIFICATION_ADD) { +- wl_list_for_each_safe(ivilayer, next, +- &iviscrn->order.layer_list, order.link) { +- remove_orderlayer_from_screen(ivilayer); ++ assert(wl_list_empty(&iviscrn->order.layer_list)); + +- if (!wl_list_empty(&ivilayer->order.link)) { +- wl_list_remove(&ivilayer->order.link); +- } +- +- wl_list_init(&ivilayer->order.link); +- } +- +- wl_list_init(&iviscrn->order.layer_list); + wl_list_for_each(ivilayer, &iviscrn->pending.layer_list, + pending.link) { + wl_list_insert(&iviscrn->order.layer_list, +@@ -1008,9 +978,9 @@ commit_screen_list(struct ivi_layout *layout) + add_orderlayer_to_screen(ivilayer, iviscrn); + ivilayer->event_mask |= IVI_NOTIFICATION_ADD; + } +- } + +- iviscrn->event_mask = 0; ++ iviscrn->order.dirty = 0; ++ } + + /* Clear view list of layout ivi_layer */ + wl_list_init(&layout->layout_layer.view_list.link); +@@ -1046,7 +1016,7 @@ commit_screen_list(struct ivi_layout *layout) + static void + commit_transition(struct ivi_layout* layout) + { +- if(wl_list_empty(&layout->pending_transition_list)){ ++ if (wl_list_empty(&layout->pending_transition_list)) { + return; + } + +@@ -1079,11 +1049,13 @@ send_prop(struct ivi_layout *layout) + struct ivi_layout_surface *ivisurf = NULL; + + wl_list_for_each_reverse(ivilayer, &layout->layer_list, link) { +- send_layer_prop(ivilayer); ++ if (ivilayer->event_mask) ++ send_layer_prop(ivilayer); + } + + wl_list_for_each_reverse(ivisurf, &layout->surface_list, link) { +- send_surface_prop(ivisurf); ++ if (ivisurf->event_mask) ++ send_surface_prop(ivisurf); + } + } + +@@ -1095,14 +1067,9 @@ clear_surface_pending_list(struct ivi_layout_layer *ivilayer) + + wl_list_for_each_safe(surface_link, surface_next, + &ivilayer->pending.surface_list, pending.link) { +- if (!wl_list_empty(&surface_link->pending.link)) { +- wl_list_remove(&surface_link->pending.link); +- } +- ++ wl_list_remove(&surface_link->pending.link); + wl_list_init(&surface_link->pending.link); + } +- +- ivilayer->event_mask |= IVI_NOTIFICATION_REMOVE; + } + + static void +@@ -1113,14 +1080,9 @@ clear_surface_order_list(struct ivi_layout_layer *ivilayer) + + wl_list_for_each_safe(surface_link, surface_next, + &ivilayer->order.surface_list, order.link) { +- if (!wl_list_empty(&surface_link->order.link)) { +- wl_list_remove(&surface_link->order.link); +- } +- ++ wl_list_remove(&surface_link->order.link); + wl_list_init(&surface_link->order.link); + } +- +- ivilayer->event_mask |= IVI_NOTIFICATION_REMOVE; + } + + static void +@@ -1287,9 +1249,7 @@ remove_notification(struct wl_list *listener_list, void *callback, void *userdat + continue; + } + +- if (!wl_list_empty(&listener->link)) { +- wl_list_remove(&listener->link); +- } ++ wl_list_remove(&listener->link); + + free(notification->userdata); + free(notification); +@@ -1480,6 +1440,12 @@ ivi_layout_get_id_of_layer(struct ivi_layout_layer *ivilayer) + return ivilayer->id_layer; + } + ++static uint32_t ++ivi_layout_get_id_of_screen(struct ivi_layout_screen *iviscrn) ++{ ++ return iviscrn->id_screen; ++} ++ + static struct ivi_layout_layer * + ivi_layout_get_layer_from_id(uint32_t id_layer) + { +@@ -1531,7 +1497,7 @@ ivi_layout_get_screen_resolution(struct ivi_layout_screen *iviscrn, + { + struct weston_output *output = NULL; + +- if (pWidth == NULL || pHeight == NULL) { ++ if (iviscrn == NULL || pWidth == NULL || pHeight == NULL) { + weston_log("ivi_layout_get_screen_resolution: invalid argument\n"); + return IVI_FAILED; + } +@@ -1605,7 +1571,7 @@ ivi_layout_get_screens(int32_t *pLength, struct ivi_layout_screen ***ppArray) + + length = wl_list_length(&layout->screen_list); + +- if (length != 0){ ++ if (length != 0) { + /* the Array must be free by module which called this function */ + *ppArray = calloc(length, sizeof(struct ivi_layout_screen *)); + if (*ppArray == NULL) { +@@ -1639,7 +1605,7 @@ ivi_layout_get_screens_under_layer(struct ivi_layout_layer *ivilayer, + + length = wl_list_length(&ivilayer->screen_list); + +- if (length != 0){ ++ if (length != 0) { + /* the Array must be free by module which called this function */ + *ppArray = calloc(length, sizeof(struct ivi_layout_screen *)); + if (*ppArray == NULL) { +@@ -1672,7 +1638,7 @@ ivi_layout_get_layers(int32_t *pLength, struct ivi_layout_layer ***ppArray) + + length = wl_list_length(&layout->layer_list); + +- if (length != 0){ ++ if (length != 0) { + /* the Array must be free by module which called this function */ + *ppArray = calloc(length, sizeof(struct ivi_layout_layer *)); + if (*ppArray == NULL) { +@@ -1706,7 +1672,7 @@ ivi_layout_get_layers_on_screen(struct ivi_layout_screen *iviscrn, + + length = wl_list_length(&iviscrn->order.layer_list); + +- if (length != 0){ ++ if (length != 0) { + /* the Array must be free by module which called this function */ + *ppArray = calloc(length, sizeof(struct ivi_layout_layer *)); + if (*ppArray == NULL) { +@@ -1714,7 +1680,7 @@ ivi_layout_get_layers_on_screen(struct ivi_layout_screen *iviscrn, + return IVI_FAILED; + } + +- wl_list_for_each(ivilayer, &iviscrn->order.layer_list, link) { ++ wl_list_for_each(ivilayer, &iviscrn->order.layer_list, order.link) { + (*ppArray)[n++] = ivilayer; + } + } +@@ -1740,7 +1706,7 @@ ivi_layout_get_layers_under_surface(struct ivi_layout_surface *ivisurf, + + length = wl_list_length(&ivisurf->layer_list); + +- if (length != 0){ ++ if (length != 0) { + /* the Array must be free by module which called this function */ + *ppArray = calloc(length, sizeof(struct ivi_layout_layer *)); + if (*ppArray == NULL) { +@@ -1774,7 +1740,7 @@ ivi_layout_get_surfaces(int32_t *pLength, struct ivi_layout_surface ***ppArray) + + length = wl_list_length(&layout->surface_list); + +- if (length != 0){ ++ if (length != 0) { + /* the Array must be free by module which called this function */ + *ppArray = calloc(length, sizeof(struct ivi_layout_surface *)); + if (*ppArray == NULL) { +@@ -1836,6 +1802,7 @@ ivi_layout_layer_create_with_dimension(uint32_t id_layer, + ivilayer = get_layer(&layout->layer_list, id_layer); + if (ivilayer != NULL) { + weston_log("id_layer is already created\n"); ++ ++ivilayer->ref_count; + return ivilayer; + } + +@@ -1845,7 +1812,7 @@ ivi_layout_layer_create_with_dimension(uint32_t id_layer, + return NULL; + } + +- wl_list_init(&ivilayer->link); ++ ivilayer->ref_count = 1; + wl_signal_init(&ivilayer->property_changed); + wl_list_init(&ivilayer->screen_list); + wl_list_init(&ivilayer->link_to_surface); +@@ -1881,7 +1848,20 @@ ivi_layout_layer_remove_notification(struct ivi_layout_layer *ivilayer) + } + + static void +-ivi_layout_layer_remove(struct ivi_layout_layer *ivilayer) ++ivi_layout_layer_remove_notification_by_callback(struct ivi_layout_layer *ivilayer, ++ layer_property_notification_func callback, ++ void *userdata) ++{ ++ if (ivilayer == NULL) { ++ weston_log("ivi_layout_layer_remove_notification_by_callback: invalid argument\n"); ++ return; ++ } ++ ++ remove_notification(&ivilayer->property_changed.listener_list, callback, userdata); ++} ++ ++static void ++ivi_layout_layer_destroy(struct ivi_layout_layer *ivilayer) + { + struct ivi_layout *layout = get_instance(); + +@@ -1890,20 +1870,18 @@ ivi_layout_layer_remove(struct ivi_layout_layer *ivilayer) + return; + } + ++ if (--ivilayer->ref_count > 0) ++ return; ++ + wl_signal_emit(&layout->layer_notification.removed, ivilayer); + + clear_surface_pending_list(ivilayer); + clear_surface_order_list(ivilayer); + +- if (!wl_list_empty(&ivilayer->pending.link)) { +- wl_list_remove(&ivilayer->pending.link); +- } +- if (!wl_list_empty(&ivilayer->order.link)) { +- wl_list_remove(&ivilayer->order.link); +- } +- if (!wl_list_empty(&ivilayer->link)) { +- wl_list_remove(&ivilayer->link); +- } ++ wl_list_remove(&ivilayer->pending.link); ++ wl_list_remove(&ivilayer->order.link); ++ wl_list_remove(&ivilayer->link); ++ + remove_orderlayer_from_screen(ivilayer); + remove_link_to_surface(ivilayer); + ivi_layout_layer_remove_notification(ivilayer); +@@ -1925,7 +1903,10 @@ ivi_layout_layer_set_visibility(struct ivi_layout_layer *ivilayer, + prop = &ivilayer->pending.prop; + prop->visibility = newVisibility; + +- ivilayer->event_mask |= IVI_NOTIFICATION_VISIBILITY; ++ if (ivilayer->prop.visibility != newVisibility) ++ ivilayer->event_mask |= IVI_NOTIFICATION_VISIBILITY; ++ else ++ ivilayer->event_mask &= ~IVI_NOTIFICATION_VISIBILITY; + + return IVI_SUCCEEDED; + } +@@ -1947,7 +1928,9 @@ ivi_layout_layer_set_opacity(struct ivi_layout_layer *ivilayer, + { + struct ivi_layout_layer_properties *prop = NULL; + +- if (ivilayer == NULL) { ++ if (ivilayer == NULL || ++ opacity < wl_fixed_from_double(0.0) || ++ wl_fixed_from_double(1.0) < opacity) { + weston_log("ivi_layout_layer_set_opacity: invalid argument\n"); + return IVI_FAILED; + } +@@ -1955,7 +1938,10 @@ ivi_layout_layer_set_opacity(struct ivi_layout_layer *ivilayer, + prop = &ivilayer->pending.prop; + prop->opacity = opacity; + +- ivilayer->event_mask |= IVI_NOTIFICATION_OPACITY; ++ if (ivilayer->prop.opacity != opacity) ++ ivilayer->event_mask |= IVI_NOTIFICATION_OPACITY; ++ else ++ ivilayer->event_mask &= ~IVI_NOTIFICATION_OPACITY; + + return IVI_SUCCEEDED; + } +@@ -1989,7 +1975,12 @@ ivi_layout_layer_set_source_rectangle(struct ivi_layout_layer *ivilayer, + prop->source_width = width; + prop->source_height = height; + +- ivilayer->event_mask |= IVI_NOTIFICATION_SOURCE_RECT; ++ if (ivilayer->prop.source_x != x || ivilayer->prop.source_y != y || ++ ivilayer->prop.source_width != width || ++ ivilayer->prop.source_height != height) ++ ivilayer->event_mask |= IVI_NOTIFICATION_SOURCE_RECT; ++ else ++ ivilayer->event_mask &= ~IVI_NOTIFICATION_SOURCE_RECT; + + return IVI_SUCCEEDED; + } +@@ -2012,7 +2003,12 @@ ivi_layout_layer_set_destination_rectangle(struct ivi_layout_layer *ivilayer, + prop->dest_width = width; + prop->dest_height = height; + +- ivilayer->event_mask |= IVI_NOTIFICATION_DEST_RECT; ++ if (ivilayer->prop.dest_x != x || ivilayer->prop.dest_y != y || ++ ivilayer->prop.dest_width != width || ++ ivilayer->prop.dest_height != height) ++ ivilayer->event_mask |= IVI_NOTIFICATION_DEST_RECT; ++ else ++ ivilayer->event_mask &= ~IVI_NOTIFICATION_DEST_RECT; + + return IVI_SUCCEEDED; + } +@@ -2048,7 +2044,11 @@ ivi_layout_layer_set_dimension(struct ivi_layout_layer *ivilayer, + prop->dest_width = dest_width; + prop->dest_height = dest_height; + +- ivilayer->event_mask |= IVI_NOTIFICATION_DIMENSION; ++ if (ivilayer->prop.dest_width != dest_width || ++ ivilayer->prop.dest_height != dest_height) ++ ivilayer->event_mask |= IVI_NOTIFICATION_DIMENSION; ++ else ++ ivilayer->event_mask &= ~IVI_NOTIFICATION_DIMENSION; + + return IVI_SUCCEEDED; + } +@@ -2083,7 +2083,10 @@ ivi_layout_layer_set_position(struct ivi_layout_layer *ivilayer, + prop->dest_x = dest_x; + prop->dest_y = dest_y; + +- ivilayer->event_mask |= IVI_NOTIFICATION_POSITION; ++ if (ivilayer->prop.dest_x != dest_x || ivilayer->prop.dest_y != dest_y) ++ ivilayer->event_mask |= IVI_NOTIFICATION_POSITION; ++ else ++ ivilayer->event_mask &= ~IVI_NOTIFICATION_POSITION; + + return IVI_SUCCEEDED; + } +@@ -2102,7 +2105,10 @@ ivi_layout_layer_set_orientation(struct ivi_layout_layer *ivilayer, + prop = &ivilayer->pending.prop; + prop->orientation = orientation; + +- ivilayer->event_mask |= IVI_NOTIFICATION_ORIENTATION; ++ if (ivilayer->prop.orientation != orientation) ++ ivilayer->event_mask |= IVI_NOTIFICATION_ORIENTATION; ++ else ++ ivilayer->event_mask &= ~IVI_NOTIFICATION_ORIENTATION; + + return IVI_SUCCEEDED; + } +@@ -2134,17 +2140,7 @@ ivi_layout_layer_set_render_order(struct ivi_layout_layer *ivilayer, + return IVI_FAILED; + } + +- if (pSurface == NULL) { +- wl_list_for_each_safe(ivisurf, next, &ivilayer->pending.surface_list, pending.link) { +- if (!wl_list_empty(&ivisurf->pending.link)) { +- wl_list_remove(&ivisurf->pending.link); +- } +- +- wl_list_init(&ivisurf->pending.link); +- } +- ivilayer->event_mask |= IVI_NOTIFICATION_REMOVE; +- return IVI_SUCCEEDED; +- } ++ clear_surface_pending_list(ivilayer); + + for (i = 0; i < number; i++) { + id_surface = &pSurface[i]->id_surface; +@@ -2154,17 +2150,14 @@ ivi_layout_layer_set_render_order(struct ivi_layout_layer *ivilayer, + continue; + } + +- if (!wl_list_empty(&ivisurf->pending.link)) { +- wl_list_remove(&ivisurf->pending.link); +- } +- wl_list_init(&ivisurf->pending.link); ++ wl_list_remove(&ivisurf->pending.link); + wl_list_insert(&ivilayer->pending.surface_list, + &ivisurf->pending.link); + break; + } + } + +- ivilayer->event_mask |= IVI_NOTIFICATION_ADD; ++ ivilayer->order.dirty = 1; + + return IVI_SUCCEEDED; + } +@@ -2183,7 +2176,10 @@ ivi_layout_surface_set_visibility(struct ivi_layout_surface *ivisurf, + prop = &ivisurf->pending.prop; + prop->visibility = newVisibility; + +- ivisurf->event_mask |= IVI_NOTIFICATION_VISIBILITY; ++ if (ivisurf->prop.visibility != newVisibility) ++ ivisurf->event_mask |= IVI_NOTIFICATION_VISIBILITY; ++ else ++ ivisurf->event_mask &= ~IVI_NOTIFICATION_VISIBILITY; + + return IVI_SUCCEEDED; + } +@@ -2205,7 +2201,9 @@ ivi_layout_surface_set_opacity(struct ivi_layout_surface *ivisurf, + { + struct ivi_layout_surface_properties *prop = NULL; + +- if (ivisurf == NULL) { ++ if (ivisurf == NULL || ++ opacity < wl_fixed_from_double(0.0) || ++ wl_fixed_from_double(1.0) < opacity) { + weston_log("ivi_layout_surface_set_opacity: invalid argument\n"); + return IVI_FAILED; + } +@@ -2213,7 +2211,10 @@ ivi_layout_surface_set_opacity(struct ivi_layout_surface *ivisurf, + prop = &ivisurf->pending.prop; + prop->opacity = opacity; + +- ivisurf->event_mask |= IVI_NOTIFICATION_OPACITY; ++ if (ivisurf->prop.opacity != opacity) ++ ivisurf->event_mask |= IVI_NOTIFICATION_OPACITY; ++ else ++ ivisurf->event_mask &= ~IVI_NOTIFICATION_OPACITY; + + return IVI_SUCCEEDED; + } +@@ -2251,7 +2252,12 @@ ivi_layout_surface_set_destination_rectangle(struct ivi_layout_surface *ivisurf, + prop->dest_width = width; + prop->dest_height = height; + +- ivisurf->event_mask |= IVI_NOTIFICATION_DEST_RECT; ++ if (ivisurf->prop.dest_x != x || ivisurf->prop.dest_y != y || ++ ivisurf->prop.dest_width != width || ++ ivisurf->prop.dest_height != height) ++ ivisurf->event_mask |= IVI_NOTIFICATION_DEST_RECT; ++ else ++ ivisurf->event_mask &= ~IVI_NOTIFICATION_DEST_RECT; + + return IVI_SUCCEEDED; + } +@@ -2271,7 +2277,11 @@ ivi_layout_surface_set_dimension(struct ivi_layout_surface *ivisurf, + prop->dest_width = dest_width; + prop->dest_height = dest_height; + +- ivisurf->event_mask |= IVI_NOTIFICATION_DIMENSION; ++ if (ivisurf->prop.dest_width != dest_width || ++ ivisurf->prop.dest_height != dest_height) ++ ivisurf->event_mask |= IVI_NOTIFICATION_DIMENSION; ++ else ++ ivisurf->event_mask &= ~IVI_NOTIFICATION_DIMENSION; + + return IVI_SUCCEEDED; + } +@@ -2306,7 +2316,10 @@ ivi_layout_surface_set_position(struct ivi_layout_surface *ivisurf, + prop->dest_x = dest_x; + prop->dest_y = dest_y; + +- ivisurf->event_mask |= IVI_NOTIFICATION_POSITION; ++ if (ivisurf->prop.dest_x != dest_x || ivisurf->prop.dest_y != dest_y) ++ ivisurf->event_mask |= IVI_NOTIFICATION_POSITION; ++ else ++ ivisurf->event_mask &= ~IVI_NOTIFICATION_POSITION; + + return IVI_SUCCEEDED; + } +@@ -2340,7 +2353,10 @@ ivi_layout_surface_set_orientation(struct ivi_layout_surface *ivisurf, + prop = &ivisurf->pending.prop; + prop->orientation = orientation; + +- ivisurf->event_mask |= IVI_NOTIFICATION_ORIENTATION; ++ if (ivisurf->prop.orientation != orientation) ++ ivisurf->event_mask |= IVI_NOTIFICATION_ORIENTATION; ++ else ++ ivisurf->event_mask &= ~IVI_NOTIFICATION_ORIENTATION; + + return IVI_SUCCEEDED; + } +@@ -2378,17 +2394,14 @@ ivi_layout_screen_add_layer(struct ivi_layout_screen *iviscrn, + + wl_list_for_each_safe(ivilayer, next, &layout->layer_list, link) { + if (ivilayer->id_layer == addlayer->id_layer) { +- if (!wl_list_empty(&ivilayer->pending.link)) { +- wl_list_remove(&ivilayer->pending.link); +- } +- wl_list_init(&ivilayer->pending.link); ++ wl_list_remove(&ivilayer->pending.link); + wl_list_insert(&iviscrn->pending.layer_list, + &ivilayer->pending.link); + break; + } + } + +- iviscrn->event_mask |= IVI_NOTIFICATION_ADD; ++ iviscrn->order.dirty = 1; + + return IVI_SUCCEEDED; + } +@@ -2411,23 +2424,11 @@ ivi_layout_screen_set_render_order(struct ivi_layout_screen *iviscrn, + + wl_list_for_each_safe(ivilayer, next, + &iviscrn->pending.layer_list, pending.link) { ++ wl_list_remove(&ivilayer->pending.link); + wl_list_init(&ivilayer->pending.link); + } + +- wl_list_init(&iviscrn->pending.layer_list); +- +- if (pLayer == NULL) { +- wl_list_for_each_safe(ivilayer, next, &iviscrn->pending.layer_list, pending.link) { +- if (!wl_list_empty(&ivilayer->pending.link)) { +- wl_list_remove(&ivilayer->pending.link); +- } +- +- wl_list_init(&ivilayer->pending.link); +- } +- +- iviscrn->event_mask |= IVI_NOTIFICATION_REMOVE; +- return IVI_SUCCEEDED; +- } ++ assert(wl_list_empty(&iviscrn->pending.layer_list)); + + for (i = 0; i < number; i++) { + id_layer = &pLayer[i]->id_layer; +@@ -2436,17 +2437,14 @@ ivi_layout_screen_set_render_order(struct ivi_layout_screen *iviscrn, + continue; + } + +- if (!wl_list_empty(&ivilayer->pending.link)) { +- wl_list_remove(&ivilayer->pending.link); +- } +- wl_list_init(&ivilayer->pending.link); ++ wl_list_remove(&ivilayer->pending.link); + wl_list_insert(&iviscrn->pending.layer_list, + &ivilayer->pending.link); + break; + } + } + +- iviscrn->event_mask |= IVI_NOTIFICATION_ADD; ++ iviscrn->order.dirty = 1; + + return IVI_SUCCEEDED; + } +@@ -2555,17 +2553,14 @@ ivi_layout_layer_add_surface(struct ivi_layout_layer *ivilayer, + + wl_list_for_each_safe(ivisurf, next, &layout->surface_list, link) { + if (ivisurf->id_surface == addsurf->id_surface) { +- if (!wl_list_empty(&ivisurf->pending.link)) { +- wl_list_remove(&ivisurf->pending.link); +- } +- wl_list_init(&ivisurf->pending.link); ++ wl_list_remove(&ivisurf->pending.link); + wl_list_insert(&ivilayer->pending.surface_list, + &ivisurf->pending.link); + break; + } + } + +- ivilayer->event_mask |= IVI_NOTIFICATION_ADD; ++ ivilayer->order.dirty = 1; + + return IVI_SUCCEEDED; + } +@@ -2585,15 +2580,13 @@ ivi_layout_layer_remove_surface(struct ivi_layout_layer *ivilayer, + wl_list_for_each_safe(ivisurf, next, + &ivilayer->pending.surface_list, pending.link) { + if (ivisurf->id_surface == remsurf->id_surface) { +- if (!wl_list_empty(&ivisurf->pending.link)) { +- wl_list_remove(&ivisurf->pending.link); +- } ++ wl_list_remove(&ivisurf->pending.link); + wl_list_init(&ivisurf->pending.link); + break; + } + } + +- remsurf->event_mask |= IVI_NOTIFICATION_REMOVE; ++ ivilayer->order.dirty = 1; + } + + static int32_t +@@ -2614,7 +2607,12 @@ ivi_layout_surface_set_source_rectangle(struct ivi_layout_surface *ivisurf, + prop->source_width = width; + prop->source_height = height; + +- ivisurf->event_mask |= IVI_NOTIFICATION_SOURCE_RECT; ++ if (ivisurf->prop.source_x != x || ivisurf->prop.source_y != y || ++ ivisurf->prop.source_width != width || ++ ivisurf->prop.source_height != height) ++ ivisurf->event_mask |= IVI_NOTIFICATION_SOURCE_RECT; ++ else ++ ivisurf->event_mask &= ~IVI_NOTIFICATION_SOURCE_RECT; + + return IVI_SUCCEEDED; + } +@@ -2731,7 +2729,7 @@ ivi_layout_get_weston_view(struct ivi_layout_surface *surface) + { + struct weston_view *tmpview = NULL; + +- if(surface == NULL) ++ if (surface == NULL) + return NULL; + + wl_list_for_each(tmpview, &surface->surface->views, surface_link) +@@ -2796,7 +2794,6 @@ ivi_layout_surface_create(struct weston_surface *wl_surface, + return NULL; + } + +- wl_list_init(&ivisurf->link); + wl_signal_init(&ivisurf->property_changed); + wl_signal_init(&ivisurf->configured); + wl_list_init(&ivisurf->layer_list); +@@ -2804,10 +2801,6 @@ ivi_layout_surface_create(struct weston_surface *wl_surface, + ivisurf->layout = layout; + + ivisurf->surface = wl_surface; +- ivisurf->surface_destroy_listener.notify = +- westonsurface_destroy_from_ivisurface; +- wl_resource_add_destroy_listener(wl_surface->resource, +- &ivisurf->surface_destroy_listener); + + tmpview = weston_view_create(wl_surface); + if (tmpview == NULL) { +@@ -2817,17 +2810,8 @@ ivi_layout_surface_create(struct weston_surface *wl_surface, + ivisurf->surface->width_from_buffer = 0; + ivisurf->surface->height_from_buffer = 0; + +- weston_matrix_init(&ivisurf->surface_rotation.matrix); +- weston_matrix_init(&ivisurf->layer_rotation.matrix); +- weston_matrix_init(&ivisurf->surface_pos.matrix); +- weston_matrix_init(&ivisurf->layer_pos.matrix); +- weston_matrix_init(&ivisurf->scaling.matrix); +- +- wl_list_init(&ivisurf->surface_rotation.link); +- wl_list_init(&ivisurf->layer_rotation.link); +- wl_list_init(&ivisurf->surface_pos.link); +- wl_list_init(&ivisurf->layer_pos.link); +- wl_list_init(&ivisurf->scaling.link); ++ weston_matrix_init(&ivisurf->transform.matrix); ++ wl_list_init(&ivisurf->transform.link); + + init_surface_properties(&ivisurf->prop); + ivisurf->event_mask = 0; +@@ -2927,7 +2911,7 @@ static struct ivi_controller_interface ivi_controller_interface = { + .add_notification_remove_layer = ivi_layout_add_notification_remove_layer, + .remove_notification_remove_layer = ivi_layout_remove_notification_remove_layer, + .layer_create_with_dimension = ivi_layout_layer_create_with_dimension, +- .layer_remove = ivi_layout_layer_remove, ++ .layer_destroy = ivi_layout_layer_destroy, + .get_layers = ivi_layout_get_layers, + .get_id_of_layer = ivi_layout_get_id_of_layer, + .get_layer_from_id = ivi_layout_get_layer_from_id, +@@ -2954,7 +2938,7 @@ static struct ivi_controller_interface ivi_controller_interface = { + .layer_set_transition = ivi_layout_layer_set_transition, + + /** +- * screen controller interfaces ++ * screen controller interfaces part1 + */ + .get_screen_from_id = ivi_layout_get_screen_from_id, + .get_screen_resolution = ivi_layout_get_screen_resolution, +@@ -2975,6 +2959,17 @@ static struct ivi_controller_interface ivi_controller_interface = { + */ + .surface_get_size = ivi_layout_surface_get_size, + .surface_dump = ivi_layout_surface_dump, ++ ++ /** ++ * remove notification by callback on property changes of ivi_surface/layer ++ */ ++ .surface_remove_notification_by_callback = ivi_layout_surface_remove_notification_by_callback, ++ .layer_remove_notification_by_callback = ivi_layout_layer_remove_notification_by_callback, ++ ++ /** ++ * screen controller interfaces part2 ++ */ ++ .get_id_of_screen = ivi_layout_get_id_of_screen + }; + + int +diff --git a/ivi-shell/ivi-shell.c b/ivi-shell/ivi-shell.c +index 4a688cc..4c63410 100644 +--- a/ivi-shell/ivi-shell.c ++++ b/ivi-shell/ivi-shell.c +@@ -1,23 +1,26 @@ + /* + * Copyright (C) 2013 DENSO CORPORATION + * +- * Permission to use, copy, modify, distribute, and sell this software and +- * its documentation for any purpose is hereby granted without fee, provided +- * that the above copyright notice appear in all copies and that both that +- * copyright notice and this permission notice appear in supporting +- * documentation, and that the name of the copyright holders not be used in +- * advertising or publicity pertaining to distribution of the software +- * without specific, written prior permission. The copyright holders make +- * no representations about the suitability of this software for any +- * purpose. It is provided "as is" without express or implied warranty. ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * "Software"), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sublicense, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: + * +- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS +- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY +- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +- * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ * The above copyright notice and this permission notice (including the ++ * next paragraph) shall be included in all copies or substantial ++ * portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS ++ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ++ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ++ * SOFTWARE. + */ + + /* +@@ -126,6 +129,22 @@ ivi_shell_surface_configure(struct weston_surface *surface, + } + } + ++static void ++layout_surface_cleanup(struct ivi_shell_surface *ivisurf) ++{ ++ assert(ivisurf->layout_surface != NULL); ++ ++ ivi_layout_surface_destroy(ivisurf->layout_surface); ++ ivisurf->layout_surface = NULL; ++ ++ ivisurf->surface->configure = NULL; ++ ivisurf->surface->configure_private = NULL; ++ ivisurf->surface = NULL; ++ ++ // destroy weston_surface destroy signal. ++ wl_list_remove(&ivisurf->surface_destroy_listener.link); ++} ++ + /* + * The ivi_surface wl_resource destructor. + * +@@ -135,9 +154,18 @@ static void + shell_destroy_shell_surface(struct wl_resource *resource) + { + struct ivi_shell_surface *ivisurf = wl_resource_get_user_data(resource); +- if (ivisurf != NULL) { +- ivisurf->resource = NULL; +- } ++ ++ if (ivisurf == NULL) ++ return; ++ ++ assert(ivisurf->resource == resource); ++ ++ if (ivisurf->layout_surface != NULL) ++ layout_surface_cleanup(ivisurf); ++ ++ wl_list_remove(&ivisurf->link); ++ ++ free(ivisurf); + } + + /* Gets called through the weston_surface destroy signal. */ +@@ -150,21 +178,8 @@ shell_handle_surface_destroy(struct wl_listener *listener, void *data) + + assert(ivisurf != NULL); + +- if (ivisurf->surface!=NULL) { +- ivisurf->surface->configure = NULL; +- ivisurf->surface->configure_private = NULL; +- ivisurf->surface = NULL; +- } +- +- wl_list_remove(&ivisurf->surface_destroy_listener.link); +- wl_list_remove(&ivisurf->link); +- +- if (ivisurf->resource != NULL) { +- wl_resource_set_user_data(ivisurf->resource, NULL); +- ivisurf->resource = NULL; +- } +- free(ivisurf); +- ++ if (ivisurf->layout_surface != NULL) ++ layout_surface_cleanup(ivisurf); + } + + /* Gets called, when a client sends ivi_surface.destroy request. */ +@@ -219,7 +234,7 @@ application_surface_create(struct wl_client *client, + layout_surface = ivi_layout_surface_create(weston_surface, id_surface); + + /* check if id_ivi is already used for wl_surface*/ +- if (layout_surface == NULL){ ++ if (layout_surface == NULL) { + wl_resource_post_error(resource, + IVI_APPLICATION_ERROR_IVI_ID, + "surface_id is already assigned " +@@ -338,8 +353,8 @@ shell_destroy(struct wl_listener *listener, void *data) + } + + static void +-terminate_binding(struct weston_seat *seat, uint32_t time, uint32_t key, +- void *data) ++terminate_binding(struct weston_seat *seat, uint32_t time, ++ uint32_t key, void *data) + { + struct weston_compositor *compositor = data; + +@@ -423,6 +438,8 @@ module_init(struct weston_compositor *compositor, + if (input_panel_setup(shell) < 0) + goto out_settings; + ++ text_backend_init(compositor); ++ + if (wl_global_create(compositor->wl_display, + &ivi_application_interface, 1, + shell, bind_ivi_application) == NULL) +diff --git a/ivi-shell/ivi-shell.h b/ivi-shell/ivi-shell.h +index 2f42173..9a05eb2 100644 +--- a/ivi-shell/ivi-shell.h ++++ b/ivi-shell/ivi-shell.h +@@ -1,23 +1,26 @@ + /* + * Copyright (C) 2013 DENSO CORPORATION + * +- * Permission to use, copy, modify, distribute, and sell this software and +- * its documentation for any purpose is hereby granted without fee, provided +- * that the above copyright notice appear in all copies and that both that +- * copyright notice and this permission notice appear in supporting +- * documentation, and that the name of the copyright holders not be used in +- * advertising or publicity pertaining to distribution of the software +- * without specific, written prior permission. The copyright holders make +- * no representations about the suitability of this software for any +- * purpose. It is provided "as is" without express or implied warranty. ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * "Software"), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sublicense, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: + * +- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS +- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY +- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +- * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ * The above copyright notice and this permission notice (including the ++ * next paragraph) shall be included in all copies or substantial ++ * portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS ++ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ++ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ++ * SOFTWARE. + */ + + #include +@@ -32,6 +35,8 @@ struct ivi_shell + + struct wl_list ivi_surface_list; /* struct ivi_shell_surface::link */ + ++ struct text_backend *text_backend; ++ + struct wl_listener show_input_panel_listener; + struct wl_listener hide_input_panel_listener; + struct wl_listener update_input_panel_listener; +-- +1.8.3.1 + diff --git a/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/background.png b/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/background.png deleted file mode 100644 index 60c317c945ae3a8c9f0875cc59a80fd248692fac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245579 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

OW^!jaQ{x>?5yYBZ9& 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�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

jvuH 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⪻2o(9WT- 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

@%VVMulpvgf#bWYr+`7OIuEXJ1jCB9Y70ql+4 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

F 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ċNrJ^X>KR9^! z_;G(QOp@fTh{o4iFmio_;6V_^X&Qu~G66#7kv5W(%F_N|@bv8bdN?xD&{k1JL+4|9 zr$%CyP1;7wKb@QbCu)Qd1uqsnJ3a4od#lYxrpoOtQXhmA#YuWS9A5VNV(i9H?NKmu zpH!^luO73xeyxU=YVq7!XnE$r2`(3}6CWa4s zj(#E6@BQw9#nq!;0zAjwnCiFV{2h$A8?><)uePgo`4Jlsa!%WN ztI=)eFPi-DnJmf;41~89Pk5zUTsCMLBu!fw$P~6)Dg`Jf@1$=coN=>{S;!SH4bc;o zosq59Oohw@RpBnTixU>!;Vp-co2t=r7@6M(J%XJmv5KZpVy24fuL+VZ7|rX5}k-l)?{h|Yk-Kk@Y`4J^2oR%evVhL$g7)>T9L za-Q4C7N^%V@BaNW{^OwL6J5F3dk{H3veItB4_SB(0LQ`<#YF(Q*T~;v#4Ti5|7P-t zIB4#@uiN!E{~XMkBX>A z@ey(_qf~k^lxx&eJ3+Ow9ve`I+1`&vWo+#~!iak?CHW;kI59R;V>@~;-q3LH_5cR2 zZ!{Z%EN?ThB0=PS!@w2GgJ@2 zs~u|!8sQ~#YJ2VCztZh7g2`@AOQSKO&LW2*NQl6ch+zfBpjfOcFo9ZFJFVD~a z`OQC~M)RWAAI1qU=xE)L<8Fx2xt=v5e{P1utMl`%%?*a~TQQ@9CP^t3M$y*Z{%stG zVZ^~!!XOX=<`XL5Iug}2Z~xv*ho!A`h=50=NURkG_tx5nAAZroA+Aw69nmN#u$TKZ*>;0#a$p6p26vQ4~a>Oj8cPQCass+LGBA zMSs?r>ZK~~S=kRXmY~t%%DnO6HL@45h;aci*N7UKYG+`uSqbu zvb~#JU7S7tHSPAK6zk0fF)g0AuaWFjS!I_49NMc32u_?)PO(59`dmC|WGo*=Y1UY8 z-#dD=_uxS{O@HZJNEP3*AP5c~?mhnG_aE$St+q0iDIyP(;CXnL50BwPP57L~$f_09 zZ3l>C7&h8#-6Z|_v~$%TO3E_Eg;-l}-`hC+=;&Z`J;^eqRGmoCXC8|^LX#GBrOB6p kNydKZTwL{sPcN?i4_e9s)xMViO#lD@07*qoM6N<$g2DV?+yDRo diff --git a/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/home.png b/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/home.png deleted file mode 100644 index af9f60372169a77d2bb18decbf52bb769bfa0c59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4629 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 LNkvXXu0mjf_(~g- diff --git a/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/icon_ivi_clickdot.png b/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/icon_ivi_clickdot.png deleted file mode 100644 index 711bcfcbd616fc6715053a87bc2cb7410caf3493..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39523 zcmW)nWk6KV*T?U&bax{SQnG|}EZrRnNOvgRwRAV=(kUq*Qa?HcL{hrDyBi+<&#Sp_ zX70?KbMKts7L@nO#;TF zDG~r=kSj<_XnPqQwR!$D{GEPWS!UpV@O(EM3uZFs9+VTr$d6?R#Z`!8_$5zAp9oFQ za*e0k$qK1)2ADB@(W`zb;IT6uS|Bi9p-^_S}5uvX3O>^F&{2gZ_NFEU8v z@w8{pFQ}KZ?J`+!(mL0F8W%b6L(@y9V>?-;VGAEZXa!}i=Mdw!PiDj`PubS6E^7Zv z4SHKIRfb+e&n2QIkA=_SUhmp2|3zA(8s41sQzumYw;ny@c)dg`ww-s_M5}nbz}i{Q z&HvmaGRoh67Pq@2{^BjQk^6F&Tj)9>*x$-?(VfBXgBAZW-PmsF=LS1y?07nQ-AMP3 zA^mTBhkoGL56p|4576rYAKU%B>mH6<2+#+pavv6V3SKv%h7rMG2jS}4p6kyyLl3?3 z_mz6Jeaa%5Tk*ojkzbnkiU(bzcm=K|wF*mee9F%S^X~)?e$)=}{MR9o*SPFcp`kcUL+BQ2_E&!jNWpRa7)4p_@fltc{CT-!gUtU`Ro?cW}bMFS&QhBNfCEm zm~;JpfdF+%+u<|Hzg(YCGV#iW>u;aKNQ@veFfzffGU88{6Ffktx4cbf)DDnEgUgG6 z0nFCCI#p%T$YQ2F7~ju@ebi&wdneuXOUIMPh3HLB!1mm@fY*mQWq77Fg1SKX%6K@y zND4c-ZR3YQJpsV}{5NL+*Z%%~ImJd_Tnw0GzX&w124f5f16cYQgTCx{^0^JT0PwDOd0)-fHu=N z@usJu%2E5HHSd5^ikZ-w+t9mPDr5xUza7z=Me`~U>Y3;&kkUjBtajZUOjlM+u(JaI z&8vGhB#k^`jdkvd5cDDfS>D^};blqdUzIFYzQ{C zjSdJbB?#@my%>3h#+dn+BLF5rdLvne?o&GBS%R)ZlwUyrY>0dk1SFU3QX?*Mfy#wn zOi1D2ZM`O!@1_V2r$lVJqyWsD#)A|sd>u~V*ve&zOG>;qbXK}olI0RT4w&dyA+5WL z7BwOPY`^u`j=P?k-f0rqwmHoG!USlN02GFZYRw0rQ&@jyYzfzd<<7?;8BZG^ba^~h>~1qfNOmhg2efJ}{-76% zoG>lsdAw-T8;Lg#LZQUH&(|7QH0VosaXtgk5>p4gfHE0rPJl zz~py5&07lHbxOcw@85UiQh+01gY*L!7;uU`bAU_g@<1shrS^c%(cvuZ*X3`Gmp3eY zX|buOY~a42cHs*LfV^V>$`1y5<0BqJ2~;5f3{lpM{*Ng(Y4XZAu8FiVz(A*rsWty{ zk^Q<8{409yizop69|ABGWzk2uX4H;sQctMunS4%dZA#6i&hVhp> zj-)9_vgT0B2sA!SlG`x(Db_xRe zDeU;6JMo->cYn!>+0enszCAvs=zh0r5$Rnb+EYNl{X}j?J(Y;p&-4fS1d)HYVE8CE zH53JC);n)m1tw~L;-*}6cALnH#Mg=eaICUOpD!xl)@>NLKd;+0HmwzgFC_|P`#0piggEa1_XaK;AxC#df2=U3{(44Byo_+dj#}45iwU!E` z42i}m+=#8a*%bQp?P1m?Vk%tV&F517P4F!ME6Ki_``oz14TiX;SD^y9%{Hb#>cs)S z&irVC(+KfL)4G*_2bqXBKBaoD)4RKc3Gq&oBp~2oNFS<1h6RL1$csJSZY&0sM^%2% zxp$AZS1p94gHTap#?$+^w`-=nFF>oz;&)L=vo`L>(2NgAu#>=-2lt%?dr&dMjt&UO zf}tWq(LTdm<@FH+G7*5u=GU{FpIpGnL|-tc?^yO5o4{(t)EG6$pM24 zcuH^N7i5u@qr|~wv3Fs7Qv-L`ABT|eBNFFf$~-fxl)UdNoVV=&s_uQk?)@S66}Y`J zDRQv}Jvaq(1*;g-POMm!erLg)>pP_EhwSXodjS*zOdhP}0|1IM|3W2uLJ^zOsCui0 zTFuAfu!I zBvCgBQuGBJmqji-YeW96_uz<&=>O-G-(*xfv&XT6=d$Mib0>1+=IhSBh};El^YX7f-1-OHWfB2q=%L{0XKI_HfXedAqMNrqvNg#>1pvXOpC0 zLE9@?Jg>leQA{>Q!+}?sUyT5qD0&bHKFIs3r%dYobFv=EB8ww`U+(s9 zaJ&4%cN8zsx+)@ln;y#+P$o~#4aT1|f_vYdu7!oFz2RpSw~cS$t*N#JHnr%tqE?bE z!!9GvNZ3D))v-*{c4F5$+L7C!119TaJXUbhg3o-3H*^t{E|Cf!0Z6fOx*4p1(*}T% z^F3egO{j#^m%%Lpk`7dvW)A0ShfgwnK*BdCFnKoKF+#ve3JOE#fm3J!6Pl?_<`M+~r1eX|tpi9vugzS=r>-0zdhM zZ&yQ9q+yR%75E#w^zn*1_?oF>`43KQARuv_fJqr5qY7tnoBI9-nN`d(9RToiJy|ZC zd3nyVU4<|gC~Wd90h(CrmSF_sRzg0 z@<;leb&=j3m~O8%{fOlCft!4_~^mKtK zlJMxVsQDy9xZ|enBt5iD_DAjSK@A81KjR8D3e7XnAkfX;*>cPy>p6)4 z@X3GD^ia@Z>RWO6<1&RdB#eC#Qb2oc#>_tdhjABTS;0F+wd08aj77sgwk&C3_va1c ztui(%fjcYIa(SAwz6_=sW(D+9d1irV@niXjP~B0w+^U+qL3)iqXF|XwJ^fjt9}1OQ zqN!qcD8o!ACB(Xg7dQ^7lbPt;W@dBN`mk$ylA@~occ*>+B(G;TlcaE`(%Jw7Ll;!E zibDL4zZcoVvjc?LemCsMH-+0fO|v>>ZNO2b6!lI(fD{YUdi6LDX>dYQ0hFbV=Yx(6>8x^m{JxT#H!3oR&+etO zgmlh^`p%{v4vO15+2daZc#Hl7FTrc7@#S`!_ybSvFn~_Ce(JzhmZE$=zTQc%br8a& zD;&;kO4>Xm<%kh8uu#ICKxj0CQir;K&c$Y zzeo(g(3~%6)0<4@z=a%%JnEZd5ob|v5}V|*K|=}J-%2{A-m~sVEAML@B_gW+oqzKC~52$SYwgNqShl?Kwy= zE=;-*>i2;AYyE>N0nkR{BHm2QhGhE$;-JYQS`;on(x{^Wg`J}#{~L(;sXY*UDavqX zqxH^aXPF9W8;YEP3~2jPy7t~`%w#%u<8k+V-SKmHyjckp_c`rCDKw84ES@PDnRjBK z`ORaFFs}N8ibzCl@Lchqkyi)4>+lq$ z{ju5nG(@!iNJw$^2nlqY(Ixlp7^yKp{>h64;6A(_$G%dxakvgOwBAmHxfjYYL_HL#m#} z=%T$LjW`461d9LfHOnie%%UGtL}I}=%f6$K;eX$i9%8epGvuQ) zB6V@A4rAt(h}MBI+GtgSOAfFyD;OwiaeD|#2LXpB%0VIp1yrP>*DP2}Dsa{|?w_TS zd70;=E^oY;0}E4B?v#)IYpiVi?^Q}r&L_5CRIu59bxFsyJ*KH|X4FE9xEEGE%A_Kx ze-kW<-n>c69qBB6oE;qAM5_z=Z^0ca+5glK_j-}C`Qa4%2imZnS9R{o<4$qP1Ww>> zkImKols^;YLe z)Q}@1$gd{AA02&2yp$#~GfucM?;C%=w~-*u7yA-p{MgN_nV*~#TGd`vc7-_Mpn6k^ z323i}8Brp4IZLO%Qx4YdT0UV@5S58hctJ=`wK-7vYGz#b1Y&>W7l3G7z3k;av)m6m z2AF64cNiba^ivRSlS!a;z1dQS348)}@Ootk)Ex$M{DO{~NwEL+U<(g9Fd|<}to&>_ zo;p78aCav=!k|Hh@BNeh%X@9#*~c6d)yF8>CZ*Z3QtR3_O_insg1OVI5#+hx^wX4E z8vosAqoXM*K60A;uut%jgh6agkFqh;Xs=B^AOHK5ynlPd+4vVB%t;~e)s>(FDR6q; zvl|*^(-$Qgwc+SGuk%fs@tVZMfa@Of+QSvOkC|I49yy5|7Nc#MQ3fCgSl)%+IRn@3 z1xF%*53mYT07~9XiAypEn?$&r8fq7jENBF^W45lhrO%r9QPvVNjnkjKYB^kaelv!i z=?$9}cHOt37JEIjXUB~R&OSVbyyp(DF;%kFRJjgQ6N-w7>)%MJ_e>KBHnNU7De0~S zT(h?VEDDRJYKU1rn})c9g`BjpYKS3qmaPx|qI46erk?SY$R4jl@NI7o+~Q)!$_T_x zZ?);%^SlV?J1fr@FmUsrbs>yE#Hlh)hsX3kyPp4bgEy0F@pG$TfuZyyC-(hxXLHs- zCfPyhbiSM%Lj`b_9MsE+;v0SW=c zgmTnjO49+y95J!;s>wteXqs*sH)QgD74-mMVY7bLj{+keGsx+?&Evo)-#2nJ4_t}ka$GohQ!`4H zzCEpuQKLU)z(D+abQ6>3G`0`d(Vqf;-Ij_-FEKl#xb~_@OA4E`@XpuZ-7xpgED)qM zNcZitowUAo(Ik3EH;goCRUu=Jh;rW4kd0%`ea7&*UJ}7557Qy(hYz`Ysj#^cG|J*Pwcf-W%(4X~Q9)S+YODkwc)=;Rd@Sk2Va~4Sey!u2)=_)^sR}J-Ic<8S3GlTzw2!brfcHZ z#h4ThS=viC2InGsMtMQgm?4@RbC}YkKIE-_L26S;WSeWQ&u7yZ1fU4Ffloy_x|yOe zMg5eY-JoHpZqrN)FF8)Kg=Hh66Acx*N&&^#Jzy1ok0}7L{jO@uy{79z`PK>naB}$9 zpO<|xTn{-LtGd^uX!IDBm^%2Z0YEjeEZcESJgrCYa+&`D7ZV1sS+SHO&!sJaecS=L zycirz36$;j;&YzdO~$;r#P6tM1$&U0R+2R(Rzi&@5Fh!U)2c%fy|j-P@#d<|dE6bB zLPd(nleT_rl}5g<;(;+Bph$c!pmc4CYwu71oOr)P|FS`}I)C zz@=+olX*-EG>qJVeDU|8^Az^xC4wa#XJ$_E`1dgXii2{FE*z6ZO*(85m6v_{>|y1l zeJ?<{&w_1c8GmHS3;_CqAqvHNBR{E!5)gO9LQiflAJFNRl0NR__*N-A2iefBFSkdb zk77;G??ow|K0*Xepc5L}K7MRAJTQa|mA4L2(^CC(+f3CabbrC$dQdmWB=0Bo~qJ(?|+;aIhV08=>x+ri7_E@@XRNa8_moQu+*Lrz#T~ASck`~Cz8bUCPRk@f#=STLjx z-fZgTC0)8xE3zHvUM+GU0H;+3C%&G7;p#gI^J`+I?T~24{vPGjTl^Vj%&4aY3WNBC zoDdro2q8XIKTC4jCJUv{C1YoYgzqoeN1|5F<-kr-j(pbq`FMFk@j2wuP0b%4Yr1Vd z4vD+Q^U1`^IqvPLUp?_nIcJIjP=VR!(CLAqgZQZM+qZLJf9P7}!Z@#hcH|b45 z%J{1=ZUP0wCFfc>=<5fy5Lg+VB_lMuazs~%rTu7muC=u5jJAE%*0>gZa7ho}9 zd^GUcH6>a39BXunATM-dqWERo7CQY^&S0G^YNs~9yMH5-rXQh0)p4x+p7r8lF_RI1 zE^bcIKP|}6G@vp2-=41a?7q_~FdpNI^@`hy|NpA#O;0 zlDEprg|OXV$za3f4n6(wX3sa}Xx5%mZ4FdV1riPCW*Qt$Drsu;5CHFOc{E8CG1~Xd zxVUeoLKwcS4$-H|i?#St9fMY(y`dD&MV|+=!%#QyO5|j=(@p%c@&s5~w3cpmz80}T zNjotaQEOCf6ad7|C{CmWF+@VY(Z%k^P3qGZl`@_8igImNx5N0r&nDUcm*-4IFI3_P zBK(Lreuep{_+QcmH%GStn{C}U+aD7?Ww{gZ!PYAFACV^ z9)^aSPnO5hHCA+?UqyO{UvC6F>{6qy*6<4KTEEG@+1}5d>dRJyBF>s@cT$RQ^6{$5<$T{4ZoJ3z-XSoBHutQ;5;+p- z?1FV=HHq!DrWaEo?*fSMDUXQ*0qB%g3qf2vc<}ja(2mgV6V; z{IPr;V+Bo#t?SPV$3~wRXiQZ!6O!(2Smh1sa&q`YA3eh)(C+dDLES~C_(&jaTgPzY zUa6gcLWvk>niaHtF@iA4kH6Jl<;89gyIGa{X~z7}uBxq)mN-D`o)JTZ4l8@iXAwerO01^5dAj|ACef zw}jkwxHxh$EQiEL0YJNdFdQqCR|!l+im3RPk&mRC#VM%0^Z~Bvwh8*L9D!(P^kMy|zp;iTrL?^DVcTWM z3IvpHKzLOPMOqfW9(VW3Gn+jSqHPI&GYMe89a4KtzYXvdDoDH*xcQHn6;hAf@vwBF z48r;ssC8nvOCWOb=Rz~`;#j0z>>bvcXRE4l!4mJC-0T)H3;>tjW1BPJ41>VlBU?ov6?Gwr0A|7H7cppT zAqOTV!~qe*(JXGuG+C1#{o}14&0Nu9V71VTe2SxN%qpmM|YJuEqTFc+(b{c-` z!%$t94&5^t??=4fckZPCzyys<;KRa7Mlki?AEAH-vvWaGs9D90Wb#x)dLNhk8&S+C zCW)bDva+vo+KUu>s(zGZYCk9+n#eMnO3=PNhY=F3nM>^Rtc31Lwtp=j?aKhh_-+ca zT@A0ug!-?XUvuNR$~uP_mhu}DNCpf6UH(dB9Rczma%f~BPI#}y+rMg#;Z9y+_mdl1 zd6MxBpJYa-heVqPVvoHG|m zpSCtv4p-@$H#rneMP;nMV93s}uE=~l+T?S}V61rYM7!_A+|xU+D;5CiGQW;rgx4F* z5Y&abkT&(QQ72hG$MN5pU&@=z^p${Y-x8 za>2g4aDV*=*Ifc~V4t^K2tTdW6*Ub)^~SwOJh?+YOm3@p15+wlZN<>G9*z%*Jz@y; z__u&IT`ZrH0^2MJdOMdO@N6?Sr~JTCr4R~UL3vN;QL@~g2fDhxvb(vsLIY^DLsigw z2&M~lvp$L{f979ARl&^bJduCz>)@F-dLBF7nrABC;z?(B)4gzDnlVdg!SJ3{yg`Ub zx7PhuKpvpV&YQg7x z9k;`$Y0|nDP?Z`0BqJ6_{EWQVNM&UuU*l)}hblN88=PqD2@w}VIn?h&&7@ZIPMg0u zHk$l(un|-O8=MwiJ)~z$Z~9$l7j6qO<7P=m>CSf3v-7n0e%L0|!H>=7j{qd9TI`KC zV1%=|T(41v-ko8YOnAr@r%yplh+$|`>B#Wm*}tMHb$lqf&Hk*nv)2>};;u@!)ns|n z=PC0_l0>Y5MjyWC1k8*)4TADtXNeiEg`Otns8KnS9&l0mDF1vsFA{t(KO`3Urf)BP za?OJPVkerM{zI-orDsAdiBK%YN`<%+PHY0lgWLK`fbDKtueT0fjnnC>_Ni^)UA?LR z1NZWd)#NNIhOH~!&l_j<`L_Lvtd_F)nyUx6s@JXUs)QXU6xOz)Y(;%yRsnV%OI|;8 z{MJym+~~UE^2c$fR1JV?q)~b>t?}Fa>v*jYWPG|h9^kH}@^#8sV`2W*###E}4ai(92!YDVXu-MPhzJe6aN{7C)mQx%P^OwetC8^1CP7QEY3-_JSDm z&IT`oA^h5I_#UTuqfL0mfim)*5|~XS;0nl6JNlA>6_i3F)s43lIv_z~6+gK6C28&_j43{v>fKd_!)qcW+qqQVEjqd%J^H5 z5_(T*Qyvad8~bh1e6k3pPYB$;)f&#Ka^P< zur1k*sg}yn#C`i}2h|rzgsn#iQ*z(hMU=UwZXdsg^XYedcv*+`9rhJ2{%?j(&@<&ov}zgXy0BdoLcbKsKsm z|E%EvH(!A?_uatk3&V|eTi+WY4||2eXVw~z{;Gd8vZ!uqDHo?`VfSC|o^J|G?FxQ{ z>?0xTjIoz5cP#bmZAYA$2ti>ED$@;1H|U0=e6a6tqpP%1rKLJbuLCZ_e28)q%;mo? zYmcYCPDY^0#K&ydtER?zp(Ya2^x5|}LgE_?(#x>fcK^U-5DQBFE06hr3=AC7Q_c_g zUXlQZG$s4Mo$z8!Cj3R-@WE8D>^S*e$iTI(C4SCGTywIV*?rWAt;OXmqGx*VyhXnuVBX+pW;!! zFZ=zw-KZi;V)Lt64h!;y{%s=qCKG;|{M7o#>njCgk?7{*g8m($)Nkl9oTIo&#`Pt& zXx1zY+9EycEB|>(cLgVT8T2+vfN7Yt;hdq`qN{5g2H&)K$!7NiBBkA5SIGwJ&Ju%`wqZ&i^+3l?BMuT zynVpk9vfS`;+ zK%<~P+(Vr=xlP3@zVKI(f;6c=3S?}9}GZw#iXcran!pvdr5+9VfQO37az8a+7JNs z3yl?rtd6wGl0&79MAP%6`_~$7%7fWHYjSWe1u4NFWT@n3Z;C;732pLyOSHEbeT3P! z!|@hEbjzxEU2O|^cZ@d5F)iK8kI9A4MDHkBQFMt4?E1NGtx)6Ez-CxAC$FfY#|Piq zqZK%Two_fuaVhH63Yv*z26#~36V@q;%meeotV56-LM>P>b>Bwl{ALLb)>jtEnS8pG zoQ*zuL$G-yXIPko;v7Ic+a`y{HMg;7o=A?1H1y&hR&7E~T-aFpDGn0hPRYedcx|$i zTnp<>pDXryq#2%hcYa7+a`n9H*%70v<^N)$P`<>d;Yo1nz_z`jc($J}XxSCls+MLh zr(_SF-F*&)ns^qdpCH*2uX57WV#5y6BHk&-5-SMtmQ6Pfj0?zNi?>^^#&m%q=@Tgd zXaPTS+7`I;n?2x!1pLee@|1wFVlIbSCyrUKjiY`(NpR;j|4bt^#gmgHGRs^xp3)Mw zuUHnt*J3wF_?enXVfxGJ{_#OvYF#$-%Ik94PW(rQMqkri%amH^r>3-rmROrc$U}VR zIcw09Q`!B(zEN(9;B^AR_|aQT&2l#)nlF3ly&^WjN}D#VTGy8|seYm9uJ?O?_g8f6 z#SE~O@%?bsfsN%c)f||MZ8;JxGL>n$ndW+^4CI`$FDk>~Ljn)3YswCtwt>!pgXOWl z;Ej_^5USjHs|{Pi-+s3q6@HngWr7+#EC7Hr1El3qKlqy6D0@Vg14shn)1p1|i?BSF z7+HDKWyPA?6HuV$FAXo82)XY<+A-3)eH)FCPXw-?NzH4q9Vu+;F&+o2dU#H%Atdqd ze2(z0rRGhPGMCmX<}pi0@#btCOu>dxImDhu=d(_%VwLYvWX#%ZklSz)};JVZQ9w|_vK z+v7($^VJA2>z2-b%PQaBhtnmzHJnzh@E!{}4MwBpHNA@+QC^cI4P3dY6zgcOS%dYM;PpW9ZQJ4I4@DtPdd++tM|Q=g0>a^1L#Q!y2-oZjMB z%1RC<&4+hCSn4E?MP$TYG39d8?qef17+xiQ3jTIqFQS_r{-sk&n5~rGo+HtArDbh7 zJ}RNTusb>I75O3W#O1*5c?Ww6oMT=ihZEuKA(p8Nd>b73^WYD6;2uKpSs=id!XSND z^3~VRlR#d$8b>34z5qdL*WvHeKP65jqMSEzW4`qlMiB!CFEH(w4~Q9XbD5dz`qWPZ z#R%hIbQ=MApZOo4FC_zO{CYLcJtCjzp|cj_H6xJqaXHSU+Rw4(%TxB6w4eXZ{I}>? z71;kSWiV!PC#OQUQk4$(eO~J;haR^bT$>ExAlI3|7wxasv3eICc*7X@^f>EjOgRQr z*-L{<2U`~t)hVOci!U{7mf0^{-yni7CN}Y@!<_r%6}A0y3O45d*i7RjUpXR1emV)Y zCW}%=W5dJjR;o>&T=+KCqU!m z)Ggp0fCb-|w?z*XKht8@mp*=kPd^DUn*65B&xVx#M_K*zm*p2ff=$N66p#tH*nO1< z_?4mdqsg7kpu{TR2DCcf|0bcT$%v`*TiaVGj~MXnkLrhLCYH<_CBu2ok*wl$YNr0V z2%p&f|0HYHY=3o)AHX-<`5R#sLPvqAprC~`6zL)V>>@i_;K3MPoriy+ z>UE8F#T7|4k&cR0vNV+Ng5;Z4-x+hHSieo>_dXn*3m6KKqYRfYpwB`hSfj-m4>Ekv zxPL;}q6eaX+yp3|+G?9SIH=6+T1eL=;QOJr;e&*Y8ONsct>5G2pg`%=KoOgfcnD+C zK-#@i58I*5vp=%TNM3jNE>-vN=$gutbwyGAf{hN3kK+~O@|Jo5BN=AH-_WdiJ zyU8<`nc0l<$GAMgo3zbfu0*<5s3|vEtPTYzuV6gqbv%QQeLSL@9K%~QwzM+SgquuBL8;E3LTbent60l;+L%gQ(BcjLVg)Qe&-b<-jK zlM6BXF{>{Rru@K8j4>e)bg!Tw^HQC0I=Sd9@)GdNI;!LO$T5%yy94XnC)OyQ!lT%z zqJl3uz5qh)<_DAG@*grh{U%ncyFH8aSiW)lS8+X!n>k;glKo5kw8PRd_D@tWlQ6l2|nOsg)%t%vgp+J3qyUj)P78TbseV7JDkBj+UqAXH(uFL)_J z(ZI5M(Oh=0q8Z9k=B5(lH3$1w6oyK^f@}Qg3Ia7|MMd}hpu3}u?SB&N+(;I5k} zOrfPP$;~K8dGBO<7Mfo!+9bx|yVCbx43V$~hq@WFaUjJxgwb)14m<}ct+n~e_)60- zo$%;b{XHG3C2ZFU>fx|>-u``NsK0Lud`v)IEkTILg5{%7l!f&uoc}d`=GJF8;e2rn zb&_LivFGxLiZ&8Ul*@upD^L6Y|Go*`_LidX?z76uXMbA`ISKJsLKyjFXibG77Vi1|M z$b~xa`WpL3bUtHXi*FF7mHA{!rc@8M;JjX|)GAix>73lHk9oAPbW33gbv;M*>(bm8 zx9POTy#%cy4k17V&~fQf1@-+XSwb^pqtZh>(ye3W6hiJ2lA5mu=o82Z#q{=a=(mL5 zrqDIv|5cUlG}TKZ8ziobp4@@g{QAumVS*nS&-#Ow?&tY9yzL7;=VV@ov_|xLYh1h3 zRFg!Z0F;lniHgu-;^8Y};2v7nMxSQ=QtT(g&+^`{l^2w|hrF+UL}@rE`k!oi zsf}suD?UZ6f*~h<)f9+Y>w8@e>H8o<|B5>qzH6X zLBww5ic%flAD^q=1_l+q<>5yNAF}E6rJz$Mbqs%Gk~UmU!Le@A)Hyg#B4|Ss_kHp; zp!?kvX-)l;+0Qm58eN4OhcLWG;$7l?G`_-vBYmx!U&mHD<;KeNcJyR)@-^Q=9GJPL6z#A`gc2cg?8E$ zfzLr-Qkj7>`)xw&QzaZ8vG3>kk!8TMT{<=)vpn)oT=`btjmz=fU$*5E_}agER|kXS zYE^J=gepWx8 z0%4@1v9wp_qz17Sq2C7kssCW?pW~t#pZnxi}|`p;)rlH>g35UXB7QYF!8Fowxv3TWN0!!V1dJjcs~H+TMa*S&ojQ&|x@*A&Q9f|L!GdD_T6X84gf zMqBe2$^Y{_>>Xu;d_8DHE{jBWIEOqtZEQ?^c;(>?9#22uuD{l&!B-C6{X5)VR_}gY zi;>SsAdphlYM*luP2i8XMR8N;p!t^mks#%~2;w$@Cr5(ZLEiYavHv}-XxyC9k5eb6 zTJL@hNa3+QvFE;xPthVHAkZ=i9!x%qoe^A@Ob>lC%iGgAoTardZcn4Hjf|KELhB^BvZnOG57+kCH*l@CMkR5b?+-XKZ+dZauyuu5P4hlyG=Q{z7 z27nXrjS4;hZ1{&1x4(;4)hgM{XSl9t9~HV>dDYd1`R`DZOKeEaM`f*ZumzlM#m- zemU?%>IZN+{Q$D%z*m|)fQ-$oMWkSZ3@$vwqfqGr2o18KI+7dk;)^etP~j{U3Yi2I zB(I+g)4>0mA^KL&$zx(Rs35D1?!D`^2`L?L%52z10KpzhyKuA&LU2@B5>hMACafhj z6}5FgP{2a3eV7WVd671?n5%U!DjjxBfUG&tr4;0SjRP4|h%7-i?kH*kQX0BVKn@yj4vP;pL>YQLXOxTRJ+0Jvy%(al?HK@fV zyi`Q<^@%`FC=p04!QPRh#>mRbTT(lpzTXa}$f!r`4J^;dic2Y*MqmR-|-+c3}=xDsG z%GY-%j6LKQNSfTJ+-|DTX#ahn+FIibt2(j%alUVX-}C$p&EBKRdG3Of=tCHVbW)N_ z$bnd(1Q(ZpL!rr{@MI_h5oTp$762E*2XIVzY63zQjQr1BKqE4u0plDlX-Wu}F2ql& zN$6RUrc}Tgfb}F~RR<&a4i{a#$`saItHKiU`&2W3{+^ZwHRPlTSN6dhYobjE#D+nkr0_dN#0Y zc;-0woR3l@>BQ*`am)!mzjVNp; z#oB~bQ(eZzp2hs4KnivC*U^#XSz@l|0#jV)w2C(%0XGQ9%Z0APVc%@{r8@dG^aHD615mxpd5=45;`Hq z>XNSl{|K5ADcJ0K96GL4n`yulP0iT`yz`~^FSwSWp`37NqZ(m-Q_v@*0muY!0lj`_XU;Z6g(^XK>O>{?00>pQ{EaYe*|E7qB_``1P`?V( zJv~BT;wfSw{{F-hPa5V&B|Spk=8-Cm&6C0*71Vvsy@m`C1T` z+596VwfT*)M-!t<41VYlN1EMVs2N}%z9UqG)um?#L>s?md=AeuKs0c=`Zf}oAXzA8 z{;n+WSJd3d3z?x5UNi}=_qwtMar$9G`e9YeOn~KSDzu6ldR}0fk?>oqexK0!Wei+R z>IY2JL_0J2D@CKC30?M_eiVSFpqF1K4d4x_S~d^Bng9bu{EJk^ik*0fLU`D}5Hay$ z3N5aa>cC=Q?;oWYHH+Aa>R0vL;6xQnP>o4T3SmOkdioBZ2j1~N{NWGA>34$cadH^| zmvkf&+Jcpbr`^FwkV zqMol^zaiR3c?+#v(>{BD`6!N6P6v!inlRdgc~3_>G=EnB08A?Ym3)eqUw$QeVB`+pN|pT{sy3_?U2s%-cXE7t&q`{(pQ#82 z1oo?6{mP`3o~3qPR(fWbJSF^cNxi$Ir#tr0V$PEtOStsaS6_>cS7(~RBSvM8@y`kV ze~_-LffSx9GweD!DBo1s?S1kk9HWxhk>e(q-_7uzq3HiUU<{T3I8=E8agD&e2Dkqp;Xl3RSBMulgBATuCRM$$IBE-5>IqWHuT4t^IiF6)1YD~27kVU4U>W3eGGrH}L zJEOUhl>8RFZUaETdkqnz9VqROOgjX_9MQ;LTD!72i8Y6K08m3mjyC5Kjd=h4uNo5) z;A4LCw1(6vEwkuUss4mvDYvE)G6WbQ^UtM|sV78VP<5o%PsdS8^3ROYDGQWT&q_C9Es;XJZHPkT7 zB?7_M-+0qVeg;x>oN~&2La)s10Y>9m`zOgO&r1R>Q*)In025+1-gCTS;glc~i9tHA zkUc#?9{yMg$98)wV<6j@(-BC~k9TD<5|YDj!8KifM*Mf|ob)vS-VgKXNc982k^0rI zeoe(w*O}}_vu1&F_|9H$@bHn*;W9VTJ_$(=mr!cf=@<^vWu>^EcvF?p>W<5C;#JaI z8+A|?9G@Enc+1NKq}-R7K1Ct(w9w>Nqi&IbMde#K-@U3NFRrl50|0-a%c2S8QmLk{ zBgL?}7aV-3RMA(X?1QOYdEEJ!pMte%?!A@!38z$ID5(vx2(*!Jl8p7H`R)G{6!0+YoLpdmsbq| zaV}-G8w7Gldssg>Ld&56VrdeCD>A1_ZjS(c%skfPWx zDZZp1({h|{%Jf*E@Fv^auzF|Ua6CCqDW-ouz`{LFQ_e?O??nH(c|TH`>BLLJ6y|um zl6o3drx8lz8{8)U2K@>eJ>MQ5qL&);hMU0@C8~v@A9(_!6_c^*xkbY2AXV^M0C?rK z*Q0wLel%Ks1!U z6CQCF-A${UD7&5(*KEMXLQ<`{A5i_A-P(euIN?Bn~ zh%xE1Gfs{${4rby#+s%wAk9ZSPKJ9rpceRJ-8)2%}PENV5*wq%)r; zNy^rTcu6oJ24&v>%+F^9$|RbF068R>vLV>~e2OyWs!IF2icflKRDCA*I2^cl-5qNH z0Ki=WfU_>UD(d&*+cf~VL;x^d2`MASPmK0fRo`w>U%UIIs=iE77^?;#SyepLTL86l zoTLzvAKwOf?5LQul)~vp-Z}Z~u6kRXnrRDg;yiwzQDA<|C-y&}XW#+K^KS-R$m2iZ z#FGp#)0%s^Hnp6bZpD??c08`Q3nsV(avv-M()F2QA@V>jP}wcoOVDNwm}Qnhc~-Wb zf9|>Gl}3J?>0yw`mGGQ?wP-=?pMfz^e=ikH(#rc3nID8rtI$hhG&@){&aezTINC-3 zZ|fM?p6kWW>5po_vrqtVX9@tXMRz>(NObxoS4RC_@Bm<%oJzZC@^{l@hbLi(zGv`K z_V4)rtvsN+Xhn-$9j*@uqcGBt*%g4C8R#R0TxlSPpy5jpPs9l2W@mG)SCKL zJm$5`iNg&a5R!kzDuJWPNURTm=1ER+1=#fChbou8TdBJH>-`CN=B;TFv#yY4Myc{z z6)g?ab$xo<1;%P{?5yMa%Bb{i1z_d!qYD5pOYq&k@sa414FZ7Y9RS!Mw4JIH;LMG= zft}xDI9_MaY{|rUWQ~cqNWmypCYXX z$4(WyzsMhg`iX;amTJ>)P^v7Uv-#>|GZ3Fbj`ung&mJcA_prl{Fr~26+2cIKp+*K> z-e#IsbE!{ws?`*vlGvF`q%Mh0XDG+xpX5|re&Gsv?g@VuOI_BNwIh;pw8F(C^#C4} zgHO@3?j`LZL<2<G~@w0Dz0I711WEQq@$HAd@?B@>rFxC61u-xyd1Mf={5NGAHcfN;{-7)o|pGL!4y# z(dQlq7dGZ})wJX2teSscW;-raoA3u@L*q|5PU*db8#$-m-x0rW#@n03_E#ubhLl_C z1Bg^iQp94Aq`q6MWWrTmsc0bx1QMf|;}Oy*XxIw#uT|60iSpF%sl*+l4Kf10AQ*Lb zJv#|V_df8T!i3*2E#r<;V$W!4QhTU=#McT7RqKS-cGrEMRv7v|0pI@kq4fWrWTwsW zUI!dnGXVgATOWKlI&qxQ(V*&&gxnk%yXreF5CGhf_y7QaTLb_nth+qw z_p0d%9Jd9xO+l-~9?L?4K9Txqx3z3BCq{3GJ0|cN6KADn2xwd>6%$y^A2D1G&9mg# zqn*^{YE^c$y2g-D@{)>Au2DJU^m+56T}2#rl&MmMzw5qp7AzE~JPEFro!c@mA<=WO;Y!FCMCCEG1fsK{Setkhe%ZTT+9ynOT;bMM5o)ir|@Zd%h z8in~&FwP{R!~jAT9@(K}Nm3DtgOhGN0Es=XO7fO3AchDi4_BrjA?TITe#T6kT+=|D z_hl~1fFx{oxIQb_msR4VD*>CTOxVnEU(~(ZF+u=vtOWqKEAR~2t!~NMa}<@&tiFg@!PS6^d#DZ+>+>AA;B<#%o0vUw<)%iVMjA4FJNIyZB_ zjSoE>?K^)#YNDhx;Fw|LMbPFAlZn!3-jl{6G?AfuamF<9>p}v_UcNJQzVa}hf8j+_ z&%oY({O$`5qt!WPA|{A06nyQp83$zLs6YX2R$2Qh$8-k(+$;^?7yy7U;9E&saKeC7 z6$Nk!sf_5Vyg<=0?RdG+H3msaVT(SeesUWhek3|dsi%aKUQoZnGtNCf8X@Uo&KnSq zofu7`?e4O5_m&xPzZe3C;xSTPQTwaB+g{3XpDV(@RYXs>+uPK7eScNC4IDW};4vh< zMwNN4bKchZY_k3sQ-&<3=smLA50aC}XC@2&I4}2+W^mRy=b9)4dHmPkc#~}ZL)17% zTcF8z;-;PANVR^5S_o1tx;>|Cn%JfDr^|Gp-8bpR)3u|}ATlI#3c36`4_}k8&zRqFH345}rm;!9=ODrtLZ=qyZcU06hEFJ1GDV1(>2JK#*_~MzIWIkAZ2@VHqj+ zbC4LVk&!TF>2Kfn})1?tcnC}IID*outgEBXqO zd1|j|eH7NmQJC;!%|_RWoc>+QEyy(?OZ-2L07JR?(Vo13;#`HSxlG6w)a*B>+l z5^<>6r*LW2x^>1UF(7de#;M<~!?wQhrLP(ICE?Tr&xyQPa3FsyQ-6i38 z_T^Ux0ARK>07u%li&woyoZyB4sKg^HD zk|+6#e)G;j^3T|B|7e{u3h^nNdG2`;ra&3<50$OINRa^+1Bqwq_76DF_zH^7Z662> zj*if_U$3YE38l|y9Dt6MS`hBuiou_F%4udZ$=6?hL)*d0UKFU-Y-{Z9@TgbEoiL{t z)+IDLPwB$=5+0X!R+s8alp>7=*{DzqGFCfq!NTv-R2eYb=uuKaUD@{)=-B|%)9V5M z(`t1qW*-U4n6FXqhq3B6Q6-zv9+Mj}stcdjoaM3qCL2Qci-8`X7>JHQl{J9GUTz;C zIEZ+0EOH!qume>7UN#6-mr?>oERl$LHI;q~|CfuxW-z+)(c9!(ve9VUd z@<$x3#G{*4V}QDk!}JUR+r;TJb=;852;09QFMIr5NG)c!C~`9%m9}<*A`w-R!D_h_ z;rt2fA1Lk>Py-N?m{ri?tt{H*hn`2u@w?>s6OH+azXbmp5uvYY2dPK3LGFR7%8SF( z)kd(zT%az-fSpr?SSxpq0kdvvFwOZ|%7LHvd;t5%2T+xu>~XC!mX&^u-q$~VhzRN_ zG1dkZubhzh09XhRx!G&`?*@?UtqixDq^`0n@ELN96-j;=Y)^#(_fc%0`U47Mo_gk4 zqY|PbwmNrJ&j)};$+J#V56VIJSE7YG3YCFass6eT%D^GO5UQ3C#})cgd&v_OtiG#`J|{2f_viUBGfp<{B}nrnUs zFcNd>5NC5xQx5#dW6?^=f!$&toPg8GVrXgBoifZ%%e1F;+jPz=94ii6ElbRnc-i;}984v`qqjNUsc1qX`x7i;4Sy2WgiJ;_#5 z?5abD*`jt+dGCSWe7iG#w{xj5?Y@`~E;HWAC z?Ph<6xyTfxycd<26xC3cUe)V2!t_;-O><95Qs2?wrb@00+zSz06Q+KZC9>T(#|1gJ*-wo#4boNP7V>(QM8fHNoue$#6TI$IrJOn4{I z_POfwHUA(K9AdL^nL z$6nvgm%RolvNJ^(cPe3qrlM2>QkGkI|2ofi_;|M#qDXDzH~RKb@Pz5{gO5KparS{! zI?9VbRY^xeZFe9`P zMyYtL8zBMQM@X|fQ2jAU+@g6bTa%4ejJy*uijr>k> z4&}!Wits*Ejz1cJ>E)+)T&P4NywWrzJy~ED?{!fBOzi+H_ZoopZ1wh|C!pETgHBTx zeC@hc1j5j>H8MZV9Lt;zmG;68PPZ$x{HehGF`1l)in$O7dDmQoV^!)uS(DA&*E%ZG znwO;Rr7qpttA%kv`(V!m004{$;PwQ({E91607#k8TadCBs5v*10v%hZlk?DZ&K39g z9LIkHZnMN1|ikv*Pw?0iBA;i&_~afBD2rlw}{_Zj=Tb-RHKLjSxK5{x*=5GY3%Z|-xV+C4QBkvG9;D#D)YK5XW-;p5r z{qKJtouMex*hy+oO0yHEAkC*~_B`02R(tc+491TdRMoob`~XgpQx$E=?FjU;d;quG zh9Is9V73Mmy2VUfUtL${kf_Va_SKN0jVKz3BPWiG&}2=Qs{JK(p24{VLF0|h#E2`H zD8Bk{&z~sg&KmU%K=RY!hAzDP=068a1W=&neM{-Q8c>6t` zXFR>^`h1$&g%47DvmwfXKn?t^b~qxoPwKB_{<=af8)j+{jEgh|QhN{9{b7FgJsc6x zqH?vpibBZJY!Q=X7^#GQ@exgxpM)Ku*bo*vKzpI1Gf7f|%qA}7U9%p4@~LR8qADYm zeqNY9?E4%NCvjEZMbUBLYCvTI`cA;`_gc`1>Nw@|7N;rQ1!&XP>IaSR$M zQ&G((Ta4WM0~OYyDFtX;1OTptaHT-1xg^9-Ni3!XefG~)De+(xyX+}KwD-2m)+NB9 z$cR1zIMPV|7%PuE*>-+GRIBNvW#{uuqx3v%1j_C?L?4D~lh=WI_C-e?Y3$Xf<&QXk z9h?OS_8r{$v^^MdLBY&VV__`jnc^PQejJgbwB0$TmCNuU$?Z$&Ji+8Mbrv9NG*nbY z=rU%10s4XJaX_*b@q2nCVA7qZbmap?XTvARQL1;U5(XcybZ?x-XJ4>F=L{=OL~BE8 zdS0FmVc$FClfp!PNh#|$sTgRwUkEg=B%n#uMBI}hZiw(bAUi{%~t(D1qQ`QyXA1&@m zwaxmrRO)Ayf3UB1ydj;J7`J`yTKlwG{&yV5PDY#R)CuX0+h>~TAwX#_2|fLX%Pt)@ z(iBC({M0JMU3x}DR4-PEl~>>QAZconW8y4Q8a5$XTFu8G9XEIJM`*n)IMe~QcP|$R zYU@=D0G9DhE`;_}JXP7FuSr89Wc&Red@S4jR+BkNGSpy!>FznX8+nYkT8U|70?u1_ zunBcGRtwWe-Hd;1HsduH0Q@`vHxa0aiQAD8=oc2babg!7+?Hh7l2>0th#Aw4G%L)r zUyBke_-)DY#~TkmO+#plMLd_`UKg8+0w5ZT(p`9#oTq3AWl}#E5E_W<`|H9rVeBWg zkqNf_!AZ>n2~a05JJaMWPzgC-o1buO2zcwlZUqe}b2IjwdV&}@VvUXPDch2hemp@X z&aQS5+s@fUmpl-#0KoBk>b#K8#NN{lr}>(by9Q`$)NouY4?TN9AR!-Bn(U=lUKK5t zNlB(AiCq4iS1EuaXN9(A%g#A38ZvrZ+iFnic&|bg>jJMO*ez-ab|S?zWXrvp6xq41+sN?#?au$}qTnHYYRC)w1dVQ=lYsaf5n9P>l8M?|fH4 z{<_JDSfU6HH69}r_C-sIYe(uOaT(2{DV!wQU@y%B4?ogmEtZ|r$nW*FHMOeTP$g+y zHK3e;r_dGn`L}BQ08BY>QVe8KrV%FJK@-)=Xk-HHv9-lXfWkq;d@Ul-r_i+98ftda zWy8wL6*I@DP}3rm0<75iTE%-|e#&UsCVRM|0;s6{li`~ob--W&C}Ely6lw&W0z)8w z-UkZKqv+(un{P2bh-2lfqDX15Od{$G=uJS&Gm>pga*uz_I;QrR+4HxA{R6RfWEtDM zufyOp8eO9vgJ>Xg^sE_1W-c6)&N6k@e5wb%jBqk_Bw|oTfiT)bQheM#)1$+d92;Gs zMx*#bm@{fJF1zZQXtA;(N2yR}m%&|P)WOjX{YA?yjDeE)B&J=gH0KeMr?hmf&~xml zXEP)4&OTrvI2SlR0MirDY5>o?S?dR|UMlb2v**+<+Ta9iujBpE$|Ra|6HqAwhm2a3 z6c^PYVUB;n_!UIN=V(tvn43O)2Pt>jGB2&JiJjBu?^&hF(l-0RLl2GU+M67ar;!L!Y^lLhhyuU7y&S2f4s$c{eODv!eU39K=AwohNWUY^9wtbIcGd35E|A2kMez%O36K@D3T zGMi!mMz<(0pF*eo?b?7O@<0Vw9PbF|*sI00pf-T1&m(UEH|i~2qF#@lH_ko8iDCe4~t$HZkfZpZJ1 zK;dW>ML>{(KrR5(=X}HXq`zK7b4!J&P*q8rgy~`C(faKKZADGd3Ms~Cs~H9{?7<4H zS*dT$11tUW>{A#ZH9;J;x$*SRp%EcUmaKh4jSd!|+WH5#^x3tgL)vCWqx1w) zp1|2j=FLE*+#Y`H@usc#i>e5HSN$3&IbNf1+(A;wN6TTltH6P4w8HG6b4Tty)tHcE zSPq{wrR~>G@7Z4QDodJtN7Fa}cv2qvlH@)~o$B2UW1AombqE z0R^KL7mt19@S{-&i9Up;NPL>6cs1`qG=gFjA`&JKAt#5z#L5!@a2;`>N;Ox#&uBBw zv(`)*MHdp&g3{yr)Nhc+CzKj9|E^Z%cav%r0Ctx8K1%BL5h}-BrxI{{G;gcv?PH3= zqXEp3#>72amGDJ?v4a?KU-ftRiME)Vt8UJi6zv9>b^yS&0)RtS3ILvXy`}-I>#Z7q zMgD+~p|WY<^c;W)A;zhy?4wGH*z}bu*Tf@iw?mt+dVidO)b8UU#)(GpN5&d8jVCA_3LiDQOz@7FgxZ>nK2`pCrM9UKUsfk)U^jsdz_tC z4^E-)+~?dwpkSHYb(q?}U7v+v^u(`F@5mf%0Er%lhpPxG>{KpxAlLbm0wyUE4jLFa zd7tQ*rKhOlbG&BvNb9&np8Vs~*ktmoeHFeN(UfKzOIFVuNF{ImZ^M)$aK8L6R0Zy( zzK&?NZ3h7VnF1z6YR)8P`8;U=wH*m;f#N0Q^NSa5R>If&HC? zjA?WCi>^|K7V_k2j)B(}P@tvPfl^ngn+gPagIz7h>MieS<0(ltOOr638n4%#j^czx^ZkN*f<%Del)}|yQhWZh1G)Fb;;K< zTN(&$*;cGtqedu`vK^1yMyw6>h|D_rP~k^P;vaC>;Snv=X;J>3=7xqQqtuv#HN_mL zN*AHy8g*(Pa?}#DjX9;)JF85+o%G*|sqLBo_yAH9z|{cC0HC3l$zjy8#b`KD!g_$+ zu0nyotpuWZ$9{5*;XETTW`(3E&NG-FX?C=t0Q3=H&`*%8uv*9t^)~U^i%Hl&kx>*{ z%&q-S)Njm<(1;z7*26w58l@cm)0KNpauWUg*zWmEg(Imn#M@8GZ*fg|tf6E^=H8P0 zj`R`gp3oziXZtJnz|P+;I>rTzx-e(54rSkSJ^C0dQl=vSP39xc zTQs9X6msPEvTHQ*`xh}?a)+W%0z3x7<7~1W1;zvQcTt!A{ss~l<`g) z83;H^_j5A=1pwE}1UPI}1q~pV=^IeTLrFtJB$`mqg@H>+Rj-!x&}5h z6`|n-x#;wjo40VG=|#wXhIgncjd}=Ux&(3zeDE?EfZoV^2KW0qzk~;T))X2hE#)dX z-rkYzy+mPBJHNT}5V%h0Smt?vz<7jqZk{W1>~d|EN|@~{a(H6K5$zbNH0W0EQ)O+k z^JPJBsA>0gyPCz^q{=@d8~{ZddUbLY+$c|-2IbWQVU#6CH?0O~PA=A1`h^YRn|*hJ^E^oPFP{#K{SN zd2@)ApphwB$(sT!oRPF3r)(QD;L2;RlM{1#tu1?r78I5`PFwdt^u#ALe?8szVh7*F zYIyo1)yJQ8{&JHupPEgD;8dR+Wr2$jCee+_ioDR(hV9BxvH$7&KZqVtYViW?9k?fZ z5C(v)>^n+JfCDo1PtZk(hI2pW4J2+t>dCwZp<|JVVux^v|nT5zDt|DoPKHJ={g3 z-XXTDGWSSaALU0FO)CK2TI?6Xu?Sc0!bkJOFYbOh=$A zuZj9Sr(z(xGmtF?;(=ocT$6M@qXi$xvuE?X;a2h*M)yF$m9DN@n`b+I(b+x6C4`;z z>}=3M$6mVf{QB3wHXC(PAY++^1)i?7Pc(u*{pnB9M3vEUjYb_m?Ks|NWS(Qbq}yX^ zn?=Uj;>C-NhC=rl%ovEwecuqVW{Qpy`#Ph6B?RdMcb-X*C#_h=8FEOHctl|o-E#P@ z5p_J)?&R~3DTd#L{Q+pA!9IcXdLUAR4`hHU8v*%{eeDB5J>b?rws6ft32+6@XYRXP zwGMYG;&I5~hu6_hc5MSdT;Q`xQ{FxQh`WyUf;Y>ztV0F>q@~;?P511pXbSr7dn#j% zHwUFp{4~XG>zLhP>=09DBzB_mq+z3sx?EHBeAPHFK3rSGc=7y&3wcI42UVFJcYgNC zC(%aj5inX3X(xGQZPEk?Jw>+jwc6B!ooETK?MRHcB&3q}dm|p&j9;ZL$tflf8fCI) zAJYC|wdW>J;iXqzH6gxTHK!Q~lc;-^5K;#AoRmfd4MZV|06DXcIcrHF(zUX~zxuVW zn>-56u|lK@amGHFxQ8NLmLHXm<_~}PgJ~N^D)SL4%Apev=71|OES=VwVIH%@LZX&~ zV1Xj6k(H#g2f$&R%rMN6o3+P-5g=7FXgzuknc4OkeQ?WUxjJ2vGo6whfL|!5@tv*) z@W`XlnP>nnDMKm`03b9o$RjtSX6Nqg*t;$JT_Hdi9|FUcrZ=7a-M?NV|1XaBhBLH6z%fE#^?4a&9_VBO&`md(Ka+#X0(wt_5`s|?*7?rn@Ac{@JI^asc zD-)4${57GdfD0OV)qrSOw~Mg==|yTxTh-4JIxc8(l$qZd-%5Ry%FctY0o*MO;2bsv zdCu7!bbYcnAP@=F>N7}?Kv>orsCLD zweRPue*ayyo4!}lbB6M@i|=bho75_toPNvjq@XLk+!(OU#-$^$~uZgulUQ&4XNX2&GQf5aHy6 zHuF?@oO2{ey)LI58Hs}=rCr9$H5nwyNxCA3ft`k7e9RmA81UUVX*olb$_wM?0aao6 z)YEc8$EHp?>#TD=@n@JJa4K^U&YC~pM3m_GgA+8>O04i~^0Vx|?(^r(h5J3VEv^sX z4*393(-KF#kQ!&+u3 zVB+}N&5v!w;A~)ViBeAAc=N63YK6+C?YBVSHPl>pyZ(bs?)QU2>6aBVzwV}6qQ%FZ z5OryjP|`xn?%fbL*!OG@B+wqvl&+R$^2yJC9{ur;e~exeV^Pmfu}ZymVT)F>pj#BS z&8V1Z{sgh-#E~Xxvr`h&wy|ydS@S0(ITHeqb!vU~ylN!aGjN3R6f)I@p4T6<1i&Cl zK-i9VqkHp1S`#WPkJbjId#k(iK&3VN1YK%&CYpgCwFzngju{j7b>v4Rd~>G1(wk`t zO8to0f1*;Pqdp94a!X2_fVscBe!9%x+4peUg4=4q6E-Lc@W^X#MQ^_Sj`0DkRsQri z*`6t5i=np?bLWlE>oYjn*rDTMn2D#q_ zOs(3rYmpT<3`k3`o7EERXtoD`M702^24DbSUje{CZwLecgB(Bz0YMdTr~yKAjJT6j z_sMcPQQ!S#rR`q0TD8{-jlnD_^GkJJcHa5X_tn?!2uc0j6$NOH>6?4T+P$)%;ey1T zBgSa+&67=IQ%XqhR37`>0}qLImR6Gsuw(G>R*NJ^j z{&0Ly4%pOZ>D8FH)Fuyv3&V5aG~Cd=2ag>e-LFkz*c4={d`cPnJq3bV24SVl!>Rz_ zF@4ds?cDePKu^G<*Qq1WlTIE0#Xu8O4!o^#m|-_dJvJjY1HQnh1BZbE28II?0iY-Y zg!sCSNg?f`NMnFFsfT|+DkRMvj#tsgVC8?K?pvnYMIohwm7D#pB-KjA&5@=?>T_*( zB$_~K&S26M4f~vVpN>i7YEvQL88~J_v{Xq+?|=1c(a(PNv*=>Ake(u#BxD<#O!dG>{sDag$w@d= z^c740VrI{m>h(b9=CWi#&`CD)G#jHm1T?Tx0C?8P1HcJ5S(}6IU}E8eMJNi3C5;jc zC}?cs3>O>>Km@?SGIkL_01hED!(~F38Bp&JJ?a=!-~ECl(W0Y|G0r~x7M96))*1UB z5Z$E~&Pbpk$_ao0T*fbC@-h%;!|$m5#|pSeXT>Rbx6uG2UMsakW6<{NX=`AstQ^9~^9M50m?$$P*9l2aSr{NR#HkwnOrjcp}Ip#sgY|2E{GBpVK<_W%=&@)(V#!m&lL8-utNdz^z}9RMT*<~j-U0iZbz!POdEfS7a8qUaXoT$6Qm)P%*y>1hN{%T+!sB1_luL~_v43?`mNdLrYCoNImnsQsh*ae??w$x1 z3j&759OkRbv5?kMX7Y5`?|C6zLdvI}rA=04Qch-5(O)-+sW5 zjP`)ajW%$)cJ76_&RcPjh%7M+dIH3E1IJwW3@oe_-JyXJ@wzmCN-vYcJA$W-3xX;09>tp01GZ$AN70qRX+-_ zZ`h{yZTx`EU)34d>~Xsc8zllf)?|lWux6bYe_-^v-3KJ2zdrjLpT&Yjhnr3`cS!y3 zFV&O#x&8&KO*G4Jt(>=;-r)%CFZjk=Z%1EMmfy1TFEFZmE7#;)0|Gf3K%IGz)Ln-qy}L7+>izjIXwaQ@1RqGx1o5pEqPC!aM7jLom%Y6310 zq%6q9&G&VUK8_h(B8a^igN^@0~?KT9t z>fQ&V{V!Y>_1pN$n`szujiLZ!XUwh(?KR7=pA%8GWr)dlQcVB&)0Rb#D(<>YzKYS) zW_rvY1HoveWwO`(y$@`R<{r8@JtprR%A9?csVX}NbF>T?bXyV2Ns|2EmV~5n1%K~6 zbVNDxC(g!d(TlL!Zy6<|{#&1b@e5c7p_qT9!gCj`i3@Q^bcr)UV{g9!0FB9No3>1S z2`ILDQJalYlMnOb9Hbt@hPJFT%G#@<1R@#czf28)aJN9e>y&bq)sHE|T=G zz81y69F7v%bJ_^lB&WW~>dC=JX-1qFSd-N}7PM6_xq5=@>ZpuxdtiMKyu}~W1IR0!3v~3*e+WVPoLZ=*ffHLuxtLqT$wXRXN z-!Rom*wk=*0{!IxoT5I2mq|OIF8^8OSRAkBsW_kakN3!kHiiz%Z{V%ar`FV)|u|1}f91p@1(wkhYXf51&aw@&G@&rGVio3>u^ zchPkT$)2EX)amlOT)qt(Mvb2}JCAAlyh)?4&#&-v466L!fMsB8ukWgk{nQ%W_5&ah z=mzZzu$Y~JaseP01hP`RolF+G)(~awnIs?Cmje_thtWQ>TmQ^}@rEj`mpbPg$nT%C zpJ9IgIQ#$4>io=T0iep>f0yB-qhnN%#FpVyxSgwbcz^RAzBUv9(Hs-1%p@~D4g(f7 zpa?p035zCSU4Q~mfFKF?y(Q(hu`ke&=L)GzzW*_ALKcp&4HX{KLVs*cM5ck7gCeZz0Fh-e)q{a>yKe`-qWJ{A9%p@!{1L1z>tPe#;EQ79W81{J=@7=pJych@5TIANL}7d+CaPR zl?x&P;3xwPen(>%BygfA=LOmG^W;OZAhMmzsV=F(=bwLm^vhrU%CsIIFKyAy3o#mp zq@o=rhr}HriKS5E_9Aq~4lN7=7!Ifu{_OxumdSjkQ*MLIoio*l^&V{&bBgv~s3M8C z(|d;UX8gG_|4$O`YDsrC`7ZnE9%ugca&p}Nn|r70pl8t<%##LiyLLM!<^M%#0M{xL z@E~>v-uP>!kv4 z?m>qN^@f!?F&lSG3g~2Fq@%=_0fWQ*gd#Cre*gR5M|aoR%*xF0Wz@w2RH0nmj_})!~ydp)kqR8 z#A+f%guN+#8>JnfpL*um=t>os4N?>!FC?CZ!@YNI=zBkru7PWXpDP9t=54Om7W}IF zABy&0b%|FCpj6;-%5rMxp^FyRFmo6s5E zY+h4^A~EAUDO?6fRit<37(K)13vx12Ms)}b>3*4dLQ;Y}YvDlxFvYkv57b*Ml|%KP zfB2*5pH!keML@8lq+&dW@p|~fm-5Jrw;o#HKEv39_cU2LA8^PZ)#-hrFvD=CA^f76V=uS78vI^dBeXdbL4lD{0}M} zc91;kO-U~?*)|>^+WQ$M^BAi}K(R_)RkiL?I_rh%-~TT^`AKxL=64Te`Ef3_6&I{p zZF2vy_p$X^w<3l%zxk?v;Qx8xkq6W+Xy^W2pcXee|ESSjihO)YjZV&2G^D@!6Bb@0 zvsPhXtoF_&fEqBXLhF$QlOZyVvrfS4Ha-#^N;&XjZa)A?fC=gfoW5xCQuRcbwe_+K z;=cgiXNbaSB$E4gz0Ejq{G{kgHCz1T7oSGIl`T!l@5YB7iq6tTo>NtAwu{1Rb^?kK zG(kz<&NRSO4o-RCwFCL>$>5l?F1WzN`EmF?qHyGN70h6dRsmChG<2K~u<0?5M6`3@ z5}94ctUW5NOc|bb>?v?M^MV!9rrwLzNR#>^8HxIRsFHhVa{1y*FPqIqhsnu`=75IN zmXVl+McPfq>~c-8lD~-vg@${*ykqS1d_m?K8^@4wI{V;7#?&d)#GH9)B)U_SK5u_B zq2fRmZtc5zEjt5N;7Hz&eXgbASscPBKcR zUE0EdfnkmydjK{GjDjA7z->pjZ-CbFe_zwmPbf1+IkbZ<`uedncO?3;bk@Y)# zh6qb&c+r`>D9k4PKJeVWKV_>u2MGWtMjtD3bF^wr0L6Nrixah}60OMqgyTDL%&^p4 z#%#`|Q)pqZ8Fi+Y1j2USFxsmGOPvYukW7HfWCGm#;_E2@tWx}ZLjx#WnEtb*F5x?<4tBI;jM8qW(jrfbafzghV z8iqh}lY5E^r>bc+K5*1&Lj{h&vD0Tn_ifx5-KVnMISUVtc2jeX{pDjJ0`TP1Pn!az zJ){w2!KZ@yUrDuZQ;K+=c3GOlmVf{4#aMIHcAd>l4pBGaos_C=qgZx5Ezr8mZs$H; z6OY*wiJdaMW%ktMiN5h(jqdHm%wyn^5j_kwdq%QyY z&wq}d)gE<(&$g2!{VXbTk!qOHJhCbw#FSy~M0&UqBxKU~-(^e(Lxiy@F+i!T*WY|g zbdNGC(OiZp0&t8{t?Af9CglOj^4ncI5?M3I{WQc?G#p}&iO?}$lD{FybOcPA*sMuR z8^^pU)s(EZR#=r<47{UMV{(J$=24ZJ50n!WX3l_Ma*veJJ!Us+;4*w_N+#;L>ztKu z$S}TPc+2!Kz8y6wzrEu}ikZH~_%5?shPSj}HIF$81G)fknTmmCPzz8M0GeUe-f&JK zV6*@fsKnD2ER61#m!H@;d(flyZ#SqbM^(<3IyKcjAx_Wiuo5K&0K-UGl+QBj5HYU^ z1VV8Jk^_h5#cIO&jKJy?)wS=VmR@ISL(8Y1doH?v<3rH_>K?m`v;o(->HfXF2)3aS zaBOCtD`20DZNMjhe&y46AdCA#S1Px%SY-c2eb&iGY+*m8f)eMsOy>*0!Rm`k<8B3fjAk>&8 z3k180v5(X~gI`uT>x#8&qxp*#MXLk`FRI|@7Hw)VUHSY-q8;)^kognBP8i(>9sB=n zmGM`{#GWH7D9K!H!Tz12HB`}xijJ8sKqvkAcA0UQc1D`odj+1Orrm@ACJb81nxr77 z|7-3TzN5Gy(DT&(SQDrXHwu6WaJfu?S(pI#g-n1B0HkJuWq#LWz)7@n-G=CWZC8c2 ze1SR+`Cjqv0)VX&mD5G{tZ5J+MiIvs)qZS-cGV?!;%=$_M=7yo-DQ_W&%N+sbfe0r zr$`gn&XZErBz+73d5j+dfY?S&%m9a(Gw+1zo#%iJM2jqFeonvD4f;lu3~Dx(sm6h= z#%HS*!d}CVN}2x`XlU*`WWXi`5N~}#S`J_t7~APPchntIpfULXaFxP<^XUrwpi+U| zFyLtAcYoIL_|}DcQb$|taI1?Lcv?gEYYfHC$U2FitM=zO4n5l+5B^DN1O0|tV?870 zIZ#a@QQ@jSY7qqm0U)(O+X?Gdi9P{<^|@g z8wG%2=Xb7hL;KVWQ8hRkB{L89_4D8R|UrjSoMJ4nO`x_3T@(VxO0y<;wEwQci_kzUj2 zx^J!bs(T)qygH6t`*&@f^FT{9DS=QoD&*GqLS~lgWULeL`Bz?xHr)L{H2Iv>>ItaL zLElO?2c^@_M5O|Q&@np2s1(0YypVY)oDzRZFv){E4;zC;A}O74TrNly0Z7H)vZ{E^ z2G20OndBq^sZQ;T-1Acuq_<<+$pG8=|?2TD+?U9%raq?*KLIOr@s3Zp=v&gjV?+ zcg|gq2_<%=61OIGLkv|HCGmj3f{}af&N7V-(Vl*6o3%j=KUmZHYX=golIN^}XB;9m z%$m$wDjXfb_!-LC%_tC#PAR)srJ_PBqLV6+);7zTq{KOv(I|4X ziW*b|CS{vW(%dLMy_>~I%gc%JQ5$aBb&ovkUK+YVKbFG5)bm^rs_$2Q@bmhP!jxrIP z>!kXRo3XE9-Z~oezbi74ea7~3QnCzf9nAqPI5DLgGof*y*T&!L@4w$A9@7svIJzYT zfLEebx84(VExkZZLEmsp0M!DF6JfXv4Ku{UQ&SSuj-4fW(%zZOs>tU~U=ptnPg=c~ zK6sq2_m5?0YqgQY6o3G*fp=DhA0@|h^I@O*AFEjA2&IPNFiO?81pF*G8VLMTW*b>S3Wv-I zI}?hMjU51pD%!?P(NcVEBs`kkcnLW)A;5j_x$_P4H%sH~IPjV$JA`)U9teV&~A0}ST5yk|Gh zVKoGOT5zy)VCTiqhO=%pfT)4Q=L8mJgkttq=nz^p;nnsHqBx5bxnXVJQ=R{CnRhUM z@Hvua42Bgg-6Zsv%P%2%PWhmwA=daQ;gP_3LE6tV&jX>*+1ko2jRGhU=n|y@?@cQ3 zqiP6}h5@A>PEZtJ8#$Ef28-{0?-8LTem>hZ>ImK3-!cIVW}hi$wrV5)J=V$xg4Co5 zDO*^-qHrIrl#r-J_cF{<$53K67%n&h$5(m&iU4r0ihO>hzI|U)qLSGzU0r>*S6Oo2 z{M3U&{M-gGG9!NOEGWfbl&-me&<6#;Aw%Q|foF)?A?9L$$ODdn0*rWs7@APtVr|I6 z`aYwy=fM*u84$Dg$})N)JVFfa2*EO8kO~A#x852v@0Dma0QiMGW(AU2i+DZeD9_=x zG!H<F3yK<47Am#Z{cC6gMuHYzwf z-~Kacy&{h9soT&4YC1Aa`{C`NeDHV@Ya^BTiPWzKcoi4BDp3?1_YJB1fBDN_qSXSl zJ;#hQD!)5-A;8+E35_K5-j?7jJ=AH7A?7zGM64mC%pcGYEQ1@(Aa9^C1b*w9I4N3x z$tBV2(&z>#FM|7JfWo`CjRskeN~OFH04Wb7G@OEAZM|dRP%jLab9Y^~Cai3RCqx}a z&hS|du=1=~&1+CJ+bISj55Q;uYz_8E8343RqUXF^$@RaW-_6LI1P6pdrpf0uNx7y& zB6YC)C&@0P+Yl=A#z!AB?ZH#awXv1{E;GH5 zNV|yHX=K4WOjYV{**T@Zb6@8<;%BNSF#DeI9C(cEFmoZ}Dhl%%cX;-G>QJ_hdKBGCGK9*icQzeXB>5`o@K@&MM72QYV@K_&A*{&3JK zWz0GTjhQul*uX>A**uP26nY{1f}a!N6)|LpxIUwW%v)&dblhIH;Yp{S7JVw_ze!;; z3VXIwcVT{Sh3Kk;AL|^XFaU&ai8KwLdPM7gum5i|uq!(E!WGf4fAgDY>DlMXbm1MW zbFH19Rp&)s?A?=*c(kiVZQ6HSe?^MoffJA_PUBF^Sz8|%d@wL3h6Mu)guZXg2LXqV z4AWy$CelCUG0R7eunRJ~$MBZfk@~v|{3of;!;vy|E?U1Kx(fo~=y4M_d4q4`93!fk3W22G1~df<#8j+L20&7?}*y8paKcdP(tFO>Rxq zs^J-%? za_Y?JgAYDbsqgdAWW5LPkY2-Y;Npf)`K@9&wYB4F%ov_0o}=uTYLT5X;4abtpfi^S zvqC4PXCsuXB(_4%VSJ+jSjIO@ACIjW_It7pQvsStcSph_4Dnr1$kl(`glM?-y_}#v zm@~9P@j?}#opky#RdZe%-FDBt(G%L5jl!| zqxRhw#Qc`&x6*l**YGRRSF&s3Wc8IeFgilruFuqNSVZQ?<6x)j$DV#BdRdO?SJh_z zvB#f??z`{4=oW3=cAd)7uTduBx~r~^&beq+bi%STqr;T8K1ZA6V48&i;DHzb9)720 z0$2d}yimx#s5=oEM%P4shWd9i>eXxr#SFtpO)yapox{TKBxV^sZH6XmaP$vGYE~J| zO3fzx5t?~fgdN+*%tQOjgktDGT9}`6)-7TX#$euDelEGtG z!$_5xsTxxhGiI|4xmWb}Qh_)1FbNxlYIriA={&~(3wRwPY4L*8z9ZGmW-FO5Fn<=T z9a9Vw&1YOo?3Tb4wlV~+v6Tqi49fsIHjjzi>jD&2N8R)Ad^wD2zc-BTFlEY|Wel0~ zd-|T{U7hz0+#__~?04}sa=}4h@C9iGU*I!&o+$?`j5b_*UG%tiA-eOv`%O#oRjN=t zQxg3Mt?Ml1aST^}2U-Ha_BpL%MmWRpb~u1;fqkZ;0I3f^c>wG0-557xz`=Wefx)&Sw9)EgN4^3Q->z9~deyWv z0|-)WAreD44ui%_Wf>}FcuSat08q!|TsOXcN{ki$&eJsNw2cfXGynjG*^&`@Hw$tp z^Y9|S1IwgX zbLaihh%;73{qAvEg7IT#bmpK#1DiJu0066Qzb_g>Ex?_Q2GCjf&3oZH>)TmhXyBQb zUWr!Ra!)jfa^TBfdNX?Yt#_igJJP?S{d8zxv!{W#lnTA^ndhSuue>P+fF;ko8Qm@| z;L%rJj~-X6pvQ#{kG=46^ymvOMUOuJV)W>9j29Xo&+43HJfhDnV?3|-^oRTIq2Jx_ zHtjsw^{T$!mOheC=*1b2>F>uxNB($R{Rkg_@#T1^SxIfY5%?7-*(vV{r~g5dt3{DAMc&Z|NX(e zLf@Bt*RE&eIwvx+^Onx7w+427MwvCMt>fsEopm(^iTm7#A7(uw&dA7e(XF zTxIBHywXf3oU^p0rss_UcS=U*0eoxLs^eEKSb5CcUl14T>&MN|WiKeslH)8EM$aO}BJ zc$}l}v!lQMZ^kj9akjocJKC$Ep$#mLvBRG0{eOwRU!w2YHI8%4niMVA7>mN0TqRCYpS? zhCccKMD1fgQNNEDSd0^Bj1{wUF4y2%qr~K+mTTzRBP6)E5BD2>?&@fmn0S~NH63EA zVH#ZwF;hHNMnmn;GxOXt}(UMu<3dw22fX2kb2LvvAiq|X{(D;?=`d-t^8 q+vjsWhw3*wx&+X}&S8$$MgKqj$!hTsu;d^B0000O zzVG`!&+m_UX70?KJ9q9m=X35opL?S;)s^rcJ$(cK0KST{ycPg}9xg!u4%WlT$gR}+ zzmmI_k}Oa?@@)H|0I`vIBLe_+@pw1pm=9%K7iE2S03hi8?*R2Vms$dVDW8hG%zJN> z{dQ~%L*a?r{lohwi}&AK|31&kebwWN^gFCKn*OM&V^N~4(in!i!3u?#1d&+1d>x)- zk%U?iLS}|gnen|k?w(p?8*Ud(}ng4(SFvxc1=l5o04_dpx%@Oq>$YV^45w3z6?W>Uhl zWBvlCXKDT;FQZY#(g~=*f7aD-%KTB8!(8KvkFU628!zS{Ydo<~W4ZzBE7b<_#Dv$b-Qqi*4tNQc9 zeB5Z$0%Zm%@$lZ%`8$NQ(8*oo2rnd?xY{ zVUwA5uASsvvg*;>+Bo!g^cvKYZdKH&f#<`-DJB2!Sx+f#V%45pw628Itm=YNZ;&+P zND(qdJjfIJ(Z6?TRiNji>tDv79gNXdzNzs;PZBu{#jRPuLGFYKe;07!CV_z3yl< zy83e`#_J284Vh_UZzE6P+*xFIUASM>YHv|x_O5H$dbRSg?Qi(qwZuhpruG3(>yF+^9`z za@w?X)n$#a*A&Y%z7_3cpdRnPU3AC+Km`=TYWd?5a|eHknR zAtF9kyzN0{)@}a508^%<{|fkp(z;pTU0Kyy>OSN?stBbB6Xgy}pScS%@Vzlp+ab>E zu9+5)@++CqsM;-Js5z4|Haz2QBa>n?dOdI*#2O@mis6c===OZK!LLt+nx4BmrA=-{ zL$Bgi%)i7}Al(b83@0LwI^+ zweR!m(z|9TqE0NB3SpG#%mxeYP0yu9HW{er~FvK#dqpurHS6 z+v?4F0>y^B#Lz+`|F^*W%L1kQG_rd;g^da_+xK_3r8j@g*(I%CSlYq=8Bi_+qxZ@5=h^woDyp=JL}?9d5h2YKjq47=NR`OwaD*LRR9AiLLEjo=q<{9_mTbg zWVr!b=5+F9)%TAm`Hj={g1PGistuGmd%)xV&GcPnufX^6%t=4Bg4(=Ua;=m*O?ev@ zXyEJ~6Suo+*W%c?JNuoCU_~OAEEmFX771d_r71Ca7emWW>Z2=Sc$0_R-&h4eXBcF3 zbob&pe)c}O{qfKu^1!cZ@f~WDu2-cbWAD5;t(_uVPh>Qqh*HF?K#gPoq}q zrU@(eLdI_CYXo|cHDtTdxuBwN{yXB>_&bCspaSMA!5yb6X{DNl8Is*Zbt9*nHZ;z)sSeyha zbLpaumtu8?D)V?E>4SWWJED}ueZH+Z ziC4fkTTm)+p|(8!c2*<7+;|n`GOt!$X+^F1c%nI0C@JWO9<&!3h?0G!V!tF~-ntt& za{F)f+okTb?8I(tlpU$#bF;^r#JlQvXL2@dyv&6mkI4Kl-%Pe2ctA{2s9gfzLNpEP ziPog71`0n@zrR6eH{smPxG$vmbszncw~xmn7Ih8qmDVK4TL&XNy@nKzRFUTjD_d||aVVZn_xeV=<|TJ*VRhhGMdNxIg{0emaw^hh;(x`2ZW3|0J|apf@(yh^o3p%8A!N z9w`&HM+>0`V&Hvixy--qtyE)Gr#*8D#eAys*+TCU=$Z|V!k!p3NXSf%s^ya zwHsdPn+sBIt2jeYbDFTBna*ys4H?Ae6>}4C6}isLtU=H7jw@?!mhf7{i}*H;lQBgY zd}$0x;P607!y?z4-c`g?y;3jdWE@=ET;)x&i`bI*FcBXD&-)pUIhM2{Jj@Dx4B~27 zxV2aTlLfs*px4^(N>M}NA$_ZsZ|vbJaLoR$gtdP=M!(lEL{tVwFD{X*1cZ!1`#8&6 z67Puv-=rg@?9Y9=tPfUpcYET8n~)ZnVd>%J2Tjz>yK7?V8_-A8Ij}`c1o#L-bPbRv z_t9WOnqVlk8$jmmA~!wy?RfWlBRfIh4rAX4J8BNKbIr%H3E{H z5(;n%B8X_qv~O-_j+tSUZHKR*%RL@LZ?w}EGLYa(Ii%cIsisD(Kf3beNSLhX7VfgK zU7UI19U`b~f8Lz6FW}&%kTfORTc=p}$sLQ0H#$1V$V{|kA5F5_9kce4>9KV-52|AvA%>`dRT>W#FDk zu@s@9DGIfHqK<1;3$i%<8R_zEnzda>WH)p3&Qc4y=<<6bE6_dkrx%Lkm!Nq1xuBL4 zeBOS&f6z}in1F$3Pd;CBr+M{}JKl5bX3RCs=Yz@5AVLQ84lpym;K;4#mJMboc|JWp z@Z~!QY^4x^5itrg>Fnn3xur(?WA<7_uXj6lR<-)0I)2Y*G`L^1=jFvyDH*W;l*Pq@ zUrl78GXhKvD(F^kx})D*Q@vdXy*jI;F=KCD{NZ>P@bF=RNP0__pRZeP%X#3(<~`3D zeGC?H7-dI-ANRWH-Ow=Y&D#gs`|R+&DTr_o7@k@=|rmt=D17B+BzQ{#Dj(nfy773w&w$V?MET^@Q41D;~Jz2Y0# ztzX;Nem}_)I4%V4)?~HDQdZ3#fnpK*|m&?Rt?T4cH5@NoId3c9W8tijQrf6cC+e*hGCTdf2)JNYlG5&c((}Pz}L)7S*x*xRSYRDkz6>rhV3Nwiu z`lu@uw(yKI!FegIW+EoPFD=&)?0dA3F^=UI$S&u13z+wkeCT)ZcnjtVV?C7g94Hr8 z%b`gvQ*CkE_-iwPgoTlrerckNZmm&BOZr|`Psc8O=XeVqSaq^$VQmz1ZtK*|WE8a$ zCPlzPnWN|GeKmO zwma)F$1vBnJCiDwoIc=BA&*kH)X860RsV@rtt@jfaf|XNxB8TDycvrlT|DrVWw@Zr zSEmUp(^$_D!`#ZBJb9W#uEQCQW_n{-Nz%2huwQgP2>%=+rN-GyV)_dmuj~>r$Ozza zc@F6b<9(8S?4`7Gu(=C;nLp(tNr7z~fp(P`QIUESWu}KSUDM7cLWXN56E+=tm-upw zxl^X&YL9u>aDQGY64HVTVC{nEKainH1|1`|UbR}A8xmh$zu)ofJ$K+n6?g0{4nq81 zF4X_nfVMSmx$k?KOl;;~er=L9YRo%9M^zm#EGqqcoJRM3Y<8la8|)?%t&wAat5@Bv zHLnBQ85i@M>x(bR&?DW6%jzRQ2bdxjCLnnglb^GKNh)pxFLZ|Mzb1Zo{|Jun)?U4w zvt-D?68x3N@y94pP6@@&W10qy>@Vy!J(&GpNbV0X2YamcTh*U7dhQ=0joN-oip{qY zef&l;@GE8@{zRi*z1@F0Vs)*iCd2uHF0-j%eN-8vDUzN(I6xUY{7D#Rj~If)dx`k|PHlELQOdn2t>PT+NZSxl? z&fPKKixsM3q5pO^6uvm={1pQii;*WcHB@VJKpErbSxoH=vfmF5VFcBaCcFPT@t-j{Cq$DJ! zU+q43y_C62L!rK(9FqM4kjcAe#cO_*WvlcFdWOS!^sj7R%c@>j;4pdS#x6?p)Tw1! z`Hs605BjFwOhihgPAi<5)wW<^VkiKWZzJdhI;0eAmfA+&tG+6}Lcez_m=J8lhVG!! zHx|B)hx@VWMz1%z)@1yVZ9k22=}5}&n7+fVp*|3s_S!L`GVHdTy2kY1T>f@k>`5@; z^BeM#g^Xcy3Qccjh67kPq##K~ge^Bx%dX7|&2g!1v(j19wC9=J^6u0K9h zYiR}lidi3gapqTZd-efou$J9R04LP>WBzXpce(9GgYsCxbKp(6TjZXFgtzbe?a0BZ zv4bGf*8!4#A)f1Ux>V@+B@77SI^wZ;qEcSMj`&2q-~mq7gTNJYz=p4^n8b0f=L zG^FMHU%olyC>{r35w#5^kcv4-_Ibe=-gZl}ZaN&q=7$qrN`#=`%4f%9-5~@=E@6^` zegPmp>|7*Fgxu^<`k7*e+OJC0>t+}1gupX;CJ2qb_%+(XunNO^PAVJ z!xYhkTA%P^<%pp#2%b07KhAiDTL}N4XHN>+622m<{h8aYFJP`<`)+gSk4S>Y{A3(|H?GNC-OzxzQo+ zKt489r@N!}&?tdvwCc;~Hj1<7P+>GK6U?0v;IU7bn8Wu-@d_}s@zWqfMOb{b;Eh?( zOTII9?`comcHgvGxOMU2Z@NK0{xEglru}KO=noMuvEA&(jxX!o|xR?V(lNjWZ zVD^Yw5^pJ)btk{M(?z^Et|x2O(CJIv7W>9&`u7AHfKMb4J{JXfPS!l(CcJTbM0&Ur z?BWg@;*tjoAvJVy5U=xiEe@qSXa6d>Vaks<4{*JAHcYc#R7sZ%@}ya9zw(-`YC7)l zmdeBQ7-3Gb%Nt97N%jKhiVWuc?HHt$sroUw|(%(_Dp2A6eo zHY^`h6ctR`sa1(z0er$f!v0AQ+W%38dG&SFK|tfwc31{Ty1m-@+In1B-D3J_vi|cx zU{|f<*f++X7x{*+@Jlb(z#TOF?~XP2kAo4JZ1z3+y4>&l)4(kQ-KnWSkXC9^9V%Zb zkIH_n$y7s+!JTxHt|@jYxt?GP5Wmmg=@?1-8x(XCQ*w~9uDWE(Y5#=#lGgQ#>QW|8mPre4m z(GPmJIq=61!U?lvTx)qA0q7tQ#E8vBqK#pfqV4X0CEj_;t-#Us?P6@){}3f8cN{8w|Sj+9pc5%7($G| zBnAfe-|o`i+!;A$uYSP+NRvl8DVz=9oA*Rr5IWyns*sL?ncOwHhU+z>%c%8<(`T`A zGL*!WnNF=##6a?D^ zc#xPFk#$n<_hO=TO-i3e;vmzmwhTmyJtK! z@owEwkcx`-MR;R1qAH0x)2`KS8#m?$N&b)Oceh(>Hp?s7ILk>mu!5E<>3>rf`v_OA z)i*aHLo9Kl+^z2MC*_hOUwpjQ9(5N?sX$rpu=$) zO&aLx*<3u+xxXl^i=4C{T1e{1AW#{d@l@}`_#hkU`LSKC#J`O@yQH-eNBX`p@oP+u zKUV0{@x_Ns%AOPd@WWr(QY00`zM{tZjbziCv`IM6<0WkTGo=q)!+86dtqHJl)<`Gf zvFp>KKx{jjv9%I=^W{dzer&seN|4$m*tD`DznmoOL30A*4LA)*hKyt8V4%{SaL~!N z-cGf#-O#`_-ikSyOSni19fI*3(8JeVwpy?O=jzeZnN8+&^nvM5eLk7>QhPsIkkTE;V3Lp7! zx^XT0dtvfZnsP8`NjsAR*@!7KI>>vSTZFK}FXRwlT4e)?+#L_LiQSiezzh34(zwt% zSD%%1l6}pFgw9Hwe8ZqU*NuLAAdt&s;R~pqQ*+65G5?%{x%?o0 z#ved0?F%*w_shZffo|3q?a#ATkD`e6pIdsD+p%}+{ocUNRP~ACpyMV_m?I=$Y`dnf zc6~;ah32Z4t+?NNGnsXB7Wh&qMQW>S_4Q<90qd4(rIh6al%Y0*z&E_(s<%OEsG!M# z0o=?1&X<;2&c75Mcn-g^X{p1_Jd3p$5z<*`F!1obUP_resG@!99^s+%{kJwsk?{UY zL>U)V_gfH`>dV0tb8UidhBc*c&dVp7(@A<`DwlcgP~;1p@Q~p4DTwdKCA_^&IK~X7 zP*8gtbjJw$*xxV8WR%F+M!|~gzE$<~z-wTCxjKka9D=*~coJrIZVo#!=-(Rh7RYrc0AuO(c7DDw)97GZh zCRh9QG((5E?MaXsPh#=)oXhVM91;N)AqHQqRf@z!*9>XeMAf94`mp>^gf_uZA9uURZxC?*k{7K;*nViMK&wYyRN|xh-89;9uc*tcf2mNjy{g<3+vD5hPzNWZttSnXV ztc&VE!Dal~(e?Kh1Aq47A7l38Z~eEiPhzU+M;q?Gt@TLfPDg*cBvhh4h(;RKgC|W9 zZjQT7PR-VvUR&?XB;wFa9xSqqccL2dTzYF+XTtg4TC*CdK*P>504ASN(A7_cV>>

71+O1Xh5h0o5CV6>)=+vwY%&Lt9u9q-{HO`l8I_ecwEO7leVXQ$udTwL&f zRVKSJ>HSJ#?inqWH5<4eIDCXkX!)er>jX1mFzu&G{%c!xSpM%j^XwF(#m=|O!=;UtJG)T=?S9mb)uzMb^(X0xpzyQ3a`YkYn^_xROA1lIQSQDXi4mpVWqaJd{0%4 zd7U{izeog%#GK)y8xGx~_vdx`HW{ol$5W0CXU1G(kW@PU*_{x6J++Y3dj8dkf1E)e zIxSBUbd6Q2%y9;X)6|wmf=QJNyIN3$u_|J>5K%g{N2(>&S&4O|^h$+wa_Wh^29DvU zTf0wn<>WbI#V07j{jq%3Cx&+9YyD}m6m`;uXQ(MM9c&I!&3VOHmL(Mvl|UnHSa zf9JMP6E$A#Gs37DfnG`swv_9UgdRcm0`@$Airzgqt`m#rH!;vAB3|?~fA3(st+ucU z%hIa!1D$@2-2(adqnt3+G+Q!D zBuC)%fh^F+A3FO>J+Q)fvhH`5C~WDbccSDl+ARK%>5|3LD{Hu}Y(><0e9lWTn#8u2 zyrTu$yJ_H;r7I?b_yvN{g(qxV&dz5l03S8H%88AKT-oIO3CtXN>WX=DJb;fR{-%o_n{6Es2qs z4FxxTNF3ME7cR{!&0tH?pQ6_9>5KZZ#zTM)SpU#WSLA1A>H|~xp0{ZAzi8g5tU0_f zgGu{j_VwcaaDGk2XO1`TXj`XD>JQv9DyZxR) z!_wO}B!6Uu5%z-4G>sL`p)Ym(&vs#>czJ_S3i`OyVnda%@;GsY$q)Ez;TH;Z^qBB4?P#3JJn7URxS|K+F@#SvfP#Wn zd%sPO+VA%ul@dnRoFyd6-=DDW%Zxn}tK~)!b6;m)i~swJM6bGR^Ao1P*kg@yF1M&@ zl|eD2#rK4w>@tT#X2&bk10lRwbST#S2v#{ZABWx#%Y`7ieFd{33a731l4=!uB~V{i zYv`oGYQ^;61cDSlfz9o`?*-BlY^MZUWM?zd(tJZVrD2DBza$X6q;lyx$e|`~uTzEY zm4@xO-?td1y(MwI(WM4qpFHqiTeS|8##~t4J}a%H{3AYVXsj83bocI%N62$&!MBczAEc)`7XT1yI7HWv7r1Ib zi6#4FvPNoOw&!*ZG3UPvXP{IzYZ+(*8-ZDL_z0d#Rod9O6P`Wpo-X#n|HA3i^4g~0 zk8hiuD`bgg8E@#7(O5oTVZ=|O_lhO_WzCtXq8wJmJ)OD-m#F@C>0tx5dXxCt2KMj$ z14-R3Kg`8T@;`@C>M-*|ezA<%Toe!c2R-?2K+iE5#nVpY&4K}`)igEaC8LqYRL+)-*>Rz zSJ!{&AjMVL0tOEd$5?5!u8jSJI?D}q;3io@kKC6B0`r#tN(mM{aGXCz;|MnVI$Br zU+;APID4*dE`B7iwp7{Wi1qRDazT^@i#`L3;KqH8z&&B|I#_dp@3o6zhq&Z35Jjy> zVl)yJLXgE;V6$38S{bAYyQdHpc0U?BhPbIJ=8Ew;6yFG{RyfIXOLh43QvD+p`N?fY z=2&d;Qs7`@Yic0tMP$gh?U8@y044*+Ofe}hzY-$ez|mL8Y!n;B^{@oa$5yg^30W`F z{|=9nd>EFQ-EwITN+w8$9jTcNid{*$tI`e2uPz=Ar5o13E~&&|Y|0~m#R}n_1VFCd zdq>}p5V~rBSBAPPELQ~U>*+?~j{%HQXD1penHz=JllE*bRJ;<^8Jyy_GmM!HPLdUd zN~ngXPKp?{-m`g}P#ttGBaDF0XUieJKqv2y+b8T4<^E^JRVb6X4NobRL$JtzITsb zxkF)`1)m%RE?BF7T1etZfJRZgiJ*h#5(nkR93ufyNMM^`AixhWx)8d49BvuL= zZhqHC6BPPbFvX3ii<%0XaFMgS|FS<#yYFdu+5qST*2Y9fD)hc>XQSvQbXMRrUb~X7 z2D?2Z!$v+l(dzm~@fnx6?(0s8MtUHL=<6%K<@JIu_<4`7_26_50}rfPy{$jp0Sv(| zExic^l*YWYol6_|TUW9s7{hX(hh${>NQEG5ojIjavH>4I#9M;!h<#v0351mxSxR4Z z?nVE#&Fr8>&}F9tBx4%azm#QP^Qcc85I@bEaE_;iz{(zr3G_QX2rv z^CS>{-9BhLA`XasL{sGAdO)fhA%dUmOKxQL^~w0=*Ux@u^uSLC+=%QnXEnUn(Fg6h zS6)Q)>Q7e~JxOW&b&Ix8CNH@HBMq(@upb~kbQ zSc50iQ&3S#sYkvgiYkOq z6kO-%Jkb8*=F5bIqHwh6!Na6=i2>-9?q+4EPrGz){3vJd^Hoi;cO38?G|H@y)27C1 z3N5f7YlkKe^xFvTFaj$%>_9(@EQID?lI6tJrqkd0FKdg(v9Vp)zOSKxXp@Sf{i(%N z{e5vr zgq#Kt#{;Inr|S|RLY$VRc>={eDT#^v8Ts9J@mb69hjM(s7`kw(gOzZ~NazL?Cf85YZL3zmRb;3D5l8nkBM8iQh9Q_TkSk$EyhY ziP%d!AULCf%Gq>Ot0r?qZ?^+T3T(q&;_rN=*_$$m^_-x)%b zEDe_ihH0!1+TP^lm^L;jWdZ^MpJ`nd>=3wEA7(g{gU1f@cWH6KwcX(8^1Fvg5^y&96fY1wlpsfxK)E`tHedW?gG`@_N{LYZu-;O# z4j`ZAY**}b#Sqe@2kO_=5-1Dm?CpN|(;~7NSeaH!gEHeP1Em)+PM#($CFpm^%u0|z zq{--cfWI1P5e^TG{WZH}|^{>(xQ~7I?=UN&Mgro04q&_(NhbkE4m^ zVYSZu&#Ugn4_7M}ChI>NVN;TZko6!_ULtS?8R*hKLjnho2Amau!`%ufmCI0477Oe@ zU4@xq2XXbQPS|v6D$~PY&p~YtK4AJEe3|ZC+Bz#>ss}HKsSzU$*5io9m2obbRRMc5 zf+;5mr8g4nm|#y(mTh*VkNPn)TBH>fdzXW$f&v%V|E?5m3F3?4`;U1Z6)FRx+GfQ+ zK9B=&Adpo9`rl`nu+J_==VR*Es3$h9UhZ+uAej9IONW%30sZ$}psrl%EH_D>{+eQO_=qd7NP9U0w zt|*h41;TWBAS&6$((^6)gBa=mhy`Q1(1G(wHGO}7$>X|lxUSY<0sl06uhjfXBupw)Cc?0|d($d*apvQoC}{R@!>VGs3Eo{m`42h_KH4K||m_kL}<) zQvgQA9u!1507*!6btEDM0{mVaZTY}FmPn=l)XD&GQoe_LWyrXgAx-HdZU!Taf(Uk} zZ{ZEZDw0dnVh#7dYGLaINdqsAAQ+gGptc9B0paw%&u>!);-2B8B)ZDi(c(6%19Ve} zrZ=M)g=iu~5>CDqKVZS3X>hf?QC@LE^W`u2!FImtvBJjxfMGyeHO6)aPJW{dz$dSQ zNhREN-(t5K`M(G=HqS@Rrvfx%>_YPC%qoL0mvNV6atX2%T`k9x0nrxqh5fMNg?L_s?Gp@oG{X;I|7VS05TpCAuNc2 z$4L}e1O2ajFKZrL#?VUm1>6#X@L2A^F)QE(msT~ilD@G>XcIDf2tgPQ7`Z!K_~Cfc zE%z@#Qwjk7N21=Wj~0)vf!t`3yB6d6m%aaomD0e&N^j(Mc4yEqcMMRtBr_Z2(U}FX z@v-6oy~~J6FV#<9r!fBuI}}UVdG0m`=?f3sDlwuws|UOl0a!D@Hn34QZ-#E&YxX*3 zqW-T|e|PhdoB&N%-o+@OaJ2G@3dgJgg9%1VEd2+Dw~TA1JzTdo5-lU}KOW=H34V27 zyJGUDNiDAq7;`@Juf*7fqJNd*&^u=Ef%RNZRVxmPGFICtA@3OfH?H(FQEV*q^l1wV zOuFGs*pOo@bcQ@A^+6~D$IM6yVfo#v7#zzlF!?E+b{2W>!B`Bj@d$aX{&BRQ65{`m z-Zy?&EN*c)Ka)S&koKmty}Aj1;#L}POu(eqB_Qwxw>jTc%;sfVR3OpecJm|1EM)afHWN3gq$g~y{{wA3yt)*~Z{x*&ruv>S`-BHoIA-PFHh1+{0d^>W zNudCIPklgS$AOIJ|JPwPv*ZhtQOv4`5tv8C+uSfuV__0yB19Im6jK5hV|TKuB&+oQ zfqe2T1$PFago$lUGyAq@!-sdnmS*<=f1`GkR0dWZ49a1c>bSQCikg6kd{ z6!)oNe)jaIVFv@xYMUGESuam#zM`-9ve6nVvj4q{c{arYUSNlhQ|X^htkRGI@31Md zDnw--45w+YLn05C{s9F5iQBxhRJO(Azg92T=#bfG@Y2bHL4Klp;XKMGi9yUaCeilUA=SUXQbZx4P&Z``!C z-%Pnu^^p?YH*Hev-7;abI@9Cf355`dhz!b0W7WKCQWXl7GEAjy!T{wj@q=)P5Y)to z`4M%=AXb=m)7TLc=z%$oe-1ig+$Qb`V~|;aM`&j)xg2_SFC<%qga#I`tb(FaE!=cJ$P}L*RUsng5I+$q-&&_hAeL+;awBQ!NqBdpU`x@$=mCf#Y2oD znM%$Z^W?iOS9OP*{m)(6y3qf_pI;Yln6!QT>rb%;yrY6kOC}^|b$dGSRhlO}D;jxO zdZ|Oc-=n1MCv@gzG8ivO;fW-|SvGD+Je&kWH0=Ui1dFu2tV*rFgX4qkEH`r0;7e9B z{5e;dY7Ex$i96ZQxFim%x2dx0Dd&DBP9vPS-Ej1ip@4)4v3S;mg+m^mX1sc^l5(>4 zDSmc3_C1Y{8F~s?Po1mhmY(%3aHJUd5V2@&jW5 zAq0ri>GSJxTY4BExb*s?!$s{JQ#UO+HhMgt^No&dbbPnX+^@~qU7t(#X&81*7R%)Nh0*|o zd#yYjdjP954#$9Q;lpi6=6F9QoWGSCartFocAKzgwOb^5Y1P7);hCUKy=op-{pd5` zj6#Ay^wtU2aqF_R*G(QcCU}w^2Bc}roNJ@J9S77HYo1Y4>?xvtdoX!+A2)jY{h_#D zd}^ALsk{4T)8wylq7Ta7exTjZ=u^xa_E&G?eBt7w4Y_#kk(=wuHxa{rdSohy%aTK# zN_X4Sm)G#VoCSB`Mo}RnG0*m?3lrtkn0VfU_@=(~m0N{hXt~T4RI`7Z6wl;n(rTQDhs<1mz<=ef}JEMcKtN(rnj|=iu4&bRveX9%^X^Z%ds!)7h=3w>gW5yNl zlDB2c$Kt!-MX|$9Hqw6F6WNDtW5j0sW^Wb~nf-S@{jIkg-=YsJbD$yjR=f$M0}l%_ zqOKps6rIyo{Smaq+Vw`Jp$fsI9J{A-Y*Q$)Zcx z{vsH*eJhG{_INTXsYR!E9P3uBZ~)4V2dpo*8}8~Q!~hzQ4&q-V)p}+RCj8X2p3jhu zCaYt{9Aw;lUg>oENqZZ3-isr>bA@;Tp(oc{HIG3&TY*eJxg!1`9j*$6lY@f^DBj-) z3rrt-Z5`#4#{a^;bn2RAy=Ff*0v&1>7rrk4z&wUc|Ecd6+P6KAY4uf*B+!edYwMLV zsY7+J^(Yc(oe;yGjVJ2ph+M}krt4aA^XOv>x*v2V8j9n{AEmCPZ88D29T#2GI#N%& zigN8}42gkd$diXTx&RdOuE)G7A>(Gr)S%%{s2DG`lVjt@Te2CSZxpXf`q00=Lm;Q0 z(@hgSkfb_`88mLo5aU>5g?N^7`#yT~N14 ztKA*)@)#I_iz!*8P&(79XE~zOC|W5cz;Ps|vfAI{CA(A*$z^Cd?Xi)0hg`2~PvAK; zu%q7gfGa?u?f%PJF{6(e*?*fEig4EO0uXJA2mMVb%SyXyrh{Yi!O?i%YHE#Lrw?fi zPEtRE@REH$d!8}E0FKZ|>5P*As~!nTyNtidEkU(pvc=ic#g8(t0T zr(BD>B1h|6f2+JqXhHO~%&R{kkMV;YlI!k|x}@C3f7Yxmj5uDpduSrxuRY5#s#6Ck<^(;=~C#X-=#}xbKP( zhcde-6Aq@Xi5d}7T%5P2<$~IeHUf7RTWcHeL4Y#7I9tJY;k>Kbzf-^WnE9@v#PV%O zmo|=VC)Idpi5h$9Lb97XS8gZlFp?)H@qDzcNQjS>LT4wVtV=LT);c5+6si1r%k6zM z1KsabS?KVztdZScxD?i~MP&cIa|^#=h+v6NQvHCnWm%Zmz_)^7t7m&#C+^f)nh7pA_V2aKXKj(y!*C6Jc|Yb5MNj zl78zdcAtji!#()dpA<(nZr8?k^{74^$q?9IkSG%Yp?sTP_koQd-BXzyGsu4T{{@pC zY~e8jiEDli&^w5Qpd?oEwnkFdr*9&qzezv<`e!Y$*;b&Z9VNu9eqUa755#T+9&9~7 zpg+K5D5;I@zo@(M*|t?SLo~*^x;B${4EpYS^yRB*pAF~f;or#rVswD}VyxHq$YwJ? z+J+z zpIdN$+$_6CBTerfLpr*qjfi!0c3bR(0D`Gqp>ss+HX+lTnExg6Ao%7F zRSXFk2*<^gp@My9hBvpUSTpnO`o3Zb--VT#!_5jPm_c;DFwXnkg?S^U{q(&ujz5qe zS*a-oEz-}<#qFUXNcWrk=4+Kk^kJE?3@xTO3 z5V>@+GkcFU%qEEFlkeoG?&@JwpND3$*q3I z-h-iHCc`0Tbb?=b?B$l$omc?mvLgAU<>wOupufPZW+1ty6P*C0N28Kkxdn7Q(jkpL z^g{$jNYXRL{IMvwHq+hF#~ru+00PiIYp_N?@N?+(kn(>pzfoAiDsMfflTGH$7QQw& zj}Jt;r9V}H7a!H!{nyOiTei6dEMNdz246q0s3|}5v-P0wr1+Tmcg1{|`6NI5A2YME zsh@FxFqc)9>z^{gQRMqCaSvK%kun?@Tvuzf1cuRT9i3rP5pxkxUOEX0M8h?p-(jnH z1zeM%Me_aKdFkU}=#Rq{;X3Aq6!djlKmht@&3u>bAk)U6?~D56qCDihEP=_nWebTU zwHCeY41ZvX2k;w{n&2kx9hCyb@cITMZViKCQDS15XGwfV|7ig)mTLMyiNK zKtE{I=)YRmAIUl$h-P&>sahNh8LsU7I;VG&BmL~?Xi9H4!3dxw0*DXp6OaHGx0{d; zf*FK)!+7LFwd{1}k&BO6b`0kY>&8jNL}wig7<%_@vJuL!bA_lq8^6~BQkDb`oQD;P zs0>CPKBvziBV)e+5zr%#qMlI$Mc#lw1oUUsCC@eD2_)-~fF}ZNNB+$<@cAjRrfD4S zOJ6vL>5m#cTn)mOag#&nGRG&CeicZGAQG79>`AS*wGX@yQCl-P4Ff5w_zn*TJKA`9X zrvYp9(3utBmANkcsi8k=_|O;hW?K3~!)l@L9i@+5i(M%{fB^K*8YkKfum&tP+HOwJ z!&t8<4=gmTiVcV|DsGE` z^228MKq&vD{GYoo>+Vlg6ed)jm!ENvNGb4M!ieCa@4;slDxKODxx@`?^}Q94(ye_5 z1fYM600OfFmg&Vd#qB8q*b12am@$|_EL}vxQDOn;N&V)Wudvih%E%Zb6qS5CgxD9x z@UK0sTX^xjnVknL=sPD8qhza+9?Dru^j}MQzKm-KxkdTBSJ%+aF)o-*vx`yfsmVK%R^*5y(A}eRO({&$L}->7%Q6T!EDSYzH&#J384ni~yDs1h5i)hVO-a z=0ij`uoWoB5MZtK(Rx8|4%cj~G%J6`mkdU^==-|!yy0dlbPD>g-hTCJ*RVc-UIY-M zxKE!uxk-jG80RGK8i_brW{l{mRHbBOd`VztA4}8|@k$UJ5rdy=1?(8>1W;7?ZGiaz z0Tf9fYzy1@#8N={320z0HAxnJyrkA&55EAFbFN$VdLR?NuA z@RNy{??Oxr^JN$kq~ToGBlInxxIO;e3%$xg0A&$CQNg#u`dDRvPSo`~hW1tTNyHyR z9ZVVi?!rQ{5;8KrRA2?L;ufLsOphl*kcKm+cmRAS2^T2K@lvUlsvOhyY|M8v!JAY0m)xR73z(Dd|>NSAHSYDYz9l&P*CT7;~M; zuV%CR_6t;M@q4^&kdV69eFTDrxk=A6{V)OiW;^>+$Mt=md-V+4oo6@K>Gdpob?=`6 zqF_l`|Kg302WYIWZs;0{8h;kQ?*_{vfSL%Pt{P!v5588T$*CE+;?W==8G94QPB|+I&J` z_Zl$)G&+dC#|R|QFCYs(Ij*S(;=$Z#|GJ_#!eU+_+z zk*#*fC#htCj7-o62kIKDm~}SZ%uD~4WdU>uAOK~JfA1L}fVv1ErSKbI?(&8u&@Y1W z11x}s2!LgiNUKaMl!ffzfO-GZl?BVNWXodLR$Z;7cS3Zg-V6ORWLYL<^^cc)-ul#e zGWH&r|D+PT^P=YFEEiU`0fx<@ww)P%p3BYU8SW_iKtKY5!1RM+ zS%j|r;iId_3Lqeej;L>PU%DIr=_kT9&*N$(kZV*8HZrF}>@MLVsOww$j?LQb2 zKliX|o#W^QjU=sq=tm1g5dYp&Y)1gGkQ5PH3aR}?P;N;Nw;~dlDJ|QwMht!AmS%rJ ziZvFxBqe*jB?6F;nfV{T8~t7q0pOxBS&NmHGCA)rLhFC;RnvU`_G-uc*ZV*@!)FY( zrMAZiWm07~9SZ?8L;y`GdkV3V?*(XSmOp;9aL2J3zlJ&jnyR3Ty#cKZx$2p7ZUle@ zP<$@}+j%ea6R@N;{RXM?W$X>eg~2lWjKVNY9_twMzo@|bi7g4h3rDv_u(7RMfHs%u z4O$>N1WUD5_xz1qfx8tG(w;#m8M^{YSh0lkIP{1hDaLc;C1HSO~0HcUHo=?-83{AW(iqxi0Y+&PkZAL$3Hbd_J1_3NZNEP?M4iMUV zU;)tDjK6QWnp$|QuOh+oJ6izz3oKmZoBkME)4!~GS0jiXpbzo;*uZY|ZF?92G(`Zh z@*@mEK*IMTK6hV?wjP>}kETd~ML}2t?T=ffJO;hT2z>yw>>GUm-S2|;&UTijqOK0j2|ri@oJQ`={IU@-WP7=;Z0zG0e9TmNzps0n z2ma5p&>|yhV^t(Tj6lPLkPeef0=omDrhnWlTd>JG0Z8FP%Wp6O@IhM4NoUefo*B41 zgx-F_d@=i{WZ^=v)IY9oAY#*j4tnWH*dOav{Jn^cvT2xO|7`_(~ z_H9*Wr|{>pO8J04geCCNy_s8a_g*(_X>dy*lBnQ}{y-$)uh&cNnOgR0Q!S5#57ONb zHob?AP*xfr+|byPrEJfUfS(V1{_mvx|J*CP2O|ylRz5!+tS$NcwEW0>w>|{~z1RxH zvhnfp_89TLjk0R|u>e+O0Td57ctAo3p#?;U1m4cCsPdZb^gV{8e4Idz71%jwiI@pE zG}d(Gy02&IJ0<`G5(|LXj7Jh!mTF6#D`RVzjCNXnI$l{8oVhP7{e|*V$8o*y21Wh( z97y*!EPxa!wB7f;1|)!w1Y^=$`eb~`oqJF0L%mg-aiS7*arF? zgZ;&AhEQHDiAQl;^jp{I2HV1QX`uoMsNy8BgiA7a;I@R5;gmc?wKEXa$COjzEf7lT zJhlRO@3d5OR53pz2LbI2^i%zPr(z^KKHGNXhU!&vYxRr_TU~p(HX!RU!gebY5N|J_ zczg%+<$#T{{`#r1U}>d802_)ND`fZ{e#hvwZEwNwppBR6VJgj4H#NKL9>_#xDlx5E zwgmbEK|QRNu%{@wV{211lew?Nxre{aeA86Zt~`AJ#%^3+(2%_#JQWXJ7cfRoPzK>{AuF^6`^? zfAakTi!0VIzyuc-Q((M04;5|=6dJ#D^j%v-O1)B_aXo*s5rEe+UC-UGSl~+PJQ*IO zO#9~if~B@2(-OHBa8;YKu9oHRoAT3eb?O*|??DN}_99aI!ZGXn0=dN7A{4iUa+|h8 z05ZwD2w)w$h+(UJy^tzj+!j#W*W>q!Di&Z`EmT)6Wc8NJ+LPBhON}L7RE7t0`S#vONdy zE43YLwJ)Ia-a&r^0D5iT3dQpAIpXc{{^B-+7uFT+H|RHJQdNS?P$5Gt=VgMCVl4Ht zGQ7ajck)!0lL>2)0Q8$gp^rx!CfEcIrOuP#7xKI)Yl=l~-pS<0bwaV0u~MxrHx$fJ z{GHlf{2ox;mMRl(-)dj6oFG@AePVg_!y57Udjrpc>FvdBJH^JiS5?`3(sRv};^&h~ z?#kn;`|a9by99?7$AE?O+x12FXsqcL>#HJLUzbL#0tCPiAhR+F0wOhd>O5a6kSE+C z>*XJ+*?bA=3v1Nsu%rAN;CFFb*k0VWJMjKe+ey5W+#cP7NC5))C<53}uH7S?OVCYp z{Z5tXIySYx2w!GZ=l(#&%k-)=K3ebV-4}Ih!RYk*S}!dG5A_3k(FcfwydF_~KV4oh z1xIip0P4@zBOQXD++2Cp-Ffa4f>J(pp3lKS*Xv#bIr?7mL_9wo(BxI9HdbYgevb-dgTI;dxg&6{ zfKJ)f4j5)6dT?fOMSg6{U6M8M>s24mo_eWY8tAlQY@cCNEGFEom;fNr_o}-aPirDi zzb-)PJYN$2E7*!X*Glfnld5|$wWK;)w%C-F)itmDK{j`cSmtA-$`-IL|Gf~(q{?-+ zcg`U>=nw!K1{vX|6F`7@87m*wIxzzu+{kp>-FextjxQ2oKm@$d)QkQSK#NWtuqqHF ziNagU)v3Rhe&f$x7ID(zebIF#d?UsGL2`5EUfJDMt3Nigygs&%EPnXZY59*hr29vN z0Q$h{C;ws~0)kq|v(E4g!!*opV_EXl3;&XERV^9e)h!8fOaM#EpKJmaom;8nz7(MR z-(l|GShRQurbfRnty=JuDL$>fV#M@(peQ}xixENdQ3kc_kk=h=% z#m9O`_uD5V0BfcwTOueFNbMh7&@Z5OX?+8D2Kk2=biJBC2EQYeE2BInXKu(aClq?+%_D}bu`|T4S zK7Cpf2e=PwJosjGZQr6?*tgYr;(g(J*dFgoZrAw@;rA9uoy$ITJZ=F!x@2h~G7i6( zPC`Zt@B@!C8PLKroW*ggo`9M2M;5jst?9&wD0T5{|fd%VrdrrY=(AwE9!8NSEA<83i~gVy=pLA<{g;&S#~=aKGr2%xhA zfhZzu4`qso%k38ZoNK4oDwgNr@#|X4pKM8NV!0o@Zkl<_$rgJ_7@=?wPOM{ zws)6{5trYp954d-C;|wD*MR=x!uo3P-?h!@JNs<^25es!{4w3%xr zt#2#bOX~dod1CnI(sSF;4nsUd!M%9XGIQ|sor-19IgTW-K>#1ECE?vc1h@dh6Rl%O z0K`8q`a?_zlgDs@<|{JyTT*e1`8r=TraNeQn%Zk8^Yom)-gpkpKknNj0GF{=oJB{KMGiCUpLze2n#NDzha* zxu|^dIvr3T`qL57f1Tg)dH7ua-TBXcgYGiE64tD@7qgf#a?HZ3Pir=LhOpS<)eDUO@5rM)>n@LgN9EK&DfHZ0bGq%lodbSQq7@bq6MfNlP$8T`eX z{KlD*?IaqAD#qa+w6TlAssHKk*E;^F%q3Ka3 zhu+OjL?Io8gKP~j$Dg?n(@Y0e>lps{#xuQ zUc8?y&Hevn0{DzSYKvBeDYX?w3`7L1r+00rt`@0cp~XxvNeS>_0i`C5IxE!9l~=5P zBmN`71zBxx%DwSKHdrJ;eKMp+?tSW+2+nC6(jy-qLz$k)^54$>G6C%Jk06o|LqLMk zAz1_r9WvvPmdaK!N(l5p19SOz-P4m%)(2cQ0*n8M1|%wyX|R@8aR4kC%zWw(#b>78 z<;Q+3AH}D|w;-M@xx4zy1h5Bx2q6kZQVoUT*Tz`B58}#yyZg%out$H? zAfThLy|QM4N`@W!2yQ>CTkrdCR~Oy)Qbg-CJirzf;$e=1tqoXOH3cfRoG24PP_(Xe zZjwNh<5K6_YoPSh$G1@c&-sTHb5|hJxAX0F#ixF=xbEFwCV+kVqlH3XYidjn{|6k@MI@)L&l80PaKz*3^leTF}NvmHfyHraHiZkOEu4#)~X@qbo* z(6M(}?i0QG-0Q6Bjrv<&@%Nnn_Wmyuz&`y^r2rxz0Vi<;3ss+xga|bj;5;SwfZ!Ec zJ(OTStO7^|!XXI?1=r|TJwI*|qZ32pO&g*l zUjsfqBNgpYMhA=QlE zvycmU_K8en?ggEY#3L|6)BE`TzVhGx{bd3;;6H?#9(Vc)>a9<1uCnSTq?}|gzW=J} zE2HrYYM?%3s@TDpL?fC^;$by!9d}i4!kYdMQuRmr9;tJ4V2zjgr zJN1420Du21(!%rbTvwjdr1VV-JBE}9vnIHT)*drIEB(R#Wdbm;-G{~a-nmMae8kh_>l#aEVQne)L0XwLMQ13mWGAJ(s|aoZa;sN zr@w&vVKpJ{16P99+gui|ZwgN9?yt{%aev$=_ls#yWFeV%=>OokCg+yT6~ect(=iX_ z9qwNyfJ6SH=1~AzXCnidz_h+t1`KYo4CKPR_np3B%3J8O+y?H2`ykkfdtlWit`}dQ`?>h2=B^LbRi@z{ihN#7 zwJhrnk$NQHV3?8nv7CEq?YTylyuo{rU+`Zhfc%&L gzTm&LwYB#D4|BTUFswynuK)l507*qoM6N<$g4i+DzW@LL diff --git a/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/icon_ivi_simple-egl.png b/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/icon_ivi_simple-egl.png deleted file mode 100644 index 02539503312941be368a5b69b21c57e135d4f5f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29316 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 diff --git a/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/icon_ivi_simple-shm.png b/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/icon_ivi_simple-shm.png deleted file mode 100644 index 6aacaaa8743c2ce103fe033911052d737511ee24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71120 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 z z{A+v=zUP;BF>R#QQqA72hjiqzLwiH$mK8%xa7{nKYC%DOB=(D+TikyysW9Y2^~QvY zaWTB%L-}ax9m4Wky2g1PW;UpJY<6FrMYUFKZ1<>TzG&8NjdZ%r(ZF}& zkAkm4mR}m&FG9;L=I``U{%aRpp1Gk}9K$3+#tsfA<0vRtQ6Qn)oH$ITznqsmN+IT>RLic@<2#nOyZhkgqW((vIs)SH>F z=)RUF?DPH@^SWt!Ub3{iY%F~2$Hw863H)hLutTL#;o)HB{;5mZ!_iGO`()3vdrKyB z=9}W{uU0<}mA@`FKVm9(?wE|&-jz!X)>&uTR$ag}q|DzrJ72?kBi@eb>G3K=l?WWC z8BN&=TCGbh!@E7Nm6WI9a_?snwpJp@lEZly%NaOGHjZMQMMf_44uLr%Q54B63ab`T zr{pSXY?G@AI6H7W!>Ryqhh>Si-ry+|fU0NoAs)VuN~%qL_%yZbx`X@b=D)+>(7L@-zojVx_9+i z>4Lvy=$N$J*3x}pxDT>q#$Oa16i)H>ZE^`^wo*_0Wdyc8a3Wl~Fh zJBM7=t01%meN&ZB6Cwrt$n7HapZnX7YbWxv6u<+3Hq!u5(00_Vaw{&R6$<;`8e zo$qQ+bG{g)1P0l?+q1!xcL9^dP%e{qHHyLor_8WYYK6mbWgy7OJ6;|dnx5gG$?U(b z-H)D&*nE^nYB^pKf*d+H|Kp2CDn>d{ZQC=ttydWS9SUp`IF*d~1M<`4>gl+eRK}l! zy*|i%-A#z!dP6UX(b8OG9HRE*++bDF=Ea)!DSMdav!FJ}arY?678giPCp;p;7VCYF2|i(>wa>Q^ zDCFljn63!c+381>Mb)ZcZvbP6tK!y(AjWkn0zjOmFmIVnEA)YDY9kw zmH|{NB8JI^ZUY9GPNou$yV{Wn@+Y{h#X3l^Q-(^XYi)3ac7f8y4j$YP)ybaCaKc6K@Sska z^`h>XD*^hsTv9D1EtL{uf%pBK5-eF+_=1m|x$cEMCzM5(0 zh>s8taQQw{;!B6H4=PMwXQv>PP7E-VmnWl{oB-q|qJ^qXRr=Mk_YEy;96RiW<{9(X z+euvcI^JX2B5@NSTGLm3&H&Imzyl%v$c#nUV#pyYt<;J~IO&NN5Z_yiq~_Q|qfxd+4a@@I zADk~5s9{$RM3Gc?TVjzU{L&LhEPsE*;Ovc7tB7ET?b>qfKuo6yc;JHgbDkc_9)6?C*b zqwVtn%OQGfIcHi${ePiSQ&bmr<=t4-mqvS#r?DqVPo>F?d%kf<_O8C}xGm}MxRiR1jUzftR~_Ed)B zwAMW0`GEfW{B+(vREeLqIGuxL>|#6MDw)7@JtvV&5*2Iz%gcKX$A_n`r0Cy1q7(2s7wKCLD=`c86w+v+#05 za}c#J#C5@PR6G6<&&inkMd1G)E(=A1uA}vc*Ye&_vpwXOhhyES5Zs!I7ssa}OX$F} z6X*^bgy|J!0H9}DBJ-xV{(+x@j7gQu(dFIG&Y(Q0Z#J&0r-+lSx5^PR>#q|oN1GC> zx5|gEuT%N&jT#^6c5@|4&YajqnbQx_iAsnHSQd|VG=-ZmpASypdQ5z` zRx2zLASD)txWj~uj=_-@Y~0fOcKGlcq5+)3#7a372@m-&2kBKoX5v;=xW3U5Y1mSJ zdSHT-03bx+n}A6u!_kMs&YGt^)9PK9TD}zV2Cd%ZP@5rWLB-@tz{v7>>23P4LR&mn;07^pQps(amvu2EP7*$2^Tf)C|wYg zxgr3)a(xyW5#~tO`ALC~TccQ8EuZF90=}E@FJ?;iV5thg`o+8`M=BxZiriw&^UT`Z zz?Zyj2gMIxMf`BlY#8Ot_E&$ifSu5_!?YKYTX(l|SwjU5JyL(4waK*X*QSxo36LGOr$@nE)m8Z2SF%A&M+hO__T4N^j#{^%K?7gc0+(~C;sc*Z}i^BrPKWc zwm7sE^f`i<;^aq&afnN?tm28u6Ob>21uUrV+W2;55}CF$_RBrtKrDM_49H1)_6Vi` z99fAA8Ns}k=s7$Dmp|=Um5G!H0h&evkX2>B-zxxX>|p1{UlP!4^V@%}lnOsqNEO#7 z@L)oszEQW54c_4eQfLx~kZD@77WM%f*1|K3_&TOp4crVmfz~qdP_R zY;kN*u?Fz-lPgW$6RqhT*7iAY+%ipydqixlhN&Vf_iSL{Ic9SXR!21(3-r8M$HK-@ zLj|pR3gAEWq`iAs$ut1KRdnN?CHiWC39b_YssbRyy&(r00*rk<5JvE1*K;j=Yl-RUfTwuZkJ`AJ<)=~ zT3ADcZv$YD<>VqeLGcintJwc&y6$MI|NsBK!_DO?d+%{cHreAULUulx*|U(9Lb%tc z$X+2c6lG_nj7!&^p%5V>vbT$i-@ETQzjN*%_uN0Y@7H~e=ku{%8lOVh5@^)Db zH>3FT;dk0}(MI9vdYG^S-L@;&f|2nNng;Y>~R?=oIIvh6aUbLm^(7_KZnlCHBm|&D24q5cyl1z zSD42TiK;R3qrTb@b!Kw5Fh1p&nf8SF2FTcau~^K^Cytoujd2Y+V6~8{63Wbtz~SiZ zplg^P5T`uQ{w4zJz&so&1deWE6W&+W>iWv}XutMD3YzGB=8@!SwvPFMlz%+EyehR5 z5F(aa+0Z=u*@aQecHC;*glq5o0o@e5i)A-saYtb`&SYlu=yWGv)kaL}2T8Dr`RQ&( z4=#8j|1Fjt+Xq^h>WCIew_xU`q!?z5OqeqYSIMaan=4go_2D3|h>FYScG3gBO_D#b zl*YOrK5525_-|)DY<)&y4U_rPo zdamh$jhep{6B0Wi{^fcCME-h2(hN*!;v0zXRT~;9bO91Vq4fEjrVN+9V@)B1uYIGc zJtt1Rs1)y5MV|}C=o=x%W1gMNLvpxKk&?b+&b{c#yt@L85`927$bg!YB+#Kl=dw79 z8gSGcR4YG2sW4DutHk+aL>IhVoh)U#fT|=5aCQRbt!1IGk{v;;XwXe z3p|Ir7%z(gHI(q2HoHXTraIPXQPyBudk+TclzttCXru)lT|?)rMZ;iu{g60&-4GM#Sz0IX<$42TFe1fiXPuv*g zxlIalUP1H(Cx+pAdV`l&1K$XJ%j#khe7XLeZ`wBc{epFZZV?-ubvg>Oa9dTfb8%g@ z+=b-{8mHexN+FKxkn||7FaBg=#t{q$gV8WzEi+!L|GZaVcRNI1WXm4t75ClsL~_kI z9GcBE^L*3l?&{9tKVjXK{ZqTAxci!LC90WBEyflPP*5alW)Vmw8DXZEN%v?yE^{cl z{yv(&s4sO5+*xi5pDy+qrBz`CU|+doSum(XDjbfM*zkD65Y_=med2GMsiNSv&{j=$ z6`2ff669iwnoa%87!ipLH5NCR{ZUJ_VbA^TS-&99c|#JN8y~2GPHKV@#jNwFxR;an z+=d2DQ#OLK`O{?|9ILqii&}kv@~I=R$lXti^#m8!8%DJW;Es)#1r;pOJOwyb5Xj@8 z&4H%Di#Im&UW?t>Y<5ET|Du+aM*V9E zzbxxLTjaX{`jS~MPQ-iZFwZY_>{IC#zkd$J=ls~qGlh)TQhX}Di#yS_)n=vql;*+M zl%Az>=C5Ml;MtI`_w#WhMMZ*tAlB%LbDyh-v{2>H<@C3)zm@#>cKn@qED|}Y?odv?sCEGNaK0s zsJTaf`b;(^XXg!TE+8$3ARw0T_M&YNNG7Ja|B2(E#r{6n7)1b!u8Rp)fx#Or8GwSA z%~WkF#3}46#*MdG;F<4?dH*Cmzc*pVI7fWUpZ|uHsM{=I;hwJ53(oDBatDAl+c06* z3OJXDYA8GXjPplOx4|D}?|BIk0~x%vhkOOE&smb)b71gREBBseN){B%=KdxetW1g3 z)|+@{JR+CS3K#hSVGI#Ge_6foOoY^5=IF2DKg+%lq^uXKcA%Ko-N$#O_4Rt|srI!V zrIhmYhai*pzzc8{bDE}4g=wR?+vMiBM)VQ*7?n_Szk4ENiY$j+wdi&Tngu3JOmPpnBai9?nMr0IllRgU2_F+hJ52S zDS2ENKKdpk9=0?y0yGtdooItRF~Ywv*{;|WatV~`COvzcnUuV(BkQ9+B|6_Pt=-w_ zBe*40F2yeG=&Wa5?_Z(XLVGV^jo!GZv?E`X#_=aB}OO*nT#H;-w)mQ3{emovMM zx{l5I?^-nxRXUEXJL_+I5G+7h`u2EUW1_D|4r)#}`T`^t_ZEsx21A5*u)I6i;BE8X z)+>ixKlUzo^o1@7ZV4B6YXv+VZ|Rw$Rcm}TVWCRtwK-id*bo)RcOux3+99`=hSfIP6^#xGBczXhUO7{;OjSi%NcWg zFrW0tE}N7Uh3Ae5d4FkeZ>Mr(+}sUwM(?a^P@JbiJVX(8bldgZ-j!ZcX}!|&T-}W< zMypdne}6iGE2WE`Z8PRDC$fh2@@K-o5CLVILzD0a*wxWbdLhcRef`(u9*fv;y&vju zXB%s`7G14(6tP+WuC|;ko;U%lTAe9fhUlb_hONGJufH_h%yoY`$dR(Q1b4}zqt6_R88_uaXN^XM zv!XW$!~s^=QS^=@d(WE%!(CzDt@5YMkb9{Rw`nChZC;y&`^C$Sl&{k~OY>Grr z4WhT>OhpU@Prom7m_2lBd@M;t97i~u=xU@Gy+xDQ!tyydw{)REx?OKp}10nBy}donmzmP98_zIAm4?#%)NdVQ$I zr2@t}xKmKIej3tbK5xYN@92GYrUJ54)gBixU#g9?qUlh*wWioWbNcONwU63+@jrKD zfL&|_#O=_Q4TZ~gEFfyoT{#XXstqrypC`VEQe(x?6M1V#C%#Ly}z`grt&*>yX#f{S+p&tC{iPrY9k^cAm02Z)_ph zvJ>bIa|3eE(j{@P@XIuswxd#z0efJPK850WYb=C#+?snPdd}nw7_njcPa8p8iAapN#2(AW3-BxUxx0LE zbnbMIo^9=26>1B4_@CJ?#-W+6y7dODQ7uGt*qhn?yg9l@;U8&tBEUjL%5AI%kY4FW z)rQ>A0X2VUESYngErkXjb75MQ#H)Ts`5vn-tErm!0maMN?#40Irw?ihn0(O>$H$gW z&hB9Emwq48UbTJDI#jLvJ~#)hw41{q5a`#;(YGODWeL2Yc8p?e%&mbsI;1JZ|Rh(~c*{huK7WTU&db-~X6 z^?KIqMPoG8XXA+q?)5ajO%tQbx&c~g`~7%kb&_C)Rl&gyBkB1URmQ$9MYrY1pBkhL z8d&5_zVkTN)H>Fv>#Vqh?_MW)P<^A@-0ZkISBuA}ZNPjv%C3lfLqqL%qaoj;bW9d>QLmj$@H zMivXee4QtKz~g%@s*~^7r{<4<-s>{exmq{}K##l!NM*|F1-jc3oPfpKGPoycYIwq8 z&wZNih1Vy+(+TKp7iVDcumr+x!ix=E*IQk@v`S3>TrIxzFiU1?!|3DI7++f`+4G`= zTi&#MiBF|&p3Y*Q7`5?MB*b~1&PI17y=N=5w~H?shF1?$XxZb%<+ zqJM#;kh?%b#pE^(y}HgUjJmAAFb_#4M8<@N>5X;cWa<~ApPvY#qZu`^frF}JFhPks{N~t1l;tlk8t*d>`YjOsK2B-{slpdF1uM>upFy2RtLTTV?k+ zic_@52iS9;ZJp9Uo5@qBEG{wRap7~^$aJJBlqFQ9Q`7uvz-^V0zMYROHQif zm!%8D*(_fE#_N!@7`AV|pM@)u*=0QpEq!PsXTA5wPA!Wd!=6rLXljrIz8~izXk9Nz z+tEFpCdrl zHs+5CwO}w^x`3IqB|`wOUW&bJxSHqBTojE7WZ`arIHpXRG){h zT$vqcpRJU2b5D0U+hD3NklmAgm3gM>@sR^4a>AP{Ch&7MbP-!y;lBq8VYSa&I}!SA-J# zliqUi^ZE35g~)}P>VU3FE~Oa+jd5q*Ogt*`1v8BCy{3FK*L@DQk(k-YLkG1R*n8p& z&M-R$yc5BxlkgZ5IPk!)!L&tBu?$)duC!KtWlljDbuUb2w-McU{k6gFyy{FrZ1+7`&Df1IUv>IGx(W?=IT+Da(j8*c7 zW;3SW_1>ehA|1QrF^!Xr4cUd3wY|MUh)^B5FuBi=m=dFLQ$!YbjTz$#Jtlq}yAj+N z8-t~or|F)zVhPlgD7t(3vn<=04@*S?0)IPICuW+TspqST*=f&*I#}ti6C^NnF}h$DT;Sr{olW z)#OuA7`I$cOhz6^`0?pcen|+VGF8|D>hCnW)3oTlICML5MCOGC<5wf? zd?Uzh&#rrYyI=zRM;SdwR72i)?LR5*UrS70DxxiZilQd}A$@)qISVF1(a-y|J&m|3 z-y%{T#9QvJCnV?3Nf~>q8jW9fE6k1=&l}H>eAv|8K`^YL7>IrC1eA@^v0!p4w{s)!msP(u{}bqwV=U;^ z3(Un`g$+{?oGuCbEH|>u{rRNxkdbBrMIKHSh6kXMa8%QlRO+%~KIdwo&CjUzt|)fG z$-4(_E#z)pFb&%kwj;e8iTqugDnCS$Z4t?CQDi&Zn{Gf4oROQNs*v{2hbl}?A1g-m zQ=4n^Mo8hA!TwCe(PYJt8EUn1rT6{iN~i>Ge+n>#1fk?V+yy#YY)f$}W#$%SsnIby zrOtq3pgUd3GX=`@5YBt!C6JO<69gcOn_zheZQ`9nNWvbz%Bs+B>$D@M4VZNXe}vq> zg-;a&sJ(j6PTvr&)M{qMlZ6y*@rRi~it~bVXrmWzkVkce+x&n(plK0#K5rWaDZ?4$ z59yRXT_pe6;Tq*@&Oi4@{!|P#;}&L=?=LKfzE_3-2Xr#z*Z~$E^upT{C6m7Zf$2j%`VXCY+gHe*ukJn z$HM|9!MOjC804P84q|U!9u+7Ym-Hi~Ey0cs<9!|~>F-v|O081_mDYaFy#ux7VGU25 zNRM9TMz-ABI=P3H%2`ElA5=1WxVNg-qrM+J%nGHxchYyZ%^@M(HmE!PZ(B6lRn}FD zXcki6wpMk}3%__bcZOixig|bSkTDH1)@oAn7ln5*$_zg$gAUqMqcJWYM;N( zc);u*I8L`#|M%0zXRMmc&iP;IKL?X-g(?1BhK9s9-7RYkf~5Rti%2-%Z<-N?7%W6+ zDl*74>1wq&{7Bk>mI&o<8!DiE5YwhNlkcz3|LTB?HV6CTLL-CgLv_KLDTE}nAv|ld z6Nfprr*1{iV3yf<=L=b^}uS@>G!i#{u@#cDHv6xk>Zgqof{);oOp zMEjhVzz>h$eksITKB%#}JC+2uUG-;ssCHQTy{q~xpvm7_dHmW=312kp>=)183lr`==ia*P3M>>9ABsdq}t z6AT63uHR@|5;_bQ&Srq;rJ#7^rkd~3??~HbhwThtLD?B>Dv;QKp!9feRE`z3u zxXL_D{EuI}Cn1X3LzkFzHB21pFOIJ*N&kIJxT0U(AmkHMOE_)P*hyf)zt^(WkKdCM zww&Y`5e6b={g!UAE^}Ct*_~L`QcV133Ryc4sxmDFcEh51GBFlp6L3|bQk>A>vH(R( zr?Ur8C5+hq_#3UKd~PriN&^aPE-SChSiOd=w7|CJn>YnM z%BRM;vw+?0bw}!kmzMaUo1*8hAd6n`Tq-jN>6Dq(R_`A!I0X`!Fh*cOFkqc_67*%GL}BL49UiMw&sb_TT2Re2i>)FA_?$>7 z=xjr>oEU>1=<$dQ0Lxja1?dd>VhXXUqnIcIVz`7=n%d=N=?hn+( zb^Cxp9Wajf{&{oEB|~&q9R+xx;Caq{*i|UjzYE(naFRXV70Q>KEw~HN0q825Qe52# zJ$k#5lPnooMPZc7{}LI@Ot|j>^u5N2p0M`DvI4q{g3V+`3x3u8WxGbUqaVH!{Gx(s zEd4W1?l}#cPTHg%(QE9rApXM04*96iFw$FgY)!IVgUfS1X9i4oQa3sDx8}ETG_`uS z&zCwix;lnun`f_uNU~)%L7x&%{8*@o6Nfn31~>QtD7}d)I1IJ!Bz(jX#Toy>&equ} zknHcwxyg|1)HhtMrxI~%Jm49>Vr*Aw3W+_qtU}>2Dx5D3DTn@WmomSWlth;YYRA9` zr1z$fJbDW#zFYdRE@6U66<+Y)5 z$;9Z3t~!@c0Xtf-Dx@7ye86l6R`TBFrML)7vh`(SOexM9d^22#k%E9ng8MfQ!yE=G+u zL94nFj^g$lwbAs1BH9eOiia{SiHP6z@#A9-d6&?b=?9iBMkbW1;d3v#0?bmV<{Tt& zlp~#i|0_ragfY)U*9Rkd{!RO-e~*;@ZR?vbZfE9=7Nj2=V+zS~hO$XQ?z?lK^P7lJ zy5ZYN%EuaX2n84y&m9d9$-U@pN|WVY*XeihfksS$F`)sqNxLA!>~`r4 z7cCo(rwX2-?u=vEFMo|ZeDGMlB9bRs`*t#`F;Bk`$-;d2-{hg#xUPLxayS*shM%am z7|*a=FBE!c7X6F;l_c(d(2iCC#BQ;;mO{R*^~L+U|0@RXGkAl;9TG(EmI=_cAqAQnU*Gp__)|w#RM$Xu6gY#A4z9{woy1@ z&qQ>K*=;({iCf3unvdAkH`-1bVRIteSq!Qzto_nqnk8hvTpl-qB%<^}(oLVfl_ob9 z-1|5?&fGIPRz7JNoa-dO*$r%}=)Ie%gzgsNXZps`U&L)P*OjsNKc1~W>-jOdJR;1U ziLXx4am>Iofv(-Dr$S4&g9NK$o%>Z+LDGCl?K`jlUzsO++6zdUyuCqoLhCUl)u z1Yb=*?DPM5n0)%HoVH4>IPw>Fnp{TI6!}?ZbYJIg`C47xX0@u=NXWCH8;oj@j<+?A zbWR{s@8J@r!c=*`^OKxHrK=8YD!<{pFmLm*rzaHq%_oEL5nH;a?Oqdln0CL;%d+b~ z#?^(l@$agXEa#6TH7d_8qww&ZHC8UR5bUr#m%%MAGZ@*BZ+am^3h#kGoP_TS zano(z#-)dYvE~_oIKmT*U66pZsC;PU&~~tfwi)G zX4JI1rtWax9m*C>6VffHZ8cTSVD@>P|#Wc=0dw8ClV$R9ZrHz7~Cwv0oJz$B{fUv|JO z8Wv!ybEeGw@{bSUG`n^+geLaaS7t8$Hp8zq?79_(N1WObO*_Q*`}YF2Ps;ygCqZuC z(MY1gJ%LzkH&A?oo3;-FL3HMkfzKsCd0r)N4zfRAIxI@VdQ=ASEeo){6q*v+=VO5I zKJ*E_g73qp9C3j^_Y*ERfkZB{%d-UdL-40B>Vjn9?ncTYqD z*^E%Tg%9E@RQko?Lq)DPlb5n-qc!*}Xix<;-e!G3znUI*eulUMv<5ZTUs$~4JU0x) z&$OhY=7!^@{)PZ(BdjzI>7j%6{wxjgg@Li%r5&33z$aq%%-r5d)Mw zv=M~H5&|zo#|{2`MdT-wD|GY**MipwfRU_Zkq&dF;%=pGQZXmn9>7;nrYq5Pi<1rU z({!t&Wpu~dI6SE~ibC>Mn7FR)zGo1fgfXcwHS~wZPK&n4xwBg)=Ei(Hdf1YN zcm!c`0%92w9x?-etl98BAgF-jlLAoZi6A`<*1$t%|IWiCh~2qT9Yu-0T?FBi0a#H< z;lyhxxXm(TB!DV!SNk_Zyeuz!lk?Ur5yQ9tB+%aevl>8;8F)dZTJlWghDb`UkEh*- z8O)kFf8N^Z=I+6D$F8oGh4w4bC(K~TOFs4;gm?qiXO{w8N@XriRZg!Z@FR7+HJ)Q= z_BL*a?rM5-_{=UkG7osrxxI#lcoI>zw_0+`n19f`X=z18Zh$%I=I=W0 zpuyGHRY&>vlKM?h^f2cn3FvXq$-hK)1LkDx1UUFqW_orF`g65<7(|t30yL|rl?v>P z#L?RV|L||Vwi|-;zi#qzS7uu^>It#UH4Q9Er}4;vb$3no3tEIz+qfMt30D-d>K?!R zY}CohMd&05tKIUr?c@^iwR5F)OS$?zD3>EJp90ROt?z|+un`^bJ^QsRrXTP2PQI@Y z*NI!yWG26o^b>ecP{m|VdR>p~?`&VH5uHCLP8=_-bo`(>GSf(&dEgC8s%s>(`T2LAM|u5`sTQVGTnf` zTa@NxE0S|0zH%t%sw5sng6AqsAx}W~N0ct{&DUDwv|d6;2GBX1g)@bA!0Xw^7eEyB z;KjZ?wVs_DeAIie$g#Jk%}3?VCo$ioyI3#4GW<~ic>wZ@jKEF`=3XAz!p81obV#H+ z=vU5ET>ZG76`-8W6{kMYfSj8_bt;M;1kg{sUE=Q3On$k1CpihO6_8`z!69_&aT?%` zeQ9KCvjdhS=lWrwmupKaY!IlWU{Af0kFTG;<^jK$GG(o=!Q)mOH-lzpQ>bN;rGm$i7VU z^&3NJNa2cY*Cgjk_nEy-5#G1vUySwuo5hkcU89AVKqhY3iXMIoCT5+p{{7RQm{2Rd z$QH~X`^N&l#|hd*-;ef|U+PQmfVU)OxEBmBv@|phiZl19w}h^vfbsk2`Y0s3PS14y z-TJ#;F|UZW{$Ro!r30alEw_W&+~$0JcrJxmS=Z)!Kw>1nFmH{KCqR>Dr7uF%tj@4S zFdpvxKBB(KC&3JC`)|Cp12dPZkYk{X!V}PP2E5^Pi4bB4&X!_x!-is46$5S~n6o?H zIgwd<7+wRk5m>+7(^A2lzd3$}0y=2}L9E}>|03i5uLWgxt}Fo7j!S{_Qy@EIgp!l_ zwVW82uh>KD@Jw$Q|6I|u8op)^@~m`o9dk>SEjp#Opcr&k98ySRlEj^rL7jl7gSI1u z_-A117gQpwmLd^Sb-NYD9ccTy9wVQQ6VZMMWzooc#Q}$#v}@MD*oCI7EUO70*ScO`Y5a`lm#A zYvi%yFr4LLO;wc*V$|WG^u^EbazIS0GXVarQ2MA++$-c*zceu3(d$(f$|AZoj_X=0V$# zNob>_V1{=RjnZ>fb-mu}j1kcnn|a02^VU@J4KSU>14)w{-FYcRxrw~4k4rG)?W76= ztSPEbmjoIP<_i$i9bT|1P@h|cBy<6l(1L&eTqf+bg$t0{rUy7q`1(FWP-_}dPA87N z^H+Tdte)6jUp=ot6C&h0yvQ>CjZ`caC!L8)W(eaMdVIPXU(O6wV7KMDWQ}>tKiRn zn7F=#taR3Q1JuEbDM78YWId-AIu5k*y9&~l9j`y={X9BY+A|sF_-TQx&i(fU3youW zEW^u;2cQ95TX-Qr=$7qvT|UCI1`#AE4o~BDts^v@tY@WW^NZZjSUln;pPl-fBIS%t zy)(r8uq$uop?d3s&cOlUSw+T#r(f>MQYha^kNBMXUp+HUofQ1;F0ciW0JkASu^vFo z4%9`l#0}hM!Go`>|FAo}Pc&D&JwU6j6nPN_ z-0eE?8PXOjqA-b&NzQRt^*Pt;i3E$Qe z?U8z98S}Vt)v&AjR3$Cr0T`;1S;2k{(a~_RQ2Y@(M-$6{bGhiVjFV(szJ8kb6$mF9 z-X;lBw{}v-^MoR2%!xS=ZIZV(0?5Eaz>*FBX$t<>0ZML`0L`K4hNE2Us1+Jv`F;c>_~j=Wh49L4g*_Gr9U&hbn;iutJMl)(^t@lD#yjyfMQ&t4 zDV8y{v`;Lk{OXeKmufE93MfWs*0fgr_MstS@A#+qfe=^;v+^U>^ONWMb1tQnz79!- z2pQANH*cN4es+y#R$LDmOmoM2uiNvxi$q>)yhnq2V)?@Lx+tc%l@To@e{Zqoe!ZOm zv>l)JEQL1TxD#OJ1f)9wOcKDrxhoi4z-7<_82kkIL*>!GzZxS|eHSV28M413{st+A z>KR*8$Wv$F3;5!n;E=*?{4b5NTnf;$i-A-1kf&a&dS3>Yb$~|MR>jRVKL0F{RvU5{ zEQ1@Rt$&4|dH@5j*BBRJiE{Ac)uPdhu^syK%!h8}nH2SkP_|t8UeaGMEeKjm&g6Qc zda~g20Z&tS2vQHQj(Pg)#;Af-r$lcet&j3tpE=ieeZ@O4+eLStZa!=FtojtR) zbxo%D{0V8|x~l4}Qqs0GW%|&Y#IBXK&9#JOPr!l{%1_j#y*O|M+v1k8rHhUimXK+z z$c|d7?nU6GqoaM0iSzm0LbOEnoa!++Oany$JL@y9V-+9>A4cy+II^2lt$d z`_UJvgexF-x%z2tFN1KU2hJaWAStkQ7kfUB7R^ZzQvIY*?yeDgkr>6Za!7o{NIgE?JtoW zWJ7x!fF6zk>O6Xz$E)izEi-CE!u^G;(ufCV{ny6#pEbr^^#6X%AG-c_*6)2^-JxbF zSN5``oyrzeCIh7yq1A3ZdPio!?e?%t&9&&Zc^j%bIp-d23g61vn>IpBwi@E&td%I! zIhw^{)Fg{H!yqfta;4Hpe2!f)U*(+m=2`B@!@B z{DI6S>xzFYoTzf`=By2Im}SVX1!_rBv=ieZdY)G=Gw>HU6fQ(8HJdbem| zVDybVO~I18Mc?D^r)^ac3x_F9#uLEqA#VnqWk2(&_8DUbaNgtq!+i(&m+=gtKbrTy z!^&lu+HRD;CyTRdv;7+T+qY%#;QNNpLy#j1-?{O!;X5b-Bp9r}iUM^#DltMIm*3vS z#{8(OakEkS3XH7JHk0~5y@%^XFW?g0Dsa-R40Fo_?M(=3E*NoHt*zL<2jY(?&itJnN_zVl0miH=OOhyBmAt&%%WbT77>v7(`D_`R2055RhkC<*$lg09vZqhfNLO_)e)My> zUIgl1yqd5A3n_XOcMD||gg+c?Htghw4)(9?_+icZhBB34+||iZqJQucJ6EZ(zx@c} zEf^Bm`;?*VJc%*~EeQh!VrnV3hs)3S_djwRja$V+e|x2x%RQUq{Kn@U*>ZDd`aNXw z?sTTQcEsI71uYiscSbA_|Iu6H=#9Vf&N{fl+l;i*Ap#{uOC6^48(*uMSA4)#p)TX| zG*(F7OUtrr;UH-u^w(xtsK_0xVwV!MV-P`|2S&gQjo3;W=wj85bVQ za;4DkI=^b|`Mkem7b?SoOp$@supZpW6i(#Tg+ZPukJ^|*ObF*O>uT>oUCFb9rrMv~ zAhoc&hqWQ&2c^>^&;--q??DR92iR1CVVUT;P;kTwRl8hND;6YjxBscL(>f~rjx&TpXQlclX>mjHkcl+{GbJs8WAn56A=^vlu zdf@^5O^?(hm6cFqEl<+_IpV?l_vURqVHwWQJrpizMd@hu^p9D54rE=~$7NR`T(hYZ ze$d7gWgCo)YOOLwR9&VH=?EemeN^AS1)cs6{wdAE7W(V`+@|U9kxtVk8KD<47%h4? zM5YtBLbgaT^s0|GGi_wp55VtCbvipN^$pl1f4e0UHr7(#(8nzi>-b7_ zIRWysVk~&3D28vmGk4ql(K}2(c+YQ0;o5^D)!Grr-4{-U8eXzGq%47!a$3Fu{!d@L zO`{KR;ZL<;zW+f~-$2yf7ReW4@=Qju$NPQMks7=#hYF#lHOPMgv@V&s7d`=qv55DN z>q}Kot}#Dncz0l3kKOGgx+O4%4-o&FeIa8=y!0w;qmyzR$V|j$AIwfNPz`ocy7GJCJ<#jC~ zVVhh`U0}|b$dBl`F`tMr<5bn@d34rOL!c79cDy)oSH-H6-_gzkj*>Z$DyjX7*&L2- z)kkBvl94-{m@XFcr{)^|b#yh|?vQxj~a~agzm@06^MW2Jrogz)SXilRb)$Li9gIe zw^(`=e>1bw#unM*Ste>}h2rCnC*VW^{mLbsCwKj)NAbyHC=UbD{pwmbB$y~}ILbKb zVd>!c{Y-h^zpK8GI4TT|`9gbuU4Qzf+KBld@HSX5r|-Mv6ws8TA3P20-uAMX7si9l zLR2Zh23QUv@EUKIv1xD5_C5=0TvRP0Q#xxQ>mm-b_B$VE3z(j?Rt`O~K5bfiA^xNX zPB95T1aAasZZ*mZ&+RKjYM1v)gY14IP?i0J0b5mSnAop}O zYCinFk{bo7=Cuui4Qn1dThsUmF5a+Y8B3K??JCwe9iwY-hV}rxy6Q-^O#I**$fH}_ zK4`uPlX|M>)JK#iwHt!qhTJ~5l62sHac(FEB6@bLVMA%{!WA{^Po~W zD7nRCiRB}m$_>HBKZ)ljv95;Y`cimF!`JFT0Mm8J==sOzXDqcHoC!x$zfc2pin6BIbzS}( zFYATRBaQZIq>tMzs?iKPt!L|Bdi)2@uO3F_X-N@=*7Ih*ai5dsx5nZ`LR-n#Z4lt< z_kvpxq0-bj!!%ez*M4T-Np|0!gV8mJJ>MLMQK)2wE%}LnuM|*yG}ict9mbt^qI|6T zlEH@@;ayMn2h&{|J0)?@0KG2yCP9+=h+>=VA})=HbfGAM4$dVqlc(95@XYMHHmXlx z!s|-YP(4KsU9w5^kUp!=O$+B&l;pBXveij;`DiBNaz`pLE zrJsoyY&kw&dqR8P+JtVZACX9x_i2w7wdZo!+I@8P@)Sc-U#Z!agI+r}&F?TjK4A-= z0mP_UG^NVON#u#ET28iTa z{#R47Rub)?8&Y!kWg*U;ue`p?&Dv}AaUn5mQX;crKJLxa!v^B0ZYyG7p$(3>7RLR@ za@diu%b_|e0d6T}jC8$Bre&dKnt6fagwtYU*h=Kpq!zd7SD6Plyje!1&%(!sNC$pu z;4r+OP)?Z5lL{PwxGb7CQz z+yxPc(S^%bj~#WuqIHQTYVcnx!e`&i^av ztmB&c{y)C4(L-S%CDH>FkdlTCkZuf0N{|LAkQ5XFTuX);bphhLir3xbJC5|xt@!#D!ucI665QeteQ-_x=|YqM_GT! z5+w7~pQ6x}GqIVr=aGVCD2a#LlC043a*?;!M&$IKH?a2Z(Yz{sI+M=UJ;DPVvpYeU zsIBr?qc>ZkGO#!{Eia% ztAWnhdVmLU_X}8|w=$c|HwR`D*B^y!$l-1O9C-a#b+)Cv@};C(?eJM4wPk1a_bI{YZEix?T){V<4@h~1MSSED(!qWm6#Zv(OYx* zL3gw|IMh3H4(<7eQ?W^4Xg+YbastXX{e-s(ct3VUbH;miQEpTHA8ArUD$1=}QyIzA-kgX2L-I@Y^iTf!Dt zNmyvH_oCOtFvj)WF9L-ZHO_zdw%RuG2DpP_g_q54V)Sen?N(g?Jv1#$X^fjg0)rl4 z)`J*^u*sQVhbG5AGJlP0@ywZ#7E2QcrI40|gWJ-;#a}3^U^ZLrKL>v2w5vzmO(8mMrquw-Bo+rmEsP3=x!mB)AAVAoSymEtJOxVo+70$*>`r_JlG89d$2JoLU?8ii z|1Levm3pzkkfpTzQ}l0e2042^ zw&rhmqa@c`FYv|x-j=fsxMpx1HtiJEtQIZAQY3r(VitElVrYP^ z&WL%PU7aq2LKW=w!HO#2rsa7D#E%zR&j_Aodw;@4);0Yi+soI@l>(&@nL*(y7D5FS z>|sxSZ*!>4+cq`nwUH@>0}?hT)b_gXsj0q1i)AHKdsO)*gO&FOk z^{dnE%9lDm`)GQ?9`(JZOh9(XmDa$yd}ES}r47jf3Z4~)OoeXh%IRBg@V|;?&JKUQ zbfrl<^5D_2D)_F7pZnLtA}mozx2a|a*9Psallg*uTQ@iI0RIKH(4gw2C$aoE9puIL zrq5GrNt#Iv%mNa%^1Qaly+k5wug?=e7Z=v&?XFk+*0m=p5q?gY4m1U_6&4bM2aRG0 zz@hcD1%{CUVhcN80w~Q`lL63zS~@V{w#O?aNq8_YPD*c+%GN|jfs>EUbhVM;Wl^jD zYfmx1NZ5NUjcKpW8%*hTq$?}A5OoLrtm7tuVWw(yZCLW@Z2n6tZ&RTE>Xj~VZW_0h z@74!`0ePTi=c?BA*0==?I}m_q$wln>n_iYD*AmSMfl`X!5e)5ihNIio7823-s9GG- zoGQx~c=nqdzpKF(+BPb0g9UKa>@#8AO&n3&=5M}d3$&QQN~w>9z^V%6Y>rlaKcYSABc(CK}&Lak6nD?nqG2B@w74Vr zIG=tR$LKDoivd~g^^8cGGjKJfg-Z!k$O>u|F-M8a7f;f||554#{nrZ6KBBB4UHkS5 z8IPK|Ucb#OqwnTNR?Y#LdJLV+^;KZcsQ!0_R>+Q9z7sUaWeW3 z9HX1i_Fa^(+_7J4%)(wh^=*I61r1gWvX|OUb8%2Ewd@<_Yw*>8+Nb-~vAChBl@p#&W*VBFvkiH#^%?pw`Z|f z#LF|bJPU@gr|X+P7RQ(*(=?iapGoaJ{mb#gxeVLPnQ{6r6@Oi~2B64yKZ{EtlK(m& z=98c;pAQ}oi>fa9oo(VRpdufJ(vvKFzLrJR!T!zppZIF4o~z_%Hgy;vMKJ{a2R#?HWyS#E3{q>d&Pz=j34a^M>fJMEOJCHXK}dpQ!-{uIOe?XKMScH}vjovxzapkG?q#vGgu%fpkeP z$+a^5Xfgq)jF%q5#WFx|+QhI1mPcWP8T2LZ>}YU_K=3a14Z0!=29gdMrvY{8+Kj^a zY=AUA8MM=nLka*T|Iuv73{cs`mqW0qIsIpgo^< zR?9m~`V63(0~fMI<>qS-BmT8h*+96Ts3ka=e0WcR!tA+9@f@(YeE_>9<7?T64~VpV z#Dc_Te*KrW+!$!=GxR4c`T>a)4Nl^kkf)yZ9a6R_=?V*KYd?d^5n;r%Bw`Ff^H&z8 z6f7S==vXN~_ctWNP_m8i^s$tfmKL>IXtWB&S~-cN2y_Fwg$36rIXcyOUS>?x@srB| z9H{dJ3^((p9}ld-uGyk6dFC)^M5JyXEP?J3pXcW^rF$e@zidkvEf}s=mE<&J`?-rr z^66eInXvr%#34N<5))%Fc=lm8ONLHMeQnmZmf&Yw!(qlNXoelJ5+#sR`CK@tn0)Larn^U__(3cf|< zjYrWe#2X6+u}>Zlo5ko>gYqD=iq8x40GGmB*v=CLkR1>8+Xf9tSB>Xe64vtO9LngOFh|B z21pRXuj_8n*sLw`BsK$GqJV7Vmo?XvQE0rfdU3G$vDV*+z&}}nS_KE!@Bf;){wes@ zTF@PSb_oH}o8+s^_sHU~PlwG2)1X+bqc=C&{j(aseOfj@$KKo*NGtpK^8L_0OVpZ! z`(!^;bD7A}T@@nVJLHcD{9#SkQrQ*y(-7Pmx=u9v2EFD-Rt`)DJET~GgeDF3quZBn>Wr-j{3)<2Fm@_AQ& z?bE9gS*0lop;xn zc_Y?pp^Nz!5&JOqWp|eRCUtN@*^DbZw0@GIHvVTbxc`EYGfjnIxvzuIhEX!iJsG@> z3gKn}B9;L#p1}KaNz<&M`RYl2eDMVUkJIU({X*6NoO@o4i)3P|F!dbX#3SJ=YyE?;@vd)TWA)!rtN8%gZ7v^sJ+Y4w+gy4tRGO_VSx z`(gmJn9LG{2dqBF30+y+Lzp8KDUj^ZtD{#8T}#=!VQEv8&SMqKh>e^fi+HHyq;V zG^4RmxdBu&k`J4~PAoIIQ;VQFAI&Q##oi zh8;lXU$K)BMkqrgOeaoB zDwkqyz;x!36u_R#dTA3q;joFeZAh};u4{27p%GX3`*E}P zV-OXqrT|l>0roWD_U>xXjCDl2(5+K7IqN8yAO56n%J|nM6fJ-Tg@>#hKn@b<1E5aK zZ6;I;mGG)>5i4kr*dNf2_%Mw371m~PBJ9cQ4539{hq_YUCZNsm_=lA-$KBgcMO;X2 zrdsotlbQ>ZLq9z$usoln6x#boQK2hj!V$e@jy(|mQu?9I5#H+^d@r1N_a1v#(pXT! zHfh%q9ru{2=rw7EHNlM!+JbkYh%sGfN1t^z60f4gNtOoDwA19Q8k>9gxW$up2cmA#t}2M=eBk+S30zPw3CA%_M&A71Wj3mZKf!42lfBy zFR$))vE`2UjFY6`9So*{t294^0fj&86KW34{yzX4GsrvhkP+oRY`ks4FepS8ZoyR& zfMd3ph9i>>kE`u~=26#mI#j$VGsMGZ?i9f3*e@_ zZtZtzvK^|GgMUYGrh~a}#POPy;pXg%*uh|UtHu|u{QnGL{WcM%FY zm*5Ne+G&?xF2{xBuOI;bxqB2x?-|;%sg`-!{;4i42RF|fEPYr`qc>uJz}z-6T1f9^ zN0RxIHxjk{CSBr7jBrJv{#vJyMX40YrkGTO6IC>ASpoZ|@4R{Nw{OcA+AK<+5JzS) z>1{77Ad5^ddqFRIKrj11C+tWCSyLG1GZ$q?8@&bjJu)HqD=HWXWXzoOzfKiqQD(L7 z8hyJV^SVsi&V2^`XPhm71j0DF-B)<=zAQ&s^!{t+dHZru)Xn|qIB@@w6o#izU+>x> z+%#teR0KX~i-X3z#$hs*+@h&y1YGHXjb>ziwno$7u^PnmQ>a)A@SF_jgtfVu#g|03 zlv{2q;a_J_w3h3Tl|LaX*B~ng9_|#7VIfarNGK^lm1EcGwie`@PqOLcy~TTHjXEi` z*T$AaJMBUo6R4ftC>|ycugoKe$r$*f+qQWm&a@$H)88&6Xs3%Jv4pjEP9VOyhk`AA zd$9J~&tpivc(bMLK_)k|;hLQ|759f9L%?gY~F57DT;IeXXjM%Z? znHYI5cv5veCvPx$Vau+W`nU*ND*>8gWj9tbmk{K3yOo10-rDpz{Ijl#?2rmu=NSQ+ z1D$&r^tLH0e)QvwyOyoUdc>pwS*}e;5vUVe%$4>nW{(rq{wqTF#D#{I+~oohO}l7{N4%=6~}naT}fL8)z5p+AD;+CGUZ1u;Ve9y%;MUo zLHc_XoDdrlPI7z2Qn=@Z-(;0!nvoqNs@6m15Oylf^z6iEOy_U_(?p0EPk1MW<@P%Z>{ z>`;FO4JYpk^XyseP%*!hW&zYnPRFcl zMU(l9YSHZ@!=PnLCf}Q)+9S=}hOeXQZE5y&+)E*3Qj8bzK{FlF)$zif-W|hpZWbx7 zuJ<|Bf7ZPuYdb9jI{OH>oVc;IWrEO~V>e1SJ(%OA8%f}osTPf)%P1$33%Qp&(>Z%~ zZFBeECV)j3_=mC#dc3X%XL&WrzDr@g@xErzMP49^$kV{<v6lK?Wa z=7%Azo`Fc+TBmQP+}4%Zs)o}$)Wdllj)(NihPxWx+jLy}s+YBAs}^)f9e-?Gdro5z zf-*w`y=n@-V-9PT_Bu826C9 zZbHW3>nRs%YkbWU9+jx2_-)1KdiKerTx+++&BW!C_e)YhD2qvS`CM%H`&9tn%oplV zfm^O%dsb1~QyD~HV+SnoVr^Ac)*54Xrj>UN1Mc}HZ{Z{r29*BSb}>d5FwG_E|n3c^2VG;j1t)EKLdMCf#mX) zItO#yA+kbUmx41o$1%j=D&u2&`dKA@$f7C9IIw>&lC9#&WiiEDK3WdSyLy9%!eN^Y z-iO8?1)k3}=KN{6h{V+jDco#~TH5KsS@K0o-oMpce#rAIM0e$|BBn4jrhhjUzumKT zaZqnvEGib>#NF)=XntGY#@PmqsM6J9o8T!Dm{*C4QtE|?y)?H=BPxyJl7Q`xB-=TzKY# zdQW47j$o^SVUAzp0>G7dw-yMne;P6`@6SAvEseU$*Neeu@vmmvrou4RqPLPk`OG-g z2Js{EY@}b z<{fHH3V*p)mf=LB0m9p}$y~{kl{RDvSy-m#bSH((5LDT}RQ}smPvRg2-f?A|z3BZ` z8hDAiqfr7fIR7Q{tJ?EC{-;IHH*ubI(tjjYTvvYN_CHQuWz8V*wYzir42q@t`AkKd zY)@CYn8rrZiSpj)bi^NShH+d-iBEYN_;eesz;x>9jvGQFvx{oE1^}}J1%`48^ve#Y z*Mi7$+Z9Wd6^q&|ALnX*EnA7#m$8cckY=Z~o$65Ef8-e4GPmZVi#JlO&dnbVDn-@^ z`ObQUP88PilpN0O>|Yt+_}Bp%qDB>ez#}`ez=xF^Hz?ml7y!CT3M;|J0=Q7VBKJPG zO+-xY^_1VCsLEi5kaXq*Fo=({n;y1oSk2u=(R8O=si(k)!jMEAEA_UU6e(+^Iw%`t@97h8&|&PRM9RJi(-6y_O8Bx+%KI32Ta{tWs(QOYS=ijHsi?L+uehKhl_S9YYme2a_; zZDLHiu%rwriTjN}m&_^;haWE2N? zaG)7@Y7pmJ-X2D2jApRj%xQ&}dH&fG+w<%#ye>Tr5Zau(`{QWR^urjhOwaRujS-%y zZtf-NYRZ0zZ~@imsVUCQWkzAF+}F`lx?M+DYQ^n3U}C9r7VK|EXnYw-#fVtp1CSo< z){0%QTr0qsCPZq+x>O^Sjz;p-XS+mgeCmsu(w-YHK%}%vnx9%mH-BM7Eqk{LU5U7w z>8K>m@XB>m7z&+4sx?L8c@ASZKPn4j{jsk3xj?)#T12uU^FrlnB;F0$L~nY4SeQGK zMO2LhQ+kx6cylr=$-WG&x^CKyUcj%|DO>FRK$q-5MWF00bjVUCrH3;I^6UWrs6{HI>wM`Y^}JtfyWyUs(PdM{ zQ{R_c&rQ#B8gtW+w^x{n>3)b{5k|!|4%T<!kX8~tB$QPwbuyRSTj zi=Bf8S6$5494v8S4|60c`c3PfrV~OoFW3sDNrT}R9hDv}84ACAh*^Qx`6fMFHbT{O zh==CqO#2+NFS(;cD2>?SmELIbQZUi!4BwZTkVDc;t_6sX-JJHiNS_D^F5W5H>ObzP z5&wB|*wTZuNS)@rn>MsqVD21Aom%DqSujy%RubMxrtOqwO8Hx|Tp;AiDh%mfiUas0 z0B_;;^Ce{!|^csZDno@mCb;t z)Gp_PPE&j66;J0AZ_h8ZhJ`-X31vCHy}IM|o~80;)V~N1Y7GfL{uj}ff?#hO3_H!w zmqOE_6WrSsc*a7@IIqCUjSJFhmZPpjS-*X6DNu-RyU3?a$G^Ap>&(}fIE8MykhT&eRD5(|f3 zEIIm5GXVEiK=AWp;^DB19lL+^uhBcBF3}zkK;d6NWffH2+4HL&S;KaJ5r^<^%sll& z@cwxoXo`gQdFr|GPjW2+eOPwv(1A6!?So7)pi5Bk&Pvs>YV>;8H+b-q6Je*XFYN5d z=cgc@L43YlCS`XFNPz3rOfMUVTDrK~^lH10!Ap*RiSMKd*Xf9gQN+JWmqJ$;Yat?M z7rbS!hbzBM3Do|v#{nn8X!G^aj@`Jptef7(^fPS$bn(XPN5JgW9S~o=l$~Lxl8+8N zA01nLvj&LFwnf|kKllMBaJT?TQ1x_9uSTbq={}!pNwh)+AI|2C9y*;Cm#*x1sa%h% zCEY(&kI|{lV!!@|GsO1l$V`|Zxbb=ZwqpM38X~KzK zyG0*$YvDUzIPqU&qO02F8ZRJq7}V3xR8XWPw%=cT&0%K>WkBI-w(Jg1Mqip+9^rV7 zC4mBl@0!`Sq<`&R9}X&LYg4(XL(ct6_L0iD z5oT@t?uTPpdk`b0cDbT!KgC8~`OwTG5S8*C_arC(dF_3B^{BP2E$;oMzR4uCZwC`a z&Z(ev=;7?jeqtHl=?*G$rpedQd)0+lLtOcG**`QH9HRq7hF<}xHCOrNF8RaU$Xci0 z=$4i*gqWCQnkwv{f0MYNra2CIzF)sktLVSmXSSeXkbX`gn4w)YKaIfHEkb;AG^BQQ z^ATCZ%F=*1qyk+d@%Kxr; zh10_0hs36w`6K%IEol$LPsHE-*Vcs6)=Tf_VbTN?W4@s^R1Bx*0n)Y&!T%D+XzCb> zWCg#s^8s3jN^J_FQs5RBxsu25O1hr(mK*r5GK&;B)40L)E>iwq{~Cs3jD#=T5em_XAG`Y7=pn^k%E_AuYc3LGE7r(liT()u@-- zH*y)bTpp~w1pGB*uatK0*s{`xG|ywhEy6^Z9DX+x9aMw+#lZ>D5z9})=nK!>+s=+k zKzvFawj}dc$7T2Fm1vI%uz&5x~hdHz0c@b?v(QWu`M zjrTCYkB+Tv*@ZP<{;V}zt=VWH1>6yN#Zrt5(a%WTw--^@9*mF{L1P!h)5!566t`Au z!TfUcbuW%LSN>+nCz8i;7-R?c%~N$l|Gsm|OffadFm4pdjZ6yR8 z?DZt}%#vS!zy`b$(rp6>2@b)XrzD zR~U)UL+M%^uO2#{;Y9HlXac)cWe6SN!ICwpi?W*e>e|TnH8rEPJ!X*+&j?+YF}r$73!8THfB~Jv!Qfj1)Qs=JjCniSLL_H;Auq5|$Y+P2zTE z^mg^pgBtiX5i4DPT-mw4CLZ^*n8W(S{u)0s1VwZNiaKb8-67MvJEu6s33nOkIMdP= zB)sgK*~;Y$%fZQy8=<3|qgTR8QW$DA&d|_)=`dtBZ_}a|dd%)|boTCOahd-%W7Et}w$Y5MqJF%|uj$~3 zq1rnkKSOmpP`#nK54{k8b;j|Br%7TSzJ2*}6F_sxSu=$-4Ulp2uQ`SVCNh(3i}V&B z9B#gI|LDJJzQz-sB)E3Ug(thX@u?e3%BrcJ(dMPAq@{a#_ppp&|Hfi)i1_8>^ZSg1 zudma8)Iams3pGwRzNxbqau~IaKoj!@{Tf<5qSyU1hOU3YJFJwdhU(<=GftMycXzaY zVzH*gl?~}{$>yYWN?&3RG(VovwJzzzK*$k;*Nh=vs0YSW1#9NG4zIZV@1mk<-fl*l z2PJa7A*lsv%H5OgUi7gN?0{6o5RT4)f+>DZU%WGHSk@99uh;`ZdZj4Kz6<_J{uX;N zGxf5mYwg$mk6RmqTOY6N>#IBo-ytYt~UfTOy#4ie4*INMgRb*mX?(fw%yG@_-``JfjTvw+nL*~DOc-lh| z?I{2A8=ZpG=|x;_buoixQB?|Zsg-CB8; zRY1~;KPjG<=QyP(B_nvkup!s0^$1AB*QntF&<+uvk)0^-RP2z z`bh0zv}>k)Zws@zY`stx_>zO>gp{Q%B*I3SVT70N1?~$A`;h&iS2gyIZpd z@Gm(%@&% zIEeO9<;RV?cj`?1Wd*!u>?AoCgLvq!Rz*S|Hwias!RPlzrz_KpvWdPIa?-cg8kZlR zU1Nzn;2by-7gRL}%@G@QMI0LHTwFB7HTogWr)&A8&kXDj=LaSa*hj1r)`tY&4(c4O zrTs$$7^_hbc{@^-*;DuEP!-_?8WL~)GatYL50GA~^j=?N`15}3+WqvAOxi*no-n`V zy`y9?H|QBFSLMFs6~^^qH5fVG^F4q2!Zd&UTHW2mI4?Z~{hdw=1@zZ>1E*Gzf*Ls$ zmVb!_zd=d7GACf_9tN&w$`_fWybT8gp-%^r`wiTs-wy2?ks9)R6Qfznqvak|D1nEu zsmQvJc|UWx4fGOc`F!H6A2T)+BkQc?kkBLnrX=wal@E~Id(`*WqxI@8OMB>+8SA3` z2gWHW_Nd^yHa97MP-y`DhaO;h$1{P>Db^IAgk%Ag=v@tP*IKfFJ( zKh{|?*X%GmWgreMw18Nwo!2LPM@W%8J5h^4jS-JKCVhg_|80!YD~_Uq@S+1Je!S;T z;8!$JgpVnwGms8`6H_tn^XD~_%La@gsO1b^g80^HB}%Ndt(MB6M1j^(_8 zvQ~oJ@#6k6?&Cj>Pa#~FAyFs>#nbjH(<4SgG;MHn3fknAK$Xb{<3U9cq9}$;xIJ!! z>dq@Q71^hBBuh#H{V7-$Ww8S8AB_R`l+YCMp8;E7L{G6r*)?O5N%Orit=W>_*&$fR z3qim!Ot_Z4^=jcszI4&;^N;3DLps7WChv{2OUV8=a^8Oy=KVj0zZDX3A)0TCIB|C{|J0{<>l+ zH!`80bOI{&DGsjz`&2!hgw82rCZx9-%HbG*nii3tj-za0+=%|dc%U5>9+>R3I_`3C z9pW?$Kg+KQhr#%w)PJe-C_RdV@$7wXb7*txFLt}HR29iYSNV)w)pFT~QC_{HIwXB9 z9r-R~!i{)`vIQ9G$Jqad8gV)N-%uywRV25_Q?NY#u7G`t1lz6KpC+m))aOpsKP5%x zu+JL%WIe>kqdm|crE^pnVNJbf|ByO>Wht%6rOJC%gt-t z0mJD|F~UH5*UsLD`R9M&ajQR#En*{2@X?V-s@~JX`wwbcVb$waH_T-Z^EnL&J2bh7 zh4D`}(2=k7Rph?8N<_W^yjbt^)P(FRYN6Ic2i5DYi~T%S7x~WBtpZ|%GO7{<{|}e5 ztV%jxMcx@N=w*TQ_4(^aoj?3xj-jz--)BwZ51=Ql6etO>VkkLb%8R`yQW8X2-3w(R z8-}l5*Av7``l?_fd^bmXvJCC>isrqA?BsU?FVT`<_z0_k-(m|KO zOTf$p`n3Gdg~J6l&Bi9x#F_*)rGOn~MzkUB#D0{O2n4XRK%6Ld9)FUg5H^qcrTsTW z)M4cNvf7ACXth&yEk#LPi>|pH@%}-9BqpUU1Xe}%l(FQKSP3*V*@@Cm(y6*ypakIB zn=b>R7;cCYqQBNboN?&Xxnci{bvd=Y10c(-hn6#!w29~lMlt3g-Z1IuR28We zHTzdB9f&)>-|e$41y{k(Ir_icSWh0-&Q^1ZT6mj}_%oh6J^@_K|9@8lW{RnrIoK-2 zcu7cG2a38UypI$qdHHwb-B8~r$%!%&37XvG6_l~LH1YeecA9@x0>OS1zWZOng3f$D zz^tn4;<4=*P`*4D8)^6rtiF!^{N(L2Dq%3{|A(0dhS@2DhbEE@H;e$^|L8AB-YX*! s-Y+F9sc{&2_xpd}v!>p){CG(OzkAJpHPZZ?0R()s)bv$LRcyll4~x(AU;qFB diff --git a/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/panel.png b/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/panel.png deleted file mode 100644 index 0fd72b87f988bb5745f952545e163c7ee8f0784d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41955 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

    BVOQw`}7NBF}@+O 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 diff --git a/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/random.png b/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/random.png deleted file mode 100644 index 7640aa052db2815aa29cae857f9cceed13774e07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4891 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 diff --git a/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/tiling.png b/meta-ivi-common/recipes-graphics/wayland/weston-ivi-shell/data/tiling.png deleted file mode 100644 index dd3e02c0fb4c6844ae7a9efc1a2aaa82169d8019..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5620 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 O0000