struct ShmSurface {
shmseg: u32,
addr: *mut u8,
size: usize,
width: u16,
height: u16,
stride: usize,
}Expand description
A shared-memory image surface: a POSIX shm segment mapped into both this process and the
X server, into which shm_get_image writes one BGRA frame.
Both ends map the same physical pages, which is the whole point: a full-screen grab then costs no
per-frame copy across the X socket, because the server’s blit lands directly in memory the
capture thread already reads. The surface owns the server-side segment id (shmseg), the local
mapping (addr / size), and the geometry (width / height / stride) needed to interpret
the bytes.
Fields§
§shmseg: u32§addr: *mut u8§size: usize§width: u16§height: u16§stride: usizeImplementations§
Source§impl ShmSurface
impl ShmSurface
Sourcefn create(
conn: &RustConnection,
width: u16,
height: u16,
) -> Result<Self, String>
fn create( conn: &RustConnection, width: u16, height: u16, ) -> Result<Self, String>
Allocate a shm segment of width*height*4 bytes, attach it both locally and to the X
server, and hand back a surface both ends can read.
The segment is created with shmget(IPC_PRIVATE) and mapped locally via shmat, then
attached on the server (shm_attach). That attach is confirmed with a round-trip check()
BEFORE the segment is marked IPC_RMID: deleting only after both ends hold a reference means
the kernel frees the segment once this process and the server have both detached, never while
either still needs it. Every failure path unwinds the partial state (local detach and/or
IPC_RMID) so a failed allocation leaks neither memory nor a server attachment; a zero-sized
request is rejected up front.
Sourcefn as_mut_slice(&mut self) -> &mut [u8] ⓘ
fn as_mut_slice(&mut self) -> &mut [u8] ⓘ
Borrow the mapped segment as a mutable byte slice for the capture blit and overlays.
Sourcefn as_slice(&self) -> &[u8] ⓘ
fn as_slice(&self) -> &[u8] ⓘ
Borrow the mapped segment read-only, for the stability comparison.
Sourcefn destroy(&mut self, conn: &RustConnection)
fn destroy(&mut self, conn: &RustConnection)
Detach the segment from the X server and then locally, clearing the mapped pointer.
This is a manual method rather than a Drop impl because releasing the server-side
attachment is an X protocol request that needs the live connection, which a Drop could not
reach; the owner of the connection must call it before the surface is dropped. The order —
server shm_detach first, then the local shmdt — completes the release of the segment that
was marked IPC_RMID at creation, so the kernel reclaims it once neither end holds it.
Auto Trait Implementations§
impl !Send for ShmSurface
impl !Sync for ShmSurface
impl Freeze for ShmSurface
impl RefUnwindSafe for ShmSurface
impl Unpin for ShmSurface
impl UnsafeUnpin for ShmSurface
impl UnwindSafe for ShmSurface
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more