| // Copyright 2021 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| use {anyhow::Error, fuchsia_zircon as zx}; |
| |
| pub use { |
| fidl_fuchsia_scenic_scheduling::PresentationInfo, |
| fidl_fuchsia_ui_composition::{ |
| ChildViewWatcherMarker, ContentId, FlatlandDisplayMarker, FlatlandDisplayProxy, |
| FlatlandError, FlatlandEvent, FlatlandEventStream, FlatlandMarker, FlatlandProxy, |
| LayoutInfo, ParentViewportWatcherMarker, ParentViewportWatcherProxy, PresentArgs, |
| TransformId, ViewBoundProtocols, ViewportProperties, |
| }, |
| fidl_fuchsia_ui_views::{ViewCreationToken, ViewportCreationToken}, |
| }; |
| |
| // Pair of tokens used to link two Flatland sessions together. |
| pub struct ViewCreationTokenPair { |
| pub view_creation_token: ViewCreationToken, |
| pub viewport_creation_token: ViewportCreationToken, |
| } |
| |
| impl ViewCreationTokenPair { |
| pub fn new() -> Result<ViewCreationTokenPair, Error> { |
| let (view_creation_token, viewport_creation_token) = zx::Channel::create(); |
| Ok(ViewCreationTokenPair { |
| view_creation_token: ViewCreationToken { value: view_creation_token }, |
| viewport_creation_token: ViewportCreationToken { value: viewport_creation_token }, |
| }) |
| } |
| } |
| |
| /// IdGenerator generates a monotonically-increasing sequence of IDs, either TransformIds or |
| /// ContentIds, depending on what the caller asks for. The ID values are unique both across and |
| /// within ID types, e.g. a given IdGenerator will not generate two TransformIds with the same |
| /// value, nor a TransformId and a ContentId with the same value. |
| pub struct IdGenerator { |
| next_id: u64, |
| } |
| |
| impl IdGenerator { |
| pub fn new() -> Self { |
| IdGenerator { next_id: 1 } |
| } |
| |
| pub fn new_with_first_id(first_id: u64) -> Self { |
| IdGenerator { next_id: first_id } |
| } |
| |
| pub fn next_transform_id(&mut self) -> TransformId { |
| let id = self.next_id; |
| self.next_id += 1; |
| TransformId { value: id } |
| } |
| |
| pub fn next_content_id(&mut self) -> ContentId { |
| let id = self.next_id; |
| self.next_id += 1; |
| ContentId { value: id } |
| } |
| } |
| |
| #[cfg(test)] |
| mod tests { |
| use super::*; |
| |
| #[test] |
| fn id_generator_basic() { |
| let mut generator = IdGenerator::new(); |
| assert_eq!(generator.next_content_id(), ContentId { value: 1 }); |
| assert_eq!(generator.next_content_id(), ContentId { value: 2 }); |
| assert_eq!(generator.next_transform_id(), TransformId { value: 3 }); |
| assert_eq!(generator.next_transform_id(), TransformId { value: 4 }); |
| } |
| |
| #[test] |
| fn id_generator_with_first_id() { |
| let mut generator = IdGenerator::new_with_first_id(11); |
| assert_eq!(generator.next_transform_id(), TransformId { value: 11 }); |
| } |
| } |