From 1c2201b543416838e4a14df61e2230049f6b0983 Mon Sep 17 00:00:00 2001 From: Nobuhiko Tanibata Date: Wed, 9 Dec 2015 15:45:52 +0900 Subject: [PATCH] ivi-shell: hmi-controller supports multi screens at random-mode. It shows ivi applications at screensa randomly. Signed-off-by: Nobuhiko Tanibata Reviewed-by: Pekka Paalanen --- ivi-shell/hmi-controller.c | 39 +++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/ivi-shell/hmi-controller.c b/ivi-shell/hmi-controller.c index 9b69dd20..77426bc8 100644 --- a/ivi-shell/hmi-controller.c +++ b/ivi-shell/hmi-controller.c @@ -409,14 +409,32 @@ mode_random_replace(struct hmi_controller *hmi_ctrl, int32_t surface_length, struct wl_list *layer_list) { - struct hmi_controller_layer *layer = wl_container_of(layer_list->prev, layer, link); - const int32_t surface_width = (int32_t)(layer->width * 0.25f); - const int32_t surface_height = (int32_t)(layer->height * 0.25f); + struct hmi_controller_layer *application_layer = NULL; + struct hmi_controller_layer **layers = NULL; + int32_t surface_width = 0; + int32_t surface_height = 0; 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; + int32_t layer_idx = 0; + + layers = MEM_ALLOC(sizeof(*layers) * hmi_ctrl->screen_num); + + wl_list_for_each(application_layer, layer_list, link) { + layers[layer_idx] = application_layer; + ivi_layout_interface->layer_set_render_order(layers[layer_idx]->ivilayer, + NULL, 0); + layer_idx++; + } + + /* + * This commit change is needed because ivisurface can not belongs to several layers + * at the same time. So ivisurfaces shall be removed from layers once and then set them + * to layers randomly. + */ + ivi_layout_interface->commit_changes(); for (i = 0; i < surface_length; i++) { ivisurf = pp_surface[i]; @@ -425,19 +443,30 @@ mode_random_replace(struct hmi_controller *hmi_ctrl, if (is_surf_in_ui_widget(hmi_ctrl, ivisurf)) continue; + /* surface determined at random a layer that belongs */ + layer_idx = rand() % hmi_ctrl->screen_num; + ivi_layout_interface->surface_set_transition(ivisurf, IVI_LAYOUT_TRANSITION_VIEW_DEFAULT, duration); + ivi_layout_interface->surface_set_visibility(ivisurf, true); - surface_x = rand() % (layer->width - surface_width); - surface_y = rand() % (layer->height - surface_height); + + surface_width = (int32_t)(layers[layer_idx]->width * 0.25f); + surface_height = (int32_t)(layers[layer_idx]->height * 0.25f); + surface_x = rand() % (layers[layer_idx]->width - surface_width); + surface_y = rand() % (layers[layer_idx]->height - surface_height); ivi_layout_interface->surface_set_destination_rectangle(ivisurf, surface_x, surface_y, surface_width, surface_height); + + ivi_layout_interface->layer_add_surface(layers[layer_idx]->ivilayer, ivisurf); } + + free(layers); } static int32_t