Trait wayland_backend::sys::server::GlobalHandler
source · pub trait GlobalHandler<D>: DowncastSync {
fn bind(
self: Arc<Self>,
handle: &Handle,
data: &mut D,
client_id: ClientId,
global_id: GlobalId,
object_id: ObjectId
) -> Arc<dyn ObjectData<D>>;
fn can_view(
&self,
_client_id: ClientId,
_client_data: &Arc<dyn ClientData>,
_global_id: GlobalId
) -> bool { ... }
fn debug(&self, f: &mut Formatter<'_>) -> Result { ... }
}
client_system
or server_system
) and crate feature server_system
only.Expand description
A trait representing the handling of new bound globals
Required Methods§
Provided Methods§
sourcefn can_view(
&self,
_client_id: ClientId,
_client_data: &Arc<dyn ClientData>,
_global_id: GlobalId
) -> bool
fn can_view(
&self,
_client_id: ClientId,
_client_data: &Arc<dyn ClientData>,
_global_id: GlobalId
) -> bool
Check if given client is allowed to interact with given global
If this function returns false, the client will not be notified of the existence of this global, and any attempt to bind it will result in a protocol error as if the global did not exist.
Default implementation always return true.
Examples found in repository?
1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372
unsafe extern "C" fn global_filter<D: 'static>(
client: *const wl_client,
global: *const wl_global,
_: *mut c_void,
) -> bool {
if !HANDLE.is_set() {
// This happens if we are invoked during the global shutdown
// at this point, we really don't care what we send to clients,
// the compositor is shutting down anyway so they're all going to be killed
// thus return false, so that nothing is sent to anybody
return false;
}
// Safety: skip processing globals that do not belong to us
let is_known_global = HANDLE.with(|&(ref state_arc, _)| {
let guard = state_arc.lock().unwrap();
guard.is_known_global(global)
});
if !is_known_global {
return true;
}
// Safety: if we are invoked here, the client is a valid client initialized by us
let client_udata = match unsafe { client_user_data(client as *mut _) } {
Some(id) => unsafe { &*id },
None => return false,
};
let client_id = InnerClientId { ptr: client as *mut _, alive: client_udata.alive.clone() };
// Safety: if we are invoked here, the global is a global client initialized by us
let global_udata = unsafe {
&*(ffi_dispatch!(WAYLAND_SERVER_HANDLE, wl_global_get_user_data, global)
as *mut GlobalUserData<D>)
};
let global_id =
InnerGlobalId { ptr: global as *mut wl_global, alive: global_udata.alive.clone() };
global_udata.handler.can_view(
ClientId { id: client_id },
&client_udata.data,
GlobalId { id: global_id },
)
}
Implementations§
source§impl<D> dyn GlobalHandler<D>where
D: Any + 'static,
impl<D> dyn GlobalHandler<D>where
D: Any + 'static,
sourcepub fn is<__T: GlobalHandler<D>>(&self) -> bool
pub fn is<__T: GlobalHandler<D>>(&self) -> bool
Returns true if the trait object wraps an object of type __T
.
sourcepub fn downcast<__T: GlobalHandler<D>>(
self: Box<Self>
) -> Result<Box<__T>, Box<Self>>
pub fn downcast<__T: GlobalHandler<D>>(
self: Box<Self>
) -> Result<Box<__T>, Box<Self>>
Returns a boxed object from a boxed trait object if the underlying object is of type
__T
. Returns the original boxed trait if it isn’t.
sourcepub fn downcast_rc<__T: GlobalHandler<D>>(
self: Rc<Self>
) -> Result<Rc<__T>, Rc<Self>>
pub fn downcast_rc<__T: GlobalHandler<D>>(
self: Rc<Self>
) -> Result<Rc<__T>, Rc<Self>>
Returns an Rc
-ed object from an Rc
-ed trait object if the underlying object is of
type __T
. Returns the original Rc
-ed trait if it isn’t.
sourcepub fn downcast_ref<__T: GlobalHandler<D>>(&self) -> Option<&__T>
pub fn downcast_ref<__T: GlobalHandler<D>>(&self) -> Option<&__T>
Returns a reference to the object within the trait object if it is of type __T
, or
None
if it isn’t.
sourcepub fn downcast_mut<__T: GlobalHandler<D>>(&mut self) -> Option<&mut __T>
pub fn downcast_mut<__T: GlobalHandler<D>>(&mut self) -> Option<&mut __T>
Returns a mutable reference to the object within the trait object if it is of type
__T
, or None
if it isn’t.
sourcepub fn downcast_arc<__T>(self: Arc<Self>) -> Result<Arc<__T>, Arc<Self>>where
__T: Any + Send + Sync + GlobalHandler<D>,
pub fn downcast_arc<__T>(self: Arc<Self>) -> Result<Arc<__T>, Arc<Self>>where
__T: Any + Send + Sync + GlobalHandler<D>,
Returns an Arc
-ed object from an Arc
-ed trait object if the underlying object is of
type __T
. Returns the original Arc
-ed trait if it isn’t.