diff --git a/ivi-shell/ivi-layout-export.h b/ivi-shell/ivi-layout-export.h index 02bfb2cb..a3ec645a 100644 --- a/ivi-shell/ivi-layout-export.h +++ b/ivi-shell/ivi-layout-export.h @@ -314,6 +314,12 @@ struct ivi_layout_interface { struct ivi_layout_surface *ivisurf, uint32_t duration); + /** + * \brief set id of ivi_layout_surface + */ + int32_t (*surface_set_id)(struct ivi_layout_surface *ivisurf, + uint32_t id_surface); + /** * layer controller interface */ diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c index b9bcfc80..95a7f628 100644 --- a/ivi-shell/ivi-layout.c +++ b/ivi-shell/ivi-layout.c @@ -1811,6 +1811,44 @@ ivi_layout_surface_set_transition_duration(struct ivi_layout_surface *ivisurf, return 0; } +/* + * This interface enables e.g. an id agent to set the id of an ivi-layout + * surface, that has been created by a desktop application. This can only be + * done once as long as the initial surface id equals IVI_INVALID_ID. Afterwards + * two events are emitted, namely surface_created and surface_configured. + */ +static int32_t +ivi_layout_surface_set_id(struct ivi_layout_surface *ivisurf, + uint32_t id_surface) +{ + struct ivi_layout *layout = get_instance(); + struct ivi_layout_surface *search_ivisurf = NULL; + + if (!ivisurf) { + weston_log("%s: invalid argument\n", __func__); + return IVI_FAILED; + } + + if (ivisurf->id_surface != IVI_INVALID_ID) { + weston_log("surface id can only be set once\n"); + return IVI_FAILED; + } + + search_ivisurf = get_surface(&layout->surface_list, id_surface); + if (search_ivisurf) { + weston_log("id_surface(%d) is already created\n", id_surface); + return IVI_FAILED; + } + + ivisurf->id_surface = id_surface; + + wl_signal_emit(&layout->surface_notification.created, ivisurf); + wl_signal_emit(&layout->surface_notification.configure_changed, + ivisurf); + + return IVI_SUCCEEDED; +} + static int32_t ivi_layout_surface_set_transition(struct ivi_layout_surface *ivisurf, enum ivi_layout_transition_type type, @@ -1973,6 +2011,7 @@ static struct ivi_layout_interface ivi_layout_interface = { .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, + .surface_set_id = ivi_layout_surface_set_id, /** * layer controller interfaces