diff --git a/ivi-shell/hmi-controller.c b/ivi-shell/hmi-controller.c index 66dde79cd862aa3207eb36d50d4d44a5e2d03e31..7739aa794413b55682180e582ea64283b64d4b84 100644 --- a/ivi-shell/hmi-controller.c +++ b/ivi-shell/hmi-controller.c @@ -72,6 +72,7 @@ struct hmi_controller_layer { int32_t y; int32_t width; int32_t height; + struct wl_list link; }; struct link_layer { @@ -89,6 +90,7 @@ struct hmi_server_setting { uint32_t application_layer_id; uint32_t workspace_background_layer_id; uint32_t workspace_layer_id; + uint32_t base_layer_id_offset; int32_t panel_height; uint32_t transition_duration; char *ivi_homescreen; @@ -107,7 +109,8 @@ struct ui_setting { struct hmi_controller { struct hmi_server_setting *hmi_setting; - struct hmi_controller_layer base_layer; + /* List of struct hmi_controller_layer */ + struct wl_list base_layer_list; struct hmi_controller_layer application_layer; struct hmi_controller_layer workspace_background_layer; struct hmi_controller_layer workspace_layer; @@ -654,6 +657,9 @@ hmi_server_setting_create(struct weston_compositor *ec) weston_config_section_get_uint(shell_section, "application-layer-id", &setting->application_layer_id, 4000); + weston_config_section_get_uint(shell_section, "base-layer-id-offset", + &setting->base_layer_id_offset, 10000); + weston_config_section_get_uint(shell_section, "transition-duration", &setting->transition_duration, 300); @@ -671,6 +677,8 @@ hmi_controller_destroy(struct wl_listener *listener, void *data) { struct link_layer *link = NULL; struct link_layer *next = NULL; + struct hmi_controller_layer *ctrl_layer_link = NULL; + struct hmi_controller_layer *ctrl_layer_next = NULL; struct hmi_controller *hmi_ctrl = container_of(listener, struct hmi_controller, destroy_listener); @@ -680,6 +688,12 @@ hmi_controller_destroy(struct wl_listener *listener, void *data) free(link); } + wl_list_for_each_safe(ctrl_layer_link, ctrl_layer_next, + &hmi_ctrl->base_layer_list, link) { + wl_list_remove(&ctrl_layer_link->link); + free(ctrl_layer_link); + } + wl_array_release(&hmi_ctrl->ui_widgets); free(hmi_ctrl->hmi_setting); free(hmi_ctrl->pp_screen); @@ -710,6 +724,9 @@ hmi_controller_create(struct weston_compositor *ec) struct link_layer *tmp_link_layer = NULL; int32_t panel_height = 0; struct hmi_controller *hmi_ctrl = MEM_ALLOC(sizeof(*hmi_ctrl)); + struct hmi_controller_layer *base_layer = NULL; + + int32_t i = 0; wl_array_init(&hmi_ctrl->ui_widgets); hmi_ctrl->layout_mode = IVI_HMI_CONTROLLER_LAYOUT_MODE_TILING; @@ -724,18 +741,29 @@ hmi_controller_create(struct weston_compositor *ec) } iviscrn = get_screen(0, hmi_ctrl); - ivi_layout_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); + wl_list_init(&hmi_ctrl->base_layer_list); + for (i = 0; i < hmi_ctrl->screen_num; i++) { + ivi_layout_interface->get_screen_resolution(get_screen(i, hmi_ctrl), + &screen_width, + &screen_height); + + base_layer = MEM_ALLOC(1 * sizeof(struct hmi_controller_layer)); + base_layer->x = 0; + base_layer->y = 0; + base_layer->width = screen_width; + base_layer->height = screen_height; + base_layer->id_layer = + hmi_ctrl->hmi_setting->base_layer_id + + (i * hmi_ctrl->hmi_setting->base_layer_id_offset); + wl_list_insert(&hmi_ctrl->base_layer_list, &base_layer->link); + + create_layer(get_screen(i, hmi_ctrl), base_layer); + } + ivi_layout_interface->get_screen_resolution(iviscrn, &screen_width, + &screen_height); panel_height = hmi_ctrl->hmi_setting->panel_height; /* init application ivi_layer */ @@ -802,7 +830,11 @@ 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; + struct hmi_controller_layer *base_layer = + wl_container_of(hmi_ctrl->base_layer_list.prev, + base_layer, + link); + struct ivi_layout_layer *ivilayer = 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; @@ -839,8 +871,12 @@ 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; + struct hmi_controller_layer *base_layer = + wl_container_of(hmi_ctrl->base_layer_list.prev, + base_layer, + link); + struct ivi_layout_layer *ivilayer = base_layer->ivilayer; + const int32_t width = base_layer->width; int32_t ret = 0; int32_t panel_height = 0; const int32_t dstx = 0; @@ -858,7 +894,7 @@ ivi_hmi_controller_set_panel(struct hmi_controller *hmi_ctrl, panel_height = hmi_ctrl->hmi_setting->panel_height; - dsty = hmi_ctrl->base_layer.height - panel_height; + dsty = base_layer->height - panel_height; ret = ivi_layout_interface->surface_set_destination_rectangle( ivisurf, dstx, dsty, width, panel_height); @@ -882,7 +918,11 @@ 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; + struct hmi_controller_layer *base_layer = + wl_container_of(hmi_ctrl->base_layer_list.prev, + base_layer, + link); + struct ivi_layout_layer *ivilayer = base_layer->ivilayer; const int32_t width = 48; const int32_t height = 48; int32_t ret = 0; @@ -902,7 +942,7 @@ ivi_hmi_controller_set_button(struct hmi_controller *hmi_ctrl, panel_height = hmi_ctrl->hmi_setting->panel_height; dstx = (60 * number) + 15; - dsty = (hmi_ctrl->base_layer.height - panel_height) + 5; + dsty = (base_layer->height - panel_height) + 5; ret = ivi_layout_interface->surface_set_destination_rectangle( ivisurf,dstx, dsty, width, height); @@ -924,12 +964,16 @@ 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; + struct hmi_controller_layer *base_layer = + wl_container_of(hmi_ctrl->base_layer_list.prev, + base_layer, + link); + struct ivi_layout_layer *ivilayer = 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; + const int32_t dstx = (base_layer->width - size) / 2; + const int32_t dsty = (base_layer->height - panel_height) + 5; uint32_t *add_surface_id = wl_array_add(&hmi_ctrl->ui_widgets, sizeof(*add_surface_id)); diff --git a/ivi-shell/weston.ini.in b/ivi-shell/weston.ini.in index 6c2263393dbe58cc035cc807da594c1a7a4a228a..17524aa915eb935eb40636ab378ed0e3d929e1e9 100644 --- a/ivi-shell/weston.ini.in +++ b/ivi-shell/weston.ini.in @@ -11,6 +11,8 @@ cursor-theme=default cursor-size=32 base-layer-id=1000 +base-layer-id-offset=10000 + workspace-background-layer-id=2000 workspace-layer-id=3000 application-layer-id=4000