Module smithay::wayland::shm[][src]

Expand description

SHM handling helpers

This module provides helpers to handle SHM-based buffers from wayland clients.

SHM (Shared Memory) is the most basic way wayland clients can send content to the compositor: by sending a file descriptor to some (likely RAM-backed) storage containing the actual data. This helper handles for you most of the logic for handling these file descriptor and accessing their contents as simple &[u8] slices.

This module is heavily inspired from the similar helpers of the wayland C libraries.

To use it, first add a ShmGlobal to your display, specifying the formats you want to support (ARGB8888 and XRGB8888 are always considered as supported, as specified by the wayland protocol).

extern crate wayland_server;
extern crate smithay;

use smithay::wayland::shm::init_shm_global;
use wayland_server::protocol::wl_shm::Format;

// Insert the ShmGlobal into your event loop
// Here, we specify that Yuyv and C8 format are supported
// additionally to the standard Argb8888 and Xrgb8888.
init_shm_global(
    &mut display,
    vec![Format::Yuyv, Format::C8],
    None // we don't provide a logger here
);

Then, when you have a WlBuffer and need to retrieve its contents, use the with_buffer_contents function to do it:

use smithay::wayland::shm::{with_buffer_contents, BufferData, BufferAccessError};

let content = with_buffer_contents(&buffer,
    |slice: &[u8], buffer_metadata: BufferData| {
        // do something to extract the contents of the buffer
    }
);

match content {
    Ok(something) =>  {
        /* `something` is the value you returned from the closure */
    },
    Err(BufferAccessError::NotManaged) => {
        /* This buffer is not managed by the SHM global, but by something else */
    },
    Err(BufferAccessError::BadMap) => {
        /* The client supplied invalid content specification for this buffer,
           and was killed.
         */
    }
}

Note

This handler makes itself safe regarding the client providing a wrong size for the memory pool by using a SIGBUS handler.

If you are already using an handler for this signal, you probably don’t want to use this handler.

Structs

Details of the contents of a buffer relative to its pool

Enums

Error that can occur when accessing an SHM buffer

Functions

Create a new SHM global advertizing given supported formats.

Call given closure with the contents of the given buffer