40 lines
1.0 KiB
Rust
40 lines
1.0 KiB
Rust
// SPDX-License-Identifier: GPL-2.0-only
|
|
|
|
use std::io;
|
|
use std::ptr::NonNull;
|
|
|
|
use crate::Wrapper;
|
|
use crate::client::Client;
|
|
use crate::ffi::{wl_resource, wl_resource_create,wl_interface};
|
|
use crate::interface::{WaylandInterface,Interface};
|
|
|
|
pub struct Resource {
|
|
raw: NonNull<wl_resource>,
|
|
}
|
|
impl Resource {
|
|
pub(crate) fn from_raw(raw: *mut wl_resource) -> Option<Self> {
|
|
NonNull::new(raw).map(| raw| Self { raw })
|
|
}
|
|
|
|
pub fn new<I: WaylandInterface>(client: &Client, id: u32, interface: &Interface<I>) -> io::Result<Self> {
|
|
let ptr = unsafe { wl_resource_create(
|
|
client.as_raw_ptr(),
|
|
interface.get_raw().as_ptr(),
|
|
interface.get_raw().read().version,
|
|
id
|
|
)};
|
|
|
|
let Some(raw) = NonNull::new(ptr) else {
|
|
return Err(io::Error::last_os_error());
|
|
};
|
|
Ok(Self { raw })
|
|
}
|
|
}
|
|
impl Wrapper for Resource {
|
|
type T = wl_resource;
|
|
|
|
fn get_raw(&self) -> std::ptr::NonNull<Self::T> {
|
|
self.raw
|
|
}
|
|
}
|