libcosmic/cosmic/cctk/sctk/shm/multi/index.html
2026-04-18 20:11:25 +00:00

59 lines
No EOL
7.7 KiB
HTML

<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A pool implementation which automatically manage buffers."><title>cosmic::cctk::sctk::shm::multi - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../../../static.files/rustdoc-aa0817cf.css"><meta name="rustdoc-vars" data-root-path="../../../../../" data-static-root-path="../../../../../static.files/" data-current-crate="cosmic" data-themes="" data-resource-suffix="" data-rustdoc-version="1.90.0-nightly (3048886e5 2025-07-30)" data-channel="nightly" data-search-js="search-fa3e91e5.js" data-settings-js="settings-5514c975.js" ><script src="../../../../../static.files/storage-68b7e25d.js"></script><script defer src="../sidebar-items.js"></script><script defer src="../../../../../static.files/main-eebb9057.js"></script><noscript><link rel="stylesheet" href="../../../../../static.files/noscript-32bb7600.css"></noscript><link rel="alternate icon" type="image/png" href="../../../../../static.files/favicon-32x32-6580c154.png"><link rel="icon" type="image/svg+xml" href="../../../../../static.files/favicon-044be391.svg"></head><body class="rustdoc mod"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle" title="show sidebar"></button></nav><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../../../../cosmic/index.html">cosmic</a><span class="version">1.0.0</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module multi</a></h2><h3><a href="#">Sections</a></h3><ul class="block top-toc"><li><a href="#example" title="Example">Example</a></li></ul><h3><a href="#structs">Module Items</a></h3><ul class="block"><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#enums" title="Enums">Enums</a></li></ul></section><div id="rustdoc-modnav"><h2><a href="../index.html">In cosmic::<wbr>cctk::<wbr>sctk::<wbr>shm</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><rustdoc-search></rustdoc-search><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../../../../index.html">cosmic</a>::<wbr><a href="../../../index.html">cctk</a>::<wbr><a href="../../index.html">sctk</a>::<wbr><a href="../index.html">shm</a></div><h1>Module <span>multi</span><button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"></span></div><span class="item-info"><div class="stab portability">Available on <strong>crate feature <code>wayland</code> and Linux</strong> only.</div></span><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>A pool implementation which automatically manage buffers.</p>
<p>This pool is built on the <a href="../raw/struct.RawPool.html" title="struct cosmic::cctk::sctk::shm::raw::RawPool"><code>RawPool</code></a>.</p>
<p>The <a href="struct.MultiPool.html" title="struct cosmic::cctk::sctk::shm::multi::MultiPool"><code>MultiPool</code></a> takes a key which is used to identify buffers and tries to return the buffer associated to the key
if possible. If no buffer in the pool is associated to the key, it will create a new one.</p>
<h2 id="example"><a class="doc-anchor" href="#example">§</a>Example</h2>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>smithay_client_toolkit::reexports::client::{
QueueHandle,
protocol::wl_surface::WlSurface,
protocol::wl_shm::Format,
};
<span class="kw">use </span>smithay_client_toolkit::shm::multi::MultiPool;
<span class="kw">struct </span>WlFoo {
<span class="comment">// The surface we'll draw on and the index of buffer associated to it
</span>surface: (WlSurface, usize),
pool: MultiPool&lt;(WlSurface, usize)&gt;
}
<span class="kw">impl </span>WlFoo {
<span class="kw">fn </span>draw(<span class="kw-2">&amp;mut </span><span class="self">self</span>, qh: <span class="kw-2">&amp;</span>QueueHandle&lt;WlFoo&gt;) {
<span class="kw">let </span>surface = <span class="kw-2">&amp;</span><span class="self">self</span>.surface.<span class="number">0</span>;
<span class="comment">// We'll increment "i" until the pool can create a new buffer
// if there's no buffer associated with our surface and "i" or if
// a buffer with the obuffer associated with our surface and "i" is free for use.
//
// There's no limit to the amount of buffers we can allocate to our surface but since
// shm buffers are released fairly fast, it's unlikely we'll need more than double buffering.
</span><span class="kw">for </span>i <span class="kw">in </span><span class="number">0</span>..<span class="number">2 </span>{
<span class="self">self</span>.surface.<span class="number">1 </span>= i;
<span class="kw">if let </span><span class="prelude-val">Ok</span>((offset, buffer, slice)) = <span class="self">self</span>.pool.create_buffer(
<span class="number">100</span>,
<span class="number">100 </span>* <span class="number">4</span>,
<span class="number">100</span>,
<span class="kw-2">&amp;</span><span class="self">self</span>.surface,
Format::Argb8888,
) {
<span class="comment">/*
insert drawing code here
*/
</span>surface.attach(<span class="prelude-val">Some</span>(buffer), <span class="number">0</span>, <span class="number">0</span>);
surface.commit();
<span class="comment">// We exit the function after the draw.
</span><span class="kw">return</span>;
}
}
<span class="comment">/*
If there's no buffer available we can for example request a frame callback
and trigger a redraw when it fires.
(not shown in this example)
*/
</span>}
}
<span class="kw">fn </span>draw(slice: <span class="kw-2">&amp;mut </span>[u8]) {
<span class="macro">todo!</span>()
}
</code></pre></div>
</div></details><h2 id="structs" class="section-header">Structs<a href="#structs" class="anchor">§</a></h2><dl class="item-table"><dt><a class="struct" href="struct.BufferSlot.html" title="struct cosmic::cctk::sctk::shm::multi::BufferSlot">Buffer<wbr>Slot</a></dt><dt><a class="struct" href="struct.MultiPool.html" title="struct cosmic::cctk::sctk::shm::multi::MultiPool">Multi<wbr>Pool</a></dt><dd>This pool manages buffers associated with keys.
Only one buffer can be attributed to a given key.</dd></dl><h2 id="enums" class="section-header">Enums<a href="#enums" class="anchor">§</a></h2><dl class="item-table"><dt><a class="enum" href="enum.PoolError.html" title="enum cosmic::cctk::sctk::shm::multi::PoolError">Pool<wbr>Error</a></dt></dl></section></div></main></body></html>