compositor: module documentation
This commit is contained in:
parent
9fe6f16af3
commit
627008dbce
|
@ -1,13 +1,107 @@
|
||||||
|
//! Utilities for handling surfaces, subsurfaces and regions
|
||||||
|
//!
|
||||||
|
//! This module provides the `CompositorHandler<U,H>` type, with implements
|
||||||
|
//! automatic handling of sufaces, subsurfaces and region wayland objects,
|
||||||
|
//! by being registered as a global handler for `wl_compositor` and
|
||||||
|
//! `wl_subcompositor`.
|
||||||
|
//!
|
||||||
|
//! ## Why use this handler
|
||||||
|
//!
|
||||||
|
//! This handler does a simple job: it stores in a coherent way the state of
|
||||||
|
//! surface trees with subsurfaces, to provide you a direct access to the tree
|
||||||
|
//! structure and all surface metadata.
|
||||||
|
//!
|
||||||
|
//! As such, you can, given a root surface with a role requiring it to be displayed,
|
||||||
|
//! you can iterate over the whole tree of subsurfaces to recover all the metadata you
|
||||||
|
//! need to display the subsurface tree.
|
||||||
|
//!
|
||||||
|
//! This handler will not do anything more than present you the metadata specified by the
|
||||||
|
//! client in a coherent and practical way. All the logic regarding to drawing itself, and
|
||||||
|
//! the positionning of windows (surface trees) one relative to another is out of its scope.
|
||||||
|
//!
|
||||||
|
//! ## How to use it
|
||||||
|
//!
|
||||||
|
//! ### Initialization
|
||||||
|
//!
|
||||||
|
//! To initialize this handler, simply instanciate it and register it to the event loop
|
||||||
|
//! as a global handler for wl_compositor and wl_subcompositor:
|
||||||
|
//!
|
||||||
|
//! ```
|
||||||
|
//! # extern crate wayland_server;
|
||||||
|
//! # extern crate smithay;
|
||||||
|
//! use wayland_server::protocol::wl_compositor::WlCompositor;
|
||||||
|
//! use wayland_server::protocol::wl_subcompositor::WlSubcompositor;
|
||||||
|
//! use smithay::compositor;
|
||||||
|
//!
|
||||||
|
//! // Define some user data to be associated with the surfaces.
|
||||||
|
//! // It must implement the Default trait, which will represent the state of a surface which
|
||||||
|
//! // has just been created.
|
||||||
|
//! #[derive(Default)]
|
||||||
|
//! struct MyData {
|
||||||
|
//! // whatever you need here
|
||||||
|
//! }
|
||||||
|
//!
|
||||||
|
//! // Define a sub-handler to take care of the events the CompositorHandler does not rack for you
|
||||||
|
//! struct MyHandler {
|
||||||
|
//! // whatever you need
|
||||||
|
//! }
|
||||||
|
//!
|
||||||
|
//! // Implement the handler trait for this sub-handler
|
||||||
|
//! impl compositor::Handler for MyHandler {
|
||||||
|
//! // See the trait documentation for its implementation
|
||||||
|
//! // A default implementation for each method is provided, that does nothing
|
||||||
|
//! }
|
||||||
|
//!
|
||||||
|
//! // A type alias to shorten things:
|
||||||
|
//! type MyCompositorHandler = compositor::CompositorHandler<MyData,MyHandler>;
|
||||||
|
//!
|
||||||
|
//! # fn main() {
|
||||||
|
//! # let (_display, mut event_loop) = wayland_server::create_display();
|
||||||
|
//!
|
||||||
|
//! // Instanciate the CompositorHandler and give it to the event loop
|
||||||
|
//! let compositor_hid = event_loop.add_handler_with_init(
|
||||||
|
//! MyCompositorHandler::new(Myhandler::new())
|
||||||
|
//! );
|
||||||
|
//!
|
||||||
|
//! // Register it as a handler for wl_compositor
|
||||||
|
//! event_loop.register_global::<WlCompositor, MyCompositorHandler>(compositor_hid);
|
||||||
|
//!
|
||||||
|
//! // Register it as a handler for wl_subcompositor
|
||||||
|
//! event_loop.register_global::<WlSubcompositor, MyCompositorHandler>(compositor_hid);
|
||||||
|
//!
|
||||||
|
//! // retrieve the token needed to access the surfaces' metadata
|
||||||
|
//! let compositor_token = {
|
||||||
|
//! let state = event_loop.state();
|
||||||
|
//! state.get_handler::<MyCompositorHandler>>(handler_id).get_token()
|
||||||
|
//! };
|
||||||
|
//!
|
||||||
|
//! // You're now ready to go!
|
||||||
|
//! # }
|
||||||
|
//! ```
|
||||||
|
//!
|
||||||
|
//! ### Use the surface metadata
|
||||||
|
//!
|
||||||
|
//! As you can see in the previous example, in the end we are retrieving a token from
|
||||||
|
//! the `CompositorHandler`. This token is necessary to retrieve the metadata associated with
|
||||||
|
//! a surface. It can be cloned, and is sendable accross threads. See `CompositorToken` for
|
||||||
|
//! the details of what it enables you.
|
||||||
|
//!
|
||||||
|
//! The surface metadata is held in the `SurfaceAttributes` struct. In contains double-buffered
|
||||||
|
//! state pending from the client as defined by the protocol for wl_surface, as well as your
|
||||||
|
//! user-defined type holding any data you need to have associated with a struct. See its
|
||||||
|
//! documentation for details.
|
||||||
|
|
||||||
mod global;
|
mod global;
|
||||||
mod handlers;
|
mod handlers;
|
||||||
mod tree;
|
mod tree;
|
||||||
mod region;
|
mod region;
|
||||||
|
|
||||||
|
use self::region::RegionData;
|
||||||
pub use self::tree::RoleStatus;
|
pub use self::tree::RoleStatus;
|
||||||
use self::tree::SurfaceData;
|
use self::tree::SurfaceData;
|
||||||
use wayland_server::{Client, EventLoopHandle, Init, resource_is_registered};
|
use wayland_server::{Client, EventLoopHandle, Init, resource_is_registered};
|
||||||
|
|
||||||
use wayland_server::protocol::{wl_buffer, wl_callback, wl_output, wl_surface};
|
use wayland_server::protocol::{wl_buffer, wl_callback, wl_output, wl_region, wl_surface};
|
||||||
|
|
||||||
/// Description of which part of a surface
|
/// Description of which part of a surface
|
||||||
/// should be considered damaged and needs to be redrawn
|
/// should be considered damaged and needs to be redrawn
|
||||||
|
@ -280,6 +374,14 @@ impl<U: Send + 'static, H: Handler + Send + 'static> CompositorToken<U, H> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A struct handling the `wl_compositor` and `wl_subcompositor` globals
|
||||||
|
///
|
||||||
|
/// It allows you to choose a custom `U` type to store data you want
|
||||||
|
/// associated with the surfaces in their metadata, as well a providing
|
||||||
|
/// a sub-handler to handle the events defined by the `Handler` trait
|
||||||
|
/// defined in this module.
|
||||||
|
///
|
||||||
|
/// See the module-level documentation for instructions and examples of use.
|
||||||
pub struct CompositorHandler<U, H> {
|
pub struct CompositorHandler<U, H> {
|
||||||
my_id: usize,
|
my_id: usize,
|
||||||
log: ::slog::Logger,
|
log: ::slog::Logger,
|
||||||
|
|
Loading…
Reference in New Issue