pub fn lock(proxy: &impl UntypedBorrowedProxyWrapper) -> BorrowedProxyLock<'_>Expand description
Locks the proxy for concurrent destruction.
If the proxy is not already destroyed, holding this lock will prevent other threads from destroying it.
Trying to destroy the proxy from this thread while holding this lock will deadlock.
This lock only locks out concurrent destruction. Multiple threads can acquire this lock at the same time.
ยงExample
let lib = Libwayland::open().unwrap();
let con = lib.connect_to_default_display().unwrap();
let queue = con.create_queue(c"");
let display: WlDisplay = queue.display();
// Create a wl_callback that we will destroy in another thread.
let sync1 = display.sync();
let sync2 = sync1.clone();
// Lock the proxy to prevent the other thread from destroying it.
let lock = proxy::lock(&*sync1);
// Create a barrier to synchronize with the other thread.
let barrier1 = Arc::new(Barrier::new(2));
let barrier2 = barrier1.clone();
thread::spawn(move || {
// This will block until the main thread has released the lock.
proxy::destroy(&sync2);
barrier2.wait();
});
// Sleep for a second to demonstrate that the proxy::destroy does in fact not proceed.
thread::sleep(Duration::from_secs(1));
// The other spawned thread has not yet destroyed the proxy.
assert!(lock.wl_proxy().is_some());
// Drop the lock to let the other thread proceed.
drop(lock);
// Wait for the other thread to run to completion.
barrier1.wait();
// The proxy is now destroyed.
assert!(proxy::wl_proxy(&*sync1).is_none());Examples found in repository?
examples/async-window/../common/protocols/wayland/wl_subsurface.rs (line 289)
287 pub fn place_above(&self, sibling: &WlSurfaceRef) {
288 let (arg0,) = (sibling,);
289 let obj0_lock = proxy::lock(arg0);
290 let obj0 = check_argument_proxy("sibling", obj0_lock.wl_proxy());
291 let mut args = [wl_argument { o: obj0 }];
292 // SAFETY: - self.proxy has the interface INTERFACE
293 // - 2 < INTERFACE.method_count = 6
294 // - the request signature is `o`
295 unsafe {
296 self.proxy.send_request(2, &mut args);
297 }
298 }
299
300 /// restack the sub-surface
301 ///
302 /// The sub-surface is placed just below the reference surface.
303 /// See wl_subsurface.place_above.
304 ///
305 /// # Arguments
306 ///
307 /// - `sibling`: the reference surface
308 #[inline]
309 pub fn place_below(&self, sibling: &WlSurfaceRef) {
310 let (arg0,) = (sibling,);
311 let obj0_lock = proxy::lock(arg0);
312 let obj0 = check_argument_proxy("sibling", obj0_lock.wl_proxy());
313 let mut args = [wl_argument { o: obj0 }];
314 // SAFETY: - self.proxy has the interface INTERFACE
315 // - 3 < INTERFACE.method_count = 6
316 // - the request signature is `o`
317 unsafe {
318 self.proxy.send_request(3, &mut args);
319 }
320 }More examples
examples/async-window/../common/protocols_data/wayland/wl_subsurface.rs (line 289)
287 pub fn place_above(&self, sibling: &WlSurfaceRef) {
288 let (arg0,) = (sibling,);
289 let obj0_lock = proxy::lock(arg0);
290 let obj0 = check_argument_proxy("sibling", obj0_lock.wl_proxy());
291 let mut args = [wl_argument { o: obj0 }];
292 // SAFETY: - self.proxy has the interface INTERFACE
293 // - 2 < INTERFACE.method_count = 6
294 // - the request signature is `o`
295 unsafe {
296 self.proxy.send_request(2, &mut args);
297 }
298 }
299
300 /// restack the sub-surface
301 ///
302 /// The sub-surface is placed just below the reference surface.
303 /// See wl_subsurface.place_above.
304 ///
305 /// # Arguments
306 ///
307 /// - `sibling`: the reference surface
308 #[inline]
309 pub fn place_below(&self, sibling: &WlSurfaceRef) {
310 let (arg0,) = (sibling,);
311 let obj0_lock = proxy::lock(arg0);
312 let obj0 = check_argument_proxy("sibling", obj0_lock.wl_proxy());
313 let mut args = [wl_argument { o: obj0 }];
314 // SAFETY: - self.proxy has the interface INTERFACE
315 // - 3 < INTERFACE.method_count = 6
316 // - the request signature is `o`
317 unsafe {
318 self.proxy.send_request(3, &mut args);
319 }
320 }examples/async-window/../common/protocols/wayland/wl_fixes.rs (line 164)
162 pub fn destroy_registry(&self, registry: &WlRegistryRef) {
163 let (arg0,) = (registry,);
164 let obj0_lock = proxy::lock(arg0);
165 let obj0 = check_argument_proxy("registry", obj0_lock.wl_proxy());
166 let mut args = [wl_argument { o: obj0 }];
167 // SAFETY: - self.proxy has the interface INTERFACE
168 // - 1 < INTERFACE.method_count = 2
169 // - the request signature is `o`
170 unsafe {
171 self.proxy.send_request(1, &mut args);
172 }
173 }examples/async-window/../common/protocols_data/wayland/wl_fixes.rs (line 164)
162 pub fn destroy_registry(&self, registry: &WlRegistryRef) {
163 let (arg0,) = (registry,);
164 let obj0_lock = proxy::lock(arg0);
165 let obj0 = check_argument_proxy("registry", obj0_lock.wl_proxy());
166 let mut args = [wl_argument { o: obj0 }];
167 // SAFETY: - self.proxy has the interface INTERFACE
168 // - 1 < INTERFACE.method_count = 2
169 // - the request signature is `o`
170 unsafe {
171 self.proxy.send_request(1, &mut args);
172 }
173 }examples/async-window/../common/protocols/xdg_shell/xdg_popup.rs (line 258)
256 pub fn grab(&self, seat: &WlSeatRef, serial: u32) {
257 let (arg0, arg1) = (seat, serial);
258 let obj0_lock = proxy::lock(arg0);
259 let obj0 = check_argument_proxy("seat", obj0_lock.wl_proxy());
260 let mut args = [wl_argument { o: obj0 }, wl_argument { u: arg1 }];
261 // SAFETY: - self.proxy has the interface INTERFACE
262 // - 1 < INTERFACE.method_count = 3
263 // - the request signature is `ou`
264 unsafe {
265 self.proxy.send_request(1, &mut args);
266 }
267 }
268
269 /// recalculate the popup's location
270 ///
271 /// Reposition an already-mapped popup. The popup will be placed given the
272 /// details in the passed xdg_positioner object, and a
273 /// xdg_popup.repositioned followed by xdg_popup.configure and
274 /// xdg_surface.configure will be emitted in response. Any parameters set
275 /// by the previous positioner will be discarded.
276 ///
277 /// The passed token will be sent in the corresponding
278 /// xdg_popup.repositioned event. The new popup position will not take
279 /// effect until the corresponding configure event is acknowledged by the
280 /// client. See xdg_popup.repositioned for details. The token itself is
281 /// opaque, and has no other special meaning.
282 ///
283 /// If multiple reposition requests are sent, the compositor may skip all
284 /// but the last one.
285 ///
286 /// If the popup is repositioned in response to a configure event for its
287 /// parent, the client should send an xdg_positioner.set_parent_configure
288 /// and possibly an xdg_positioner.set_parent_size request to allow the
289 /// compositor to properly constrain the popup.
290 ///
291 /// If the popup is repositioned together with a parent that is being
292 /// resized, but not in response to a configure event, the client should
293 /// send an xdg_positioner.set_parent_size request.
294 ///
295 /// # Arguments
296 ///
297 /// - `positioner`:
298 /// - `token`: reposition request token
299 #[inline]
300 pub fn reposition(&self, positioner: &XdgPositionerRef, token: u32) {
301 let (arg0, arg1) = (positioner, token);
302 let obj0_lock = proxy::lock(arg0);
303 let obj0 = check_argument_proxy("positioner", obj0_lock.wl_proxy());
304 let mut args = [wl_argument { o: obj0 }, wl_argument { u: arg1 }];
305 // SAFETY: - self.proxy has the interface INTERFACE
306 // - 2 < INTERFACE.method_count = 3
307 // - the request signature is `ou`
308 unsafe {
309 self.proxy.send_request(2, &mut args);
310 }
311 }examples/async-window/../common/protocols_data/xdg_shell/xdg_popup.rs (line 258)
256 pub fn grab(&self, seat: &WlSeatRef, serial: u32) {
257 let (arg0, arg1) = (seat, serial);
258 let obj0_lock = proxy::lock(arg0);
259 let obj0 = check_argument_proxy("seat", obj0_lock.wl_proxy());
260 let mut args = [wl_argument { o: obj0 }, wl_argument { u: arg1 }];
261 // SAFETY: - self.proxy has the interface INTERFACE
262 // - 1 < INTERFACE.method_count = 3
263 // - the request signature is `ou`
264 unsafe {
265 self.proxy.send_request(1, &mut args);
266 }
267 }
268
269 /// recalculate the popup's location
270 ///
271 /// Reposition an already-mapped popup. The popup will be placed given the
272 /// details in the passed xdg_positioner object, and a
273 /// xdg_popup.repositioned followed by xdg_popup.configure and
274 /// xdg_surface.configure will be emitted in response. Any parameters set
275 /// by the previous positioner will be discarded.
276 ///
277 /// The passed token will be sent in the corresponding
278 /// xdg_popup.repositioned event. The new popup position will not take
279 /// effect until the corresponding configure event is acknowledged by the
280 /// client. See xdg_popup.repositioned for details. The token itself is
281 /// opaque, and has no other special meaning.
282 ///
283 /// If multiple reposition requests are sent, the compositor may skip all
284 /// but the last one.
285 ///
286 /// If the popup is repositioned in response to a configure event for its
287 /// parent, the client should send an xdg_positioner.set_parent_configure
288 /// and possibly an xdg_positioner.set_parent_size request to allow the
289 /// compositor to properly constrain the popup.
290 ///
291 /// If the popup is repositioned together with a parent that is being
292 /// resized, but not in response to a configure event, the client should
293 /// send an xdg_positioner.set_parent_size request.
294 ///
295 /// # Arguments
296 ///
297 /// - `positioner`:
298 /// - `token`: reposition request token
299 #[inline]
300 pub fn reposition(&self, positioner: &XdgPositionerRef, token: u32) {
301 let (arg0, arg1) = (positioner, token);
302 let obj0_lock = proxy::lock(arg0);
303 let obj0 = check_argument_proxy("positioner", obj0_lock.wl_proxy());
304 let mut args = [wl_argument { o: obj0 }, wl_argument { u: arg1 }];
305 // SAFETY: - self.proxy has the interface INTERFACE
306 // - 2 < INTERFACE.method_count = 3
307 // - the request signature is `ou`
308 unsafe {
309 self.proxy.send_request(2, &mut args);
310 }
311 }Additional examples can be found in:
- examples/async-window/../common/protocols/wayland/wl_shell_surface.rs
- examples/async-window/../common/protocols_data/wayland/wl_shell_surface.rs
- examples/async-window/../common/protocols/xdg_shell/xdg_toplevel.rs
- examples/async-window/../common/protocols_data/xdg_shell/xdg_toplevel.rs
- examples/async-window/../common/protocols/wayland/wl_surface.rs
- examples/async-window/../common/protocols_data/wayland/wl_surface.rs
- examples/async-window/../common/protocols/wayland/wl_data_device_manager.rs
- examples/async-window/../common/protocols_data/wayland/wl_data_device_manager.rs
- examples/async-window/../common/protocols/viewporter/wp_viewporter.rs
- examples/async-window/../common/protocols_data/viewporter/wp_viewporter.rs
- examples/async-window/../common/protocols/xdg_shell/xdg_wm_base.rs
- examples/async-window/../common/protocols_data/xdg_shell/xdg_wm_base.rs
- examples/async-window/../common/protocols/tablet_v2/zwp_tablet_manager_v2.rs
- examples/async-window/../common/protocols_data/tablet_v2/zwp_tablet_manager_v2.rs
- examples/async-window/../common/protocols/wayland/wl_shell.rs
- examples/async-window/../common/protocols_data/wayland/wl_shell.rs
- examples/async-window/../common/protocols/tablet_v2/zwp_tablet_tool_v2.rs
- examples/async-window/../common/protocols/wayland/wl_pointer.rs
- examples/async-window/../common/protocols_data/tablet_v2/zwp_tablet_tool_v2.rs
- examples/async-window/../common/protocols_data/wayland/wl_pointer.rs
- examples/async-window/../common/protocols/cursor_shape_v1/wp_cursor_shape_manager_v1.rs
- examples/async-window/../common/protocols_data/cursor_shape_v1/wp_cursor_shape_manager_v1.rs
- examples/async-window/../common/protocols/wayland/wl_subcompositor.rs
- examples/async-window/../common/protocols_data/wayland/wl_subcompositor.rs
- examples/async-window/../common/protocols/xdg_shell/xdg_surface.rs
- examples/async-window/../common/protocols_data/xdg_shell/xdg_surface.rs
- examples/async-window/../common/protocols/wayland/wl_data_device.rs
- examples/async-window/../common/protocols_data/wayland/wl_data_device.rs