pub struct BorrowedProxyLock<'a> { /* private fields */ }Expand description
A lock that ensures that a UntypedBorrowedProxy is not changed.
You can acquire it by calling proxy::lock.
This lock can be acquired multiple times across multiple threads.
Implementations§
Source§impl BorrowedProxyLock<'_>
impl BorrowedProxyLock<'_>
Sourcepub fn wl_proxy(&self) -> Option<NonNull<wl_proxy>>
pub fn wl_proxy(&self) -> Option<NonNull<wl_proxy>>
Returns the wl_proxy pointer or None if the proxy is destroyed.
If this function returns a pointer, then the pointer will remain valid while the lock is being held.
§Example
use wl_client::test_protocols::core::wl_display::WlDisplay;
let lib = Libwayland::open().unwrap();
let con = lib.connect_to_default_display().unwrap();
let queue = con.create_queue(c"queue name");
let display: WlDisplay = queue.display();
let sync = display.sync();
let lock = proxy::lock(&*sync);
assert!(lock.wl_proxy().is_some());
// This would deadlock.
// proxy::destroy(&sync);Examples found in repository?
examples/async-wait/../common/protocols/wayland/wl_subsurface.rs (line 290)
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-wait/../common/protocols/wayland/wl_fixes.rs (line 165)
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-wait/../common/protocols/xdg_shell/xdg_popup.rs (line 259)
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-wait/../common/protocols/wayland/wl_shell_surface.rs (line 275)
272 pub fn r#move(&self, seat: &WlSeatRef, serial: u32) {
273 let (arg0, arg1) = (seat, serial);
274 let obj0_lock = proxy::lock(arg0);
275 let obj0 = check_argument_proxy("seat", obj0_lock.wl_proxy());
276 let mut args = [wl_argument { o: obj0 }, wl_argument { u: arg1 }];
277 // SAFETY: - self.proxy has the interface INTERFACE
278 // - 1 < INTERFACE.method_count = 10
279 // - the request signature is `ou`
280 unsafe {
281 self.proxy.send_request(1, &mut args);
282 }
283 }
284
285 /// start an interactive resize
286 ///
287 /// Start a pointer-driven resizing of the surface.
288 ///
289 /// This request must be used in response to a button press event.
290 /// The server may ignore resize requests depending on the state of
291 /// the surface (e.g. fullscreen or maximized).
292 ///
293 /// # Arguments
294 ///
295 /// - `seat`: seat whose pointer is used
296 /// - `serial`: serial number of the implicit grab on the pointer
297 /// - `edges`: which edge or corner is being dragged
298 #[inline]
299 pub fn resize(&self, seat: &WlSeatRef, serial: u32, edges: WlShellSurfaceResize) {
300 let (arg0, arg1, arg2) = (seat, serial, edges);
301 let obj0_lock = proxy::lock(arg0);
302 let obj0 = check_argument_proxy("seat", obj0_lock.wl_proxy());
303 let mut args = [
304 wl_argument { o: obj0 },
305 wl_argument { u: arg1 },
306 wl_argument { u: arg2.0 },
307 ];
308 // SAFETY: - self.proxy has the interface INTERFACE
309 // - 2 < INTERFACE.method_count = 10
310 // - the request signature is `ouu`
311 unsafe {
312 self.proxy.send_request(2, &mut args);
313 }
314 }
315
316 /// make the surface a toplevel surface
317 ///
318 /// Map the surface as a toplevel surface.
319 ///
320 /// A toplevel surface is not fullscreen, maximized or transient.
321 #[inline]
322 pub fn set_toplevel(&self) {
323 let mut args = [];
324 // SAFETY: - self.proxy has the interface INTERFACE
325 // - 3 < INTERFACE.method_count = 10
326 // - the request signature is ``
327 unsafe {
328 self.proxy.send_request(3, &mut args);
329 }
330 }
331
332 /// make the surface a transient surface
333 ///
334 /// Map the surface relative to an existing surface.
335 ///
336 /// The x and y arguments specify the location of the upper left
337 /// corner of the surface relative to the upper left corner of the
338 /// parent surface, in surface-local coordinates.
339 ///
340 /// The flags argument controls details of the transient behaviour.
341 ///
342 /// # Arguments
343 ///
344 /// - `parent`: parent surface
345 /// - `x`: surface-local x coordinate
346 /// - `y`: surface-local y coordinate
347 /// - `flags`: transient surface behavior
348 #[inline]
349 pub fn set_transient(
350 &self,
351 parent: &WlSurfaceRef,
352 x: i32,
353 y: i32,
354 flags: WlShellSurfaceTransient,
355 ) {
356 let (arg0, arg1, arg2, arg3) = (parent, x, y, flags);
357 let obj0_lock = proxy::lock(arg0);
358 let obj0 = check_argument_proxy("parent", obj0_lock.wl_proxy());
359 let mut args = [
360 wl_argument { o: obj0 },
361 wl_argument { i: arg1 },
362 wl_argument { i: arg2 },
363 wl_argument { u: arg3.0 },
364 ];
365 // SAFETY: - self.proxy has the interface INTERFACE
366 // - 4 < INTERFACE.method_count = 10
367 // - the request signature is `oiiu`
368 unsafe {
369 self.proxy.send_request(4, &mut args);
370 }
371 }
372
373 /// make the surface a fullscreen surface
374 ///
375 /// Map the surface as a fullscreen surface.
376 ///
377 /// If an output parameter is given then the surface will be made
378 /// fullscreen on that output. If the client does not specify the
379 /// output then the compositor will apply its policy - usually
380 /// choosing the output on which the surface has the biggest surface
381 /// area.
382 ///
383 /// The client may specify a method to resolve a size conflict
384 /// between the output size and the surface size - this is provided
385 /// through the method parameter.
386 ///
387 /// The framerate parameter is used only when the method is set
388 /// to "driver", to indicate the preferred framerate. A value of 0
389 /// indicates that the client does not care about framerate. The
390 /// framerate is specified in mHz, that is framerate of 60000 is 60Hz.
391 ///
392 /// A method of "scale" or "driver" implies a scaling operation of
393 /// the surface, either via a direct scaling operation or a change of
394 /// the output mode. This will override any kind of output scaling, so
395 /// that mapping a surface with a buffer size equal to the mode can
396 /// fill the screen independent of buffer_scale.
397 ///
398 /// A method of "fill" means we don't scale up the buffer, however
399 /// any output scale is applied. This means that you may run into
400 /// an edge case where the application maps a buffer with the same
401 /// size of the output mode but buffer_scale 1 (thus making a
402 /// surface larger than the output). In this case it is allowed to
403 /// downscale the results to fit the screen.
404 ///
405 /// The compositor must reply to this request with a configure event
406 /// with the dimensions for the output on which the surface will
407 /// be made fullscreen.
408 ///
409 /// # Arguments
410 ///
411 /// - `method`: method for resolving size conflict
412 /// - `framerate`: framerate in mHz
413 /// - `output`: output on which the surface is to be fullscreen
414 #[inline]
415 pub fn set_fullscreen(
416 &self,
417 method: WlShellSurfaceFullscreenMethod,
418 framerate: u32,
419 output: Option<&WlOutputRef>,
420 ) {
421 let (arg0, arg1, arg2) = (method, framerate, output);
422 let obj2_lock = arg2.map(|arg2| proxy::lock(arg2));
423 let obj2 = obj2_lock
424 .map(|obj2_lock| check_argument_proxy("output", obj2_lock.wl_proxy()))
425 .unwrap_or(ptr::null_mut());
426 let mut args = [
427 wl_argument { u: arg0.0 },
428 wl_argument { u: arg1 },
429 wl_argument { o: obj2 },
430 ];
431 // SAFETY: - self.proxy has the interface INTERFACE
432 // - 5 < INTERFACE.method_count = 10
433 // - the request signature is `uu?o`
434 unsafe {
435 self.proxy.send_request(5, &mut args);
436 }
437 }
438
439 /// make the surface a popup surface
440 ///
441 /// Map the surface as a popup.
442 ///
443 /// A popup surface is a transient surface with an added pointer
444 /// grab.
445 ///
446 /// An existing implicit grab will be changed to owner-events mode,
447 /// and the popup grab will continue after the implicit grab ends
448 /// (i.e. releasing the mouse button does not cause the popup to
449 /// be unmapped).
450 ///
451 /// The popup grab continues until the window is destroyed or a
452 /// mouse button is pressed in any other client's window. A click
453 /// in any of the client's surfaces is reported as normal, however,
454 /// clicks in other clients' surfaces will be discarded and trigger
455 /// the callback.
456 ///
457 /// The x and y arguments specify the location of the upper left
458 /// corner of the surface relative to the upper left corner of the
459 /// parent surface, in surface-local coordinates.
460 ///
461 /// # Arguments
462 ///
463 /// - `seat`: seat whose pointer is used
464 /// - `serial`: serial number of the implicit grab on the pointer
465 /// - `parent`: parent surface
466 /// - `x`: surface-local x coordinate
467 /// - `y`: surface-local y coordinate
468 /// - `flags`: transient surface behavior
469 #[inline]
470 pub fn set_popup(
471 &self,
472 seat: &WlSeatRef,
473 serial: u32,
474 parent: &WlSurfaceRef,
475 x: i32,
476 y: i32,
477 flags: WlShellSurfaceTransient,
478 ) {
479 let (arg0, arg1, arg2, arg3, arg4, arg5) = (seat, serial, parent, x, y, flags);
480 let obj0_lock = proxy::lock(arg0);
481 let obj0 = check_argument_proxy("seat", obj0_lock.wl_proxy());
482 let obj2_lock = proxy::lock(arg2);
483 let obj2 = check_argument_proxy("parent", obj2_lock.wl_proxy());
484 let mut args = [
485 wl_argument { o: obj0 },
486 wl_argument { u: arg1 },
487 wl_argument { o: obj2 },
488 wl_argument { i: arg3 },
489 wl_argument { i: arg4 },
490 wl_argument { u: arg5.0 },
491 ];
492 // SAFETY: - self.proxy has the interface INTERFACE
493 // - 6 < INTERFACE.method_count = 10
494 // - the request signature is `ouoiiu`
495 unsafe {
496 self.proxy.send_request(6, &mut args);
497 }
498 }
499
500 /// make the surface a maximized surface
501 ///
502 /// Map the surface as a maximized surface.
503 ///
504 /// If an output parameter is given then the surface will be
505 /// maximized on that output. If the client does not specify the
506 /// output then the compositor will apply its policy - usually
507 /// choosing the output on which the surface has the biggest surface
508 /// area.
509 ///
510 /// The compositor will reply with a configure event telling
511 /// the expected new surface size. The operation is completed
512 /// on the next buffer attach to this surface.
513 ///
514 /// A maximized surface typically fills the entire output it is
515 /// bound to, except for desktop elements such as panels. This is
516 /// the main difference between a maximized shell surface and a
517 /// fullscreen shell surface.
518 ///
519 /// The details depend on the compositor implementation.
520 ///
521 /// # Arguments
522 ///
523 /// - `output`: output on which the surface is to be maximized
524 #[inline]
525 pub fn set_maximized(&self, output: Option<&WlOutputRef>) {
526 let (arg0,) = (output,);
527 let obj0_lock = arg0.map(|arg0| proxy::lock(arg0));
528 let obj0 = obj0_lock
529 .map(|obj0_lock| check_argument_proxy("output", obj0_lock.wl_proxy()))
530 .unwrap_or(ptr::null_mut());
531 let mut args = [wl_argument { o: obj0 }];
532 // SAFETY: - self.proxy has the interface INTERFACE
533 // - 7 < INTERFACE.method_count = 10
534 // - the request signature is `?o`
535 unsafe {
536 self.proxy.send_request(7, &mut args);
537 }
538 }examples/async-wait/../common/protocols/xdg_shell/xdg_toplevel.rs (line 335)
331 pub fn set_parent(&self, parent: Option<&XdgToplevelRef>) {
332 let (arg0,) = (parent,);
333 let obj0_lock = arg0.map(|arg0| proxy::lock(arg0));
334 let obj0 = obj0_lock
335 .map(|obj0_lock| check_argument_proxy("parent", obj0_lock.wl_proxy()))
336 .unwrap_or(ptr::null_mut());
337 let mut args = [wl_argument { o: obj0 }];
338 // SAFETY: - self.proxy has the interface INTERFACE
339 // - 1 < INTERFACE.method_count = 14
340 // - the request signature is `?o`
341 unsafe {
342 self.proxy.send_request(1, &mut args);
343 }
344 }
345
346 /// set surface title
347 ///
348 /// Set a short title for the surface.
349 ///
350 /// This string may be used to identify the surface in a task bar,
351 /// window list, or other user interface elements provided by the
352 /// compositor.
353 ///
354 /// The string must be encoded in UTF-8.
355 ///
356 /// # Arguments
357 ///
358 /// - `title`:
359 #[inline]
360 pub fn set_title(&self, title: &str) {
361 let (arg0,) = (title,);
362 with_cstr_cache(|cache| {
363 let str0_offset = cache.len();
364 cache.extend_from_slice(arg0.as_bytes());
365 cache.push(0);
366 let str0 = cache[str0_offset..].as_ptr().cast();
367 let mut args = [wl_argument { s: str0 }];
368 // SAFETY: - self.proxy has the interface INTERFACE
369 // - 2 < INTERFACE.method_count = 14
370 // - the request signature is `s`
371 unsafe {
372 self.proxy.send_request(2, &mut args);
373 }
374 })
375 }
376
377 /// set application ID
378 ///
379 /// Set an application identifier for the surface.
380 ///
381 /// The app ID identifies the general class of applications to which
382 /// the surface belongs. The compositor can use this to group multiple
383 /// surfaces together, or to determine how to launch a new application.
384 ///
385 /// For D-Bus activatable applications, the app ID is used as the D-Bus
386 /// service name.
387 ///
388 /// The compositor shell will try to group application surfaces together
389 /// by their app ID. As a best practice, it is suggested to select app
390 /// ID's that match the basename of the application's .desktop file.
391 /// For example, "org.freedesktop.FooViewer" where the .desktop file is
392 /// "org.freedesktop.FooViewer.desktop".
393 ///
394 /// Like other properties, a set_app_id request can be sent after the
395 /// xdg_toplevel has been mapped to update the property.
396 ///
397 /// See the desktop-entry specification [0] for more details on
398 /// application identifiers and how they relate to well-known D-Bus
399 /// names and .desktop files.
400 ///
401 /// [0] https://standards.freedesktop.org/desktop-entry-spec/
402 ///
403 /// # Arguments
404 ///
405 /// - `app_id`:
406 #[inline]
407 pub fn set_app_id(&self, app_id: &str) {
408 let (arg0,) = (app_id,);
409 with_cstr_cache(|cache| {
410 let str0_offset = cache.len();
411 cache.extend_from_slice(arg0.as_bytes());
412 cache.push(0);
413 let str0 = cache[str0_offset..].as_ptr().cast();
414 let mut args = [wl_argument { s: str0 }];
415 // SAFETY: - self.proxy has the interface INTERFACE
416 // - 3 < INTERFACE.method_count = 14
417 // - the request signature is `s`
418 unsafe {
419 self.proxy.send_request(3, &mut args);
420 }
421 })
422 }
423
424 /// show the window menu
425 ///
426 /// Clients implementing client-side decorations might want to show
427 /// a context menu when right-clicking on the decorations, giving the
428 /// user a menu that they can use to maximize or minimize the window.
429 ///
430 /// This request asks the compositor to pop up such a window menu at
431 /// the given position, relative to the local surface coordinates of
432 /// the parent surface. There are no guarantees as to what menu items
433 /// the window menu contains, or even if a window menu will be drawn
434 /// at all.
435 ///
436 /// This request must be used in response to some sort of user action
437 /// like a button press, key press, or touch down event.
438 ///
439 /// # Arguments
440 ///
441 /// - `seat`: the wl_seat of the user event
442 /// - `serial`: the serial of the user event
443 /// - `x`: the x position to pop up the window menu at
444 /// - `y`: the y position to pop up the window menu at
445 #[inline]
446 pub fn show_window_menu(&self, seat: &WlSeatRef, serial: u32, x: i32, y: i32) {
447 let (arg0, arg1, arg2, arg3) = (seat, serial, x, y);
448 let obj0_lock = proxy::lock(arg0);
449 let obj0 = check_argument_proxy("seat", obj0_lock.wl_proxy());
450 let mut args = [
451 wl_argument { o: obj0 },
452 wl_argument { u: arg1 },
453 wl_argument { i: arg2 },
454 wl_argument { i: arg3 },
455 ];
456 // SAFETY: - self.proxy has the interface INTERFACE
457 // - 4 < INTERFACE.method_count = 14
458 // - the request signature is `ouii`
459 unsafe {
460 self.proxy.send_request(4, &mut args);
461 }
462 }
463
464 /// start an interactive move
465 ///
466 /// Start an interactive, user-driven move of the surface.
467 ///
468 /// This request must be used in response to some sort of user action
469 /// like a button press, key press, or touch down event. The passed
470 /// serial is used to determine the type of interactive move (touch,
471 /// pointer, etc).
472 ///
473 /// The server may ignore move requests depending on the state of
474 /// the surface (e.g. fullscreen or maximized), or if the passed serial
475 /// is no longer valid.
476 ///
477 /// If triggered, the surface will lose the focus of the device
478 /// (wl_pointer, wl_touch, etc) used for the move. It is up to the
479 /// compositor to visually indicate that the move is taking place, such as
480 /// updating a pointer cursor, during the move. There is no guarantee
481 /// that the device focus will return when the move is completed.
482 ///
483 /// # Arguments
484 ///
485 /// - `seat`: the wl_seat of the user event
486 /// - `serial`: the serial of the user event
487 #[inline]
488 pub fn r#move(&self, seat: &WlSeatRef, serial: u32) {
489 let (arg0, arg1) = (seat, serial);
490 let obj0_lock = proxy::lock(arg0);
491 let obj0 = check_argument_proxy("seat", obj0_lock.wl_proxy());
492 let mut args = [wl_argument { o: obj0 }, wl_argument { u: arg1 }];
493 // SAFETY: - self.proxy has the interface INTERFACE
494 // - 5 < INTERFACE.method_count = 14
495 // - the request signature is `ou`
496 unsafe {
497 self.proxy.send_request(5, &mut args);
498 }
499 }
500
501 /// start an interactive resize
502 ///
503 /// Start a user-driven, interactive resize of the surface.
504 ///
505 /// This request must be used in response to some sort of user action
506 /// like a button press, key press, or touch down event. The passed
507 /// serial is used to determine the type of interactive resize (touch,
508 /// pointer, etc).
509 ///
510 /// The server may ignore resize requests depending on the state of
511 /// the surface (e.g. fullscreen or maximized).
512 ///
513 /// If triggered, the client will receive configure events with the
514 /// "resize" state enum value and the expected sizes. See the "resize"
515 /// enum value for more details about what is required. The client
516 /// must also acknowledge configure events using "ack_configure". After
517 /// the resize is completed, the client will receive another "configure"
518 /// event without the resize state.
519 ///
520 /// If triggered, the surface also will lose the focus of the device
521 /// (wl_pointer, wl_touch, etc) used for the resize. It is up to the
522 /// compositor to visually indicate that the resize is taking place,
523 /// such as updating a pointer cursor, during the resize. There is no
524 /// guarantee that the device focus will return when the resize is
525 /// completed.
526 ///
527 /// The edges parameter specifies how the surface should be resized, and
528 /// is one of the values of the resize_edge enum. Values not matching
529 /// a variant of the enum will cause the invalid_resize_edge protocol error.
530 /// The compositor may use this information to update the surface position
531 /// for example when dragging the top left corner. The compositor may also
532 /// use this information to adapt its behavior, e.g. choose an appropriate
533 /// cursor image.
534 ///
535 /// # Arguments
536 ///
537 /// - `seat`: the wl_seat of the user event
538 /// - `serial`: the serial of the user event
539 /// - `edges`: which edge or corner is being dragged
540 #[inline]
541 pub fn resize(&self, seat: &WlSeatRef, serial: u32, edges: XdgToplevelResizeEdge) {
542 let (arg0, arg1, arg2) = (seat, serial, edges);
543 let obj0_lock = proxy::lock(arg0);
544 let obj0 = check_argument_proxy("seat", obj0_lock.wl_proxy());
545 let mut args = [
546 wl_argument { o: obj0 },
547 wl_argument { u: arg1 },
548 wl_argument { u: arg2.0 },
549 ];
550 // SAFETY: - self.proxy has the interface INTERFACE
551 // - 6 < INTERFACE.method_count = 14
552 // - the request signature is `ouu`
553 unsafe {
554 self.proxy.send_request(6, &mut args);
555 }
556 }
557
558 /// set the maximum size
559 ///
560 /// Set a maximum size for the window.
561 ///
562 /// The client can specify a maximum size so that the compositor does
563 /// not try to configure the window beyond this size.
564 ///
565 /// The width and height arguments are in window geometry coordinates.
566 /// See xdg_surface.set_window_geometry.
567 ///
568 /// Values set in this way are double-buffered, see wl_surface.commit.
569 ///
570 /// The compositor can use this information to allow or disallow
571 /// different states like maximize or fullscreen and draw accurate
572 /// animations.
573 ///
574 /// Similarly, a tiling window manager may use this information to
575 /// place and resize client windows in a more effective way.
576 ///
577 /// The client should not rely on the compositor to obey the maximum
578 /// size. The compositor may decide to ignore the values set by the
579 /// client and request a larger size.
580 ///
581 /// If never set, or a value of zero in the request, means that the
582 /// client has no expected maximum size in the given dimension.
583 /// As a result, a client wishing to reset the maximum size
584 /// to an unspecified state can use zero for width and height in the
585 /// request.
586 ///
587 /// Requesting a maximum size to be smaller than the minimum size of
588 /// a surface is illegal and will result in an invalid_size error.
589 ///
590 /// The width and height must be greater than or equal to zero. Using
591 /// strictly negative values for width or height will result in a
592 /// invalid_size error.
593 ///
594 /// # Arguments
595 ///
596 /// - `width`:
597 /// - `height`:
598 #[inline]
599 pub fn set_max_size(&self, width: i32, height: i32) {
600 let (arg0, arg1) = (width, height);
601 let mut args = [wl_argument { i: arg0 }, wl_argument { i: arg1 }];
602 // SAFETY: - self.proxy has the interface INTERFACE
603 // - 7 < INTERFACE.method_count = 14
604 // - the request signature is `ii`
605 unsafe {
606 self.proxy.send_request(7, &mut args);
607 }
608 }
609
610 /// set the minimum size
611 ///
612 /// Set a minimum size for the window.
613 ///
614 /// The client can specify a minimum size so that the compositor does
615 /// not try to configure the window below this size.
616 ///
617 /// The width and height arguments are in window geometry coordinates.
618 /// See xdg_surface.set_window_geometry.
619 ///
620 /// Values set in this way are double-buffered, see wl_surface.commit.
621 ///
622 /// The compositor can use this information to allow or disallow
623 /// different states like maximize or fullscreen and draw accurate
624 /// animations.
625 ///
626 /// Similarly, a tiling window manager may use this information to
627 /// place and resize client windows in a more effective way.
628 ///
629 /// The client should not rely on the compositor to obey the minimum
630 /// size. The compositor may decide to ignore the values set by the
631 /// client and request a smaller size.
632 ///
633 /// If never set, or a value of zero in the request, means that the
634 /// client has no expected minimum size in the given dimension.
635 /// As a result, a client wishing to reset the minimum size
636 /// to an unspecified state can use zero for width and height in the
637 /// request.
638 ///
639 /// Requesting a minimum size to be larger than the maximum size of
640 /// a surface is illegal and will result in an invalid_size error.
641 ///
642 /// The width and height must be greater than or equal to zero. Using
643 /// strictly negative values for width and height will result in a
644 /// invalid_size error.
645 ///
646 /// # Arguments
647 ///
648 /// - `width`:
649 /// - `height`:
650 #[inline]
651 pub fn set_min_size(&self, width: i32, height: i32) {
652 let (arg0, arg1) = (width, height);
653 let mut args = [wl_argument { i: arg0 }, wl_argument { i: arg1 }];
654 // SAFETY: - self.proxy has the interface INTERFACE
655 // - 8 < INTERFACE.method_count = 14
656 // - the request signature is `ii`
657 unsafe {
658 self.proxy.send_request(8, &mut args);
659 }
660 }
661
662 /// maximize the window
663 ///
664 /// Maximize the surface.
665 ///
666 /// After requesting that the surface should be maximized, the compositor
667 /// will respond by emitting a configure event. Whether this configure
668 /// actually sets the window maximized is subject to compositor policies.
669 /// The client must then update its content, drawing in the configured
670 /// state. The client must also acknowledge the configure when committing
671 /// the new content (see ack_configure).
672 ///
673 /// It is up to the compositor to decide how and where to maximize the
674 /// surface, for example which output and what region of the screen should
675 /// be used.
676 ///
677 /// If the surface was already maximized, the compositor will still emit
678 /// a configure event with the "maximized" state.
679 ///
680 /// If the surface is in a fullscreen state, this request has no direct
681 /// effect. It may alter the state the surface is returned to when
682 /// unmaximized unless overridden by the compositor.
683 #[inline]
684 pub fn set_maximized(&self) {
685 let mut args = [];
686 // SAFETY: - self.proxy has the interface INTERFACE
687 // - 9 < INTERFACE.method_count = 14
688 // - the request signature is ``
689 unsafe {
690 self.proxy.send_request(9, &mut args);
691 }
692 }
693
694 /// unmaximize the window
695 ///
696 /// Unmaximize the surface.
697 ///
698 /// After requesting that the surface should be unmaximized, the compositor
699 /// will respond by emitting a configure event. Whether this actually
700 /// un-maximizes the window is subject to compositor policies.
701 /// If available and applicable, the compositor will include the window
702 /// geometry dimensions the window had prior to being maximized in the
703 /// configure event. The client must then update its content, drawing it in
704 /// the configured state. The client must also acknowledge the configure
705 /// when committing the new content (see ack_configure).
706 ///
707 /// It is up to the compositor to position the surface after it was
708 /// unmaximized; usually the position the surface had before maximizing, if
709 /// applicable.
710 ///
711 /// If the surface was already not maximized, the compositor will still
712 /// emit a configure event without the "maximized" state.
713 ///
714 /// If the surface is in a fullscreen state, this request has no direct
715 /// effect. It may alter the state the surface is returned to when
716 /// unmaximized unless overridden by the compositor.
717 #[inline]
718 pub fn unset_maximized(&self) {
719 let mut args = [];
720 // SAFETY: - self.proxy has the interface INTERFACE
721 // - 10 < INTERFACE.method_count = 14
722 // - the request signature is ``
723 unsafe {
724 self.proxy.send_request(10, &mut args);
725 }
726 }
727
728 /// set the window as fullscreen on an output
729 ///
730 /// Make the surface fullscreen.
731 ///
732 /// After requesting that the surface should be fullscreened, the
733 /// compositor will respond by emitting a configure event. Whether the
734 /// client is actually put into a fullscreen state is subject to compositor
735 /// policies. The client must also acknowledge the configure when
736 /// committing the new content (see ack_configure).
737 ///
738 /// The output passed by the request indicates the client's preference as
739 /// to which display it should be set fullscreen on. If this value is NULL,
740 /// it's up to the compositor to choose which display will be used to map
741 /// this surface.
742 ///
743 /// If the surface doesn't cover the whole output, the compositor will
744 /// position the surface in the center of the output and compensate with
745 /// with border fill covering the rest of the output. The content of the
746 /// border fill is undefined, but should be assumed to be in some way that
747 /// attempts to blend into the surrounding area (e.g. solid black).
748 ///
749 /// If the fullscreened surface is not opaque, the compositor must make
750 /// sure that other screen content not part of the same surface tree (made
751 /// up of subsurfaces, popups or similarly coupled surfaces) are not
752 /// visible below the fullscreened surface.
753 ///
754 /// # Arguments
755 ///
756 /// - `output`:
757 #[inline]
758 pub fn set_fullscreen(&self, output: Option<&WlOutputRef>) {
759 let (arg0,) = (output,);
760 let obj0_lock = arg0.map(|arg0| proxy::lock(arg0));
761 let obj0 = obj0_lock
762 .map(|obj0_lock| check_argument_proxy("output", obj0_lock.wl_proxy()))
763 .unwrap_or(ptr::null_mut());
764 let mut args = [wl_argument { o: obj0 }];
765 // SAFETY: - self.proxy has the interface INTERFACE
766 // - 11 < INTERFACE.method_count = 14
767 // - the request signature is `?o`
768 unsafe {
769 self.proxy.send_request(11, &mut args);
770 }
771 }examples/async-wait/../common/protocols/wayland/wl_surface.rs (line 431)
427 pub fn attach(&self, buffer: Option<&WlBufferRef>, x: i32, y: i32) {
428 let (arg0, arg1, arg2) = (buffer, x, y);
429 let obj0_lock = arg0.map(|arg0| proxy::lock(arg0));
430 let obj0 = obj0_lock
431 .map(|obj0_lock| check_argument_proxy("buffer", obj0_lock.wl_proxy()))
432 .unwrap_or(ptr::null_mut());
433 let mut args = [
434 wl_argument { o: obj0 },
435 wl_argument { i: arg1 },
436 wl_argument { i: arg2 },
437 ];
438 // SAFETY: - self.proxy has the interface INTERFACE
439 // - 1 < INTERFACE.method_count = 11
440 // - the request signature is `?oii`
441 unsafe {
442 self.proxy.send_request(1, &mut args);
443 }
444 }
445
446 /// mark part of the surface damaged
447 ///
448 /// This request is used to describe the regions where the pending
449 /// buffer is different from the current surface contents, and where
450 /// the surface therefore needs to be repainted. The compositor
451 /// ignores the parts of the damage that fall outside of the surface.
452 ///
453 /// Damage is double-buffered state, see wl_surface.commit.
454 ///
455 /// The damage rectangle is specified in surface-local coordinates,
456 /// where x and y specify the upper left corner of the damage rectangle.
457 ///
458 /// The initial value for pending damage is empty: no damage.
459 /// wl_surface.damage adds pending damage: the new pending damage
460 /// is the union of old pending damage and the given rectangle.
461 ///
462 /// wl_surface.commit assigns pending damage as the current damage,
463 /// and clears pending damage. The server will clear the current
464 /// damage as it repaints the surface.
465 ///
466 /// Note! New clients should not use this request. Instead damage can be
467 /// posted with wl_surface.damage_buffer which uses buffer coordinates
468 /// instead of surface coordinates.
469 ///
470 /// # Arguments
471 ///
472 /// - `x`: surface-local x coordinate
473 /// - `y`: surface-local y coordinate
474 /// - `width`: width of damage rectangle
475 /// - `height`: height of damage rectangle
476 #[inline]
477 pub fn damage(&self, x: i32, y: i32, width: i32, height: i32) {
478 let (arg0, arg1, arg2, arg3) = (x, y, width, height);
479 let mut args = [
480 wl_argument { i: arg0 },
481 wl_argument { i: arg1 },
482 wl_argument { i: arg2 },
483 wl_argument { i: arg3 },
484 ];
485 // SAFETY: - self.proxy has the interface INTERFACE
486 // - 2 < INTERFACE.method_count = 11
487 // - the request signature is `iiii`
488 unsafe {
489 self.proxy.send_request(2, &mut args);
490 }
491 }
492
493 /// request a frame throttling hint
494 ///
495 /// Request a notification when it is a good time to start drawing a new
496 /// frame, by creating a frame callback. This is useful for throttling
497 /// redrawing operations, and driving animations.
498 ///
499 /// When a client is animating on a wl_surface, it can use the 'frame'
500 /// request to get notified when it is a good time to draw and commit the
501 /// next frame of animation. If the client commits an update earlier than
502 /// that, it is likely that some updates will not make it to the display,
503 /// and the client is wasting resources by drawing too often.
504 ///
505 /// The frame request will take effect on the next wl_surface.commit.
506 /// The notification will only be posted for one frame unless
507 /// requested again. For a wl_surface, the notifications are posted in
508 /// the order the frame requests were committed.
509 ///
510 /// The server must send the notifications so that a client
511 /// will not send excessive updates, while still allowing
512 /// the highest possible update rate for clients that wait for the reply
513 /// before drawing again. The server should give some time for the client
514 /// to draw and commit after sending the frame callback events to let it
515 /// hit the next output refresh.
516 ///
517 /// A server should avoid signaling the frame callbacks if the
518 /// surface is not visible in any way, e.g. the surface is off-screen,
519 /// or completely obscured by other opaque surfaces.
520 ///
521 /// The object returned by this request will be destroyed by the
522 /// compositor after the callback is fired and as such the client must not
523 /// attempt to use it after that point.
524 ///
525 /// The callback_data passed in the callback is the current time, in
526 /// milliseconds, with an undefined base.
527 ///
528 /// # Arguments
529 ///
530 /// - `_queue`: The queue that the returned proxy is assigned to.
531 #[inline]
532 pub fn frame(&self, _queue: &Queue) -> WlCallback {
533 let mut args = [wl_argument { n: 0 }];
534 // SAFETY: - self.proxy has the interface INTERFACE
535 // - 3 < INTERFACE.method_count = 11
536 // - the request signature is `n`
537 // - OwnedProxy::WL_INTERFACE is always a valid interface
538 let data = unsafe {
539 self.proxy
540 .send_constructor(_queue, 3, &mut args, WlCallback::WL_INTERFACE, None)
541 };
542 // SAFETY: data has the interface WlCallback::WL_INTERFACE
543 unsafe { proxy::low_level::from_untyped_owned(data) }
544 }
545
546 /// set opaque region
547 ///
548 /// This request sets the region of the surface that contains
549 /// opaque content.
550 ///
551 /// The opaque region is an optimization hint for the compositor
552 /// that lets it optimize the redrawing of content behind opaque
553 /// regions. Setting an opaque region is not required for correct
554 /// behaviour, but marking transparent content as opaque will result
555 /// in repaint artifacts.
556 ///
557 /// The opaque region is specified in surface-local coordinates.
558 ///
559 /// The compositor ignores the parts of the opaque region that fall
560 /// outside of the surface.
561 ///
562 /// Opaque region is double-buffered state, see wl_surface.commit.
563 ///
564 /// wl_surface.set_opaque_region changes the pending opaque region.
565 /// wl_surface.commit copies the pending region to the current region.
566 /// Otherwise, the pending and current regions are never changed.
567 ///
568 /// The initial value for an opaque region is empty. Setting the pending
569 /// opaque region has copy semantics, and the wl_region object can be
570 /// destroyed immediately. A NULL wl_region causes the pending opaque
571 /// region to be set to empty.
572 ///
573 /// # Arguments
574 ///
575 /// - `region`: opaque region of the surface
576 #[inline]
577 pub fn set_opaque_region(&self, region: Option<&WlRegionRef>) {
578 let (arg0,) = (region,);
579 let obj0_lock = arg0.map(|arg0| proxy::lock(arg0));
580 let obj0 = obj0_lock
581 .map(|obj0_lock| check_argument_proxy("region", obj0_lock.wl_proxy()))
582 .unwrap_or(ptr::null_mut());
583 let mut args = [wl_argument { o: obj0 }];
584 // SAFETY: - self.proxy has the interface INTERFACE
585 // - 4 < INTERFACE.method_count = 11
586 // - the request signature is `?o`
587 unsafe {
588 self.proxy.send_request(4, &mut args);
589 }
590 }
591
592 /// set input region
593 ///
594 /// This request sets the region of the surface that can receive
595 /// pointer and touch events.
596 ///
597 /// Input events happening outside of this region will try the next
598 /// surface in the server surface stack. The compositor ignores the
599 /// parts of the input region that fall outside of the surface.
600 ///
601 /// The input region is specified in surface-local coordinates.
602 ///
603 /// Input region is double-buffered state, see wl_surface.commit.
604 ///
605 /// wl_surface.set_input_region changes the pending input region.
606 /// wl_surface.commit copies the pending region to the current region.
607 /// Otherwise the pending and current regions are never changed,
608 /// except cursor and icon surfaces are special cases, see
609 /// wl_pointer.set_cursor and wl_data_device.start_drag.
610 ///
611 /// The initial value for an input region is infinite. That means the
612 /// whole surface will accept input. Setting the pending input region
613 /// has copy semantics, and the wl_region object can be destroyed
614 /// immediately. A NULL wl_region causes the input region to be set
615 /// to infinite.
616 ///
617 /// # Arguments
618 ///
619 /// - `region`: input region of the surface
620 #[inline]
621 pub fn set_input_region(&self, region: Option<&WlRegionRef>) {
622 let (arg0,) = (region,);
623 let obj0_lock = arg0.map(|arg0| proxy::lock(arg0));
624 let obj0 = obj0_lock
625 .map(|obj0_lock| check_argument_proxy("region", obj0_lock.wl_proxy()))
626 .unwrap_or(ptr::null_mut());
627 let mut args = [wl_argument { o: obj0 }];
628 // SAFETY: - self.proxy has the interface INTERFACE
629 // - 5 < INTERFACE.method_count = 11
630 // - the request signature is `?o`
631 unsafe {
632 self.proxy.send_request(5, &mut args);
633 }
634 }Additional examples can be found in:
- examples/async-wait/../common/protocols/wayland/wl_data_device_manager.rs
- examples/async-wait/../common/protocols/viewporter/wp_viewporter.rs
- examples/async-wait/../common/protocols/xdg_shell/xdg_wm_base.rs
- examples/async-wait/../common/protocols/tablet_v2/zwp_tablet_manager_v2.rs
- examples/async-wait/../common/protocols/wayland/wl_shell.rs
- examples/async-wait/../common/protocols/tablet_v2/zwp_tablet_tool_v2.rs
- examples/async-wait/../common/protocols/wayland/wl_pointer.rs
- examples/async-wait/../common/protocols/cursor_shape_v1/wp_cursor_shape_manager_v1.rs
- examples/async-wait/../common/protocols/wayland/wl_subcompositor.rs
- examples/async-wait/../common/protocols/xdg_shell/xdg_surface.rs
- examples/async-wait/../common/protocols/wayland/wl_data_device.rs
Auto Trait Implementations§
impl<'a> Freeze for BorrowedProxyLock<'a>
impl<'a> !RefUnwindSafe for BorrowedProxyLock<'a>
impl<'a> !Send for BorrowedProxyLock<'a>
impl<'a> Sync for BorrowedProxyLock<'a>
impl<'a> Unpin for BorrowedProxyLock<'a>
impl<'a> !UnwindSafe for BorrowedProxyLock<'a>
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
Mutably borrows from an owned value. Read more