index d5403e06..7b2f2707 100644 --- a/ivi-shell/hmi-controller.c +++ b/ivi-shell/hmi-controller.c @@ -129,9 +129,9 @@ struct hmi_controller { struct weston_compositor *compositor; struct wl_listener destroy_listener; - struct wl_listener surface_created; struct wl_listener surface_removed; struct wl_listener surface_configured; + struct wl_listener desktop_surface_configured; struct wl_client *user_interface; struct ui_setting ui_setting; @@ -581,28 +581,6 @@ create_layer(struct weston_output *output, /** * Internal set notification */ -static void -set_notification_create_surface(struct wl_listener *listener, void *data) -{ - struct hmi_controller *hmi_ctrl = - wl_container_of(listener, hmi_ctrl, - surface_created); - struct ivi_layout_surface *ivisurf = data; - struct hmi_controller_layer *layer_link = - wl_container_of(hmi_ctrl->application_layer_list.prev, - layer_link, - link); - struct ivi_layout_layer *application_layer = layer_link->ivilayer; - int32_t ret = 0; - - /* skip ui widgets */ - if (is_surf_in_ui_widget(hmi_ctrl, ivisurf)) - return; - - ret = ivi_layout_interface->layer_add_surface(application_layer, ivisurf); - assert(!ret); -} - static void set_notification_remove_surface(struct wl_listener *listener, void *data) { @@ -670,6 +648,42 @@ set_notification_configure_surface(struct wl_listener *listener, void *data) switch_mode(hmi_ctrl, hmi_ctrl->layout_mode); } +static void +set_notification_configure_desktop_surface(struct wl_listener *listener, void *data) +{ + struct hmi_controller *hmi_ctrl = + wl_container_of(listener, hmi_ctrl, + desktop_surface_configured); + struct ivi_layout_surface *ivisurf = data; + struct hmi_controller_layer *layer_link = + wl_container_of(hmi_ctrl->application_layer_list.prev, + layer_link, + link); + struct ivi_layout_layer *application_layer = layer_link->ivilayer; + struct weston_surface *surface; + int32_t ret = 0; + + /* skip ui widgets */ + if (is_surf_in_ui_widget(hmi_ctrl, ivisurf)) + return; + + ret = ivi_layout_interface->layer_add_surface(application_layer, ivisurf); + assert(!ret); + + /* + * if application changes size of wl_buffer. The source rectangle shall be + * fit to the size. + */ + surface = ivi_layout_interface->surface_get_weston_surface(ivisurf); + if (surface) { + ivi_layout_interface->surface_set_source_rectangle(ivisurf, 0, + 0, surface->width, surface->height); + } + + ivi_layout_interface->commit_changes(); + 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 @@ -852,6 +866,9 @@ hmi_controller_create(struct weston_compositor *ec) hmi_ctrl->surface_configured.notify = set_notification_configure_surface; ivi_layout_interface->add_listener_configure_surface(&hmi_ctrl->surface_configured); + hmi_ctrl->desktop_surface_configured.notify = set_notification_configure_desktop_surface; + ivi_layout_interface->add_listener_configure_desktop_surface(&hmi_ctrl->desktop_surface_configured); + hmi_ctrl->destroy_listener.notify = hmi_controller_destroy; wl_signal_add(&hmi_ctrl->compositor->destroy_signal, &hmi_ctrl->destroy_listener); @@ -1275,13 +1292,6 @@ ivi_hmi_controller_UI_ready(struct wl_client *client, ivi_layout_interface->commit_changes(); ivi_hmi_controller_add_launchers(hmi_ctrl, 256); - - /* Add surface_created listener after the initialization of launchers. - * Otherwise, surfaces of the launchers will be added to application - * layer too.*/ - hmi_ctrl->surface_created.notify = set_notification_create_surface; - ivi_layout_interface->add_listener_create_surface(&hmi_ctrl->surface_created); - hmi_ctrl->is_initialized = 1; } diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c index 6b854503..22d63708 100644 --- a/ivi-shell/ivi-layout.c +++ b/ivi-shell/ivi-layout.c @@ -787,9 +787,15 @@ commit_surface_list(struct ivi_layout *layout) ivisurf->pending.prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; if (configured && !is_surface_transition(ivisurf)) { - shell_surface_send_configure(ivisurf->surface, - ivisurf->prop.dest_width, - ivisurf->prop.dest_height); + if (ivisurf->weston_desktop_surface) { + weston_desktop_surface_set_size(ivisurf->weston_desktop_surface, + ivisurf->prop.dest_width, + ivisurf->prop.dest_height); + } else { + shell_surface_send_configure(ivisurf->surface, + ivisurf->prop.dest_width, + ivisurf->prop.dest_height); + } } } else { configured = 0;