cognitive_wayland_frontend/lib.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of
// the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/
//! This crate implements Wayland functionality.
//!
//! # Sketch of architecture
//!
//! The piece of code running all the business is `Engine`. It sets up everything and handles
//! requests from clients as well as the rests of application. Upon client connection `Engine`
//! creates new
//!
//! - `skylane::Client`, structure registering handlers (representing Wayland objects) and
//! dispatching client requests to them and
//! - `wayland_frontend::Proxy`, structure used for sharing information between handlers, a state
//! of client.
//!
//! `Proxy` is shared between handlers as `RefCell`.
//!
//! Two interfaces were introduced:
//!
//! - `Facade`, for requests from clients (downward?) which is implemented by `Proxy` and
//! - `Gateway`, for requests from application (upward?) which is implemented by `Engine`
//! (dispatching request to correct `Proxy`s) and `Proxy` (making actual request to client).
//!
//! So one `Engine` holds many `Client`s holding many (cell) references to `Proxy`, but at some
//! point `Engine` must be informed that client created surface. For this purpose `Engine` and all
//! `Proxy`s hold (cell) reference to single `Mediator`.
//!
//! Details of threading are left for application. `wayland_frontend` may be configured to receive
//! in one thread and send in other or do everything in one thread. What is however sure accepting
//! new client can not be done in `DisplayEventHandler` and handling requests can not be done in
//! `ClientEventHandler` as it may require mutating `dharma::Dispatcher`, so handling is decoupled
//! from processing using `dharma::DirectSender`.
// TODO: Move common DRM functionality to module.
extern crate drm as libdrm;
extern crate nix;
extern crate skylane;
extern crate skylane_protocols;
extern crate dharma;
extern crate cognitive_graphics;
#[macro_use]
extern crate timber;
#[macro_use]
extern crate cognitive_qualia as qualia;
extern crate cognitive_inputs as inputs;
pub mod constants;
#[macro_use]
mod macros;
mod mediator;
mod global;
mod facade;
mod gateway;
mod proxy;
mod event_handlers;
mod protocol;
pub mod engine;
pub use engine::Engine;
pub use gateway::Gateway;