Merge pull request #259 from PolyMeilex/debug

Implement Debug trait for some public types
This commit is contained in:
Victor Berger 2021-02-26 10:46:01 +01:00 committed by GitHub
commit 7bbd284f0b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
40 changed files with 378 additions and 25 deletions

View File

@ -20,6 +20,7 @@
use std::cell::RefCell; use std::cell::RefCell;
use std::collections::HashMap; use std::collections::HashMap;
use std::fmt;
use std::os::unix::io::{AsRawFd, RawFd}; use std::os::unix::io::{AsRawFd, RawFd};
use std::rc::Rc; use std::rc::Rc;
use std::sync::{ use std::sync::{
@ -59,6 +60,25 @@ pub struct AtomicDrmDevice<A: AsRawFd + 'static> {
logger: ::slog::Logger, logger: ::slog::Logger,
} }
// DeviceHandler does not implement Debug, so we have to impl Debug manually
impl<A: AsRawFd + fmt::Debug + 'static> fmt::Debug for AtomicDrmDevice<A> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut debug = f.debug_struct("AtomicDrmDevice");
debug
.field("dev", &self.dev)
.field("dev_id", &self.dev_id)
.field("active", &self.active)
.field("backends", &self.backends)
.field("handler", &"...");
#[cfg(feature = "backend_session")]
debug.field("links", &self.links);
debug.field("logger", &self.logger).finish()
}
}
type OldState = ( type OldState = (
Vec<(connector::Handle, PropertyValueSet)>, Vec<(connector::Handle, PropertyValueSet)>,
Vec<(crtc::Handle, PropertyValueSet)>, Vec<(crtc::Handle, PropertyValueSet)>,
@ -73,6 +93,7 @@ type Mapping = (
HashMap<plane::Handle, HashMap<String, property::Handle>>, HashMap<plane::Handle, HashMap<String, property::Handle>>,
); );
#[derive(Debug)]
pub(in crate::backend::drm) struct Dev<A: AsRawFd + 'static> { pub(in crate::backend::drm) struct Dev<A: AsRawFd + 'static> {
fd: A, fd: A,
privileged: bool, privileged: bool,

View File

@ -25,6 +25,7 @@ use crate::{
/// [`SessionObserver`](SessionObserver) /// [`SessionObserver`](SessionObserver)
/// linked to the [`AtomicDrmDevice`](AtomicDrmDevice) /// linked to the [`AtomicDrmDevice`](AtomicDrmDevice)
/// it was created from. /// it was created from.
#[derive(Debug)]
pub struct AtomicDrmDeviceObserver<A: AsRawFd + 'static> { pub struct AtomicDrmDeviceObserver<A: AsRawFd + 'static> {
dev: WeakArc<Dev<A>>, dev: WeakArc<Dev<A>>,
dev_id: dev_t, dev_id: dev_t,

View File

@ -36,6 +36,7 @@ pub struct Planes {
pub cursor: plane::Handle, pub cursor: plane::Handle,
} }
#[derive(Debug)]
pub(in crate::backend::drm) struct AtomicDrmSurfaceInternal<A: AsRawFd + 'static> { pub(in crate::backend::drm) struct AtomicDrmSurfaceInternal<A: AsRawFd + 'static> {
pub(super) dev: Arc<Dev<A>>, pub(super) dev: Arc<Dev<A>>,
pub(in crate::backend::drm) crtc: crtc::Handle, pub(in crate::backend::drm) crtc: crtc::Handle,
@ -1003,6 +1004,7 @@ impl<A: AsRawFd + 'static> AtomicDrmSurfaceInternal<A> {
} }
/// Open raw crtc utilizing atomic mode-setting /// Open raw crtc utilizing atomic mode-setting
#[derive(Debug)]
pub struct AtomicDrmSurface<A: AsRawFd + 'static>( pub struct AtomicDrmSurface<A: AsRawFd + 'static>(
pub(in crate::backend::drm) Arc<AtomicDrmSurfaceInternal<A>>, pub(in crate::backend::drm) Arc<AtomicDrmSurfaceInternal<A>>,
); );

View File

@ -36,12 +36,14 @@ use drm::{
use nix::libc::c_void; use nix::libc::c_void;
use nix::libc::dev_t; use nix::libc::dev_t;
use std::env; use std::env;
use std::fmt;
use std::os::unix::io::{AsRawFd, RawFd}; use std::os::unix::io::{AsRawFd, RawFd};
#[cfg(feature = "use_system_lib")] #[cfg(feature = "use_system_lib")]
use wayland_server::Display; use wayland_server::Display;
/// [`Device`](::backend::drm::Device) Wrapper to assist fallback /// [`Device`](::backend::drm::Device) Wrapper to assist fallback
/// in case initialization of the preferred device type fails. /// in case initialization of the preferred device type fails.
#[derive(Debug)]
pub enum FallbackDevice<D1: Device + 'static, D2: Device + 'static> { pub enum FallbackDevice<D1: Device + 'static, D2: Device + 'static> {
/// Variant for successful initialization of the preferred device /// Variant for successful initialization of the preferred device
Preference(D1), Preference(D1),
@ -129,6 +131,7 @@ where
/// [`Surface`](::backend::drm::Surface) Wrapper to assist fallback /// [`Surface`](::backend::drm::Surface) Wrapper to assist fallback
/// in case initialization of the preferred device type fails. /// in case initialization of the preferred device type fails.
#[derive(Debug)]
pub enum FallbackSurface<S1: Surface, S2: Surface> { pub enum FallbackSurface<S1: Surface, S2: Surface> {
/// Variant for successful initialization of the preferred device /// Variant for successful initialization of the preferred device
Preference(S1), Preference(S1),

View File

@ -15,6 +15,7 @@ use drm::SystemError as DrmError;
use nix::libc::dev_t; use nix::libc::dev_t;
use std::cell::RefCell; use std::cell::RefCell;
use std::collections::HashMap; use std::collections::HashMap;
use std::fmt;
use std::os::unix::io::{AsRawFd, RawFd}; use std::os::unix::io::{AsRawFd, RawFd};
use std::rc::Rc; use std::rc::Rc;
use std::sync::{Arc, Weak as WeakArc}; use std::sync::{Arc, Weak as WeakArc};
@ -69,6 +70,32 @@ where
links: Vec<crate::signaling::SignalToken>, links: Vec<crate::signaling::SignalToken>,
} }
// BackendRef does not implement debug, so we have to impl Debug manually
impl<B, D> fmt::Debug for EglDevice<B, D>
where
B: Backend<Surface = <D as Device>::Surface, Error = <<D as Device>::Surface as Surface>::Error>
+ fmt::Debug
+ 'static,
D: Device + NativeDisplay<B, Arguments = Arguments> + fmt::Debug + 'static,
<D as Device>::Surface: NativeSurface<Error = <<D as Device>::Surface as Surface>::Error>,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut debug = f.debug_struct("EglDevice");
debug
.field("dev", &self.dev)
.field("logger", &self.logger)
.field("default_attributes", &self.default_attributes)
.field("default_requirements", &self.default_requirements)
.field("backends", &"...");
#[cfg(feature = "backend_session")]
debug.field("links", &self.links);
debug.finish()
}
}
impl<B, D> AsRawFd for EglDevice<B, D> impl<B, D> AsRawFd for EglDevice<B, D>
where where
B: Backend<Surface = <D as Device>::Surface, Error = <<D as Device>::Surface as Surface>::Error> B: Backend<Surface = <D as Device>::Surface, Error = <<D as Device>::Surface as Surface>::Error>

View File

@ -23,6 +23,7 @@ use crate::{
/// [`SessionObserver`](SessionObserver) /// [`SessionObserver`](SessionObserver)
/// linked to the [`EglDevice`](EglDevice) it was /// linked to the [`EglDevice`](EglDevice) it was
/// created from. /// created from.
#[derive(Debug)]
pub struct EglDeviceObserver<N: NativeSurface + Surface> { pub struct EglDeviceObserver<N: NativeSurface + Surface> {
backends: Weak<RefCell<HashMap<crtc::Handle, WeakArc<EglSurfaceInternal<N>>>>>, backends: Weak<RefCell<HashMap<crtc::Handle, WeakArc<EglSurfaceInternal<N>>>>>,
} }

View File

@ -14,8 +14,10 @@ use crate::backend::graphics::PixelFormat;
use crate::backend::graphics::{CursorBackend, SwapBuffersError}; use crate::backend::graphics::{CursorBackend, SwapBuffersError};
/// Egl surface for rendering /// Egl surface for rendering
#[derive(Debug)]
pub struct EglSurface<N: native::NativeSurface + Surface>(pub(super) Arc<EglSurfaceInternal<N>>); pub struct EglSurface<N: native::NativeSurface + Surface>(pub(super) Arc<EglSurfaceInternal<N>>);
#[derive(Debug)]
pub(super) struct EglSurfaceInternal<N> pub(super) struct EglSurfaceInternal<N>
where where
N: native::NativeSurface + Surface, N: native::NativeSurface + Surface,

View File

@ -31,6 +31,7 @@ use std::sync::Arc;
/// Egl Device backend type /// Egl Device backend type
/// ///
/// See [`Backend`](::backend::egl::native::Backend). /// See [`Backend`](::backend::egl::native::Backend).
#[derive(Debug)]
pub struct EglStreamDeviceBackend<D: RawDevice + 'static> { pub struct EglStreamDeviceBackend<D: RawDevice + 'static> {
_userdata: PhantomData<D>, _userdata: PhantomData<D>,
} }

View File

@ -28,6 +28,7 @@ use nix::libc::dev_t;
use std::cell::RefCell; use std::cell::RefCell;
use std::collections::HashMap; use std::collections::HashMap;
use std::ffi::CStr; use std::ffi::CStr;
use std::fmt;
use std::os::unix::fs::MetadataExt; use std::os::unix::fs::MetadataExt;
use std::os::unix::io::{AsRawFd, RawFd}; use std::os::unix::io::{AsRawFd, RawFd};
use std::rc::{Rc, Weak}; use std::rc::{Rc, Weak};
@ -90,6 +91,22 @@ pub struct EglStreamDevice<D: RawDevice + ControlDevice + 'static> {
links: Vec<crate::signaling::SignalToken>, links: Vec<crate::signaling::SignalToken>,
} }
// SurfaceInternalRef does not implement debug, so we have to impl Debug manually
impl<D: RawDevice + ControlDevice + fmt::Debug + 'static> fmt::Debug for EglStreamDevice<D> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut debug = f.debug_struct("EglStreamDevice");
debug
.field("dev", &self.dev)
.field("raw", &self.raw)
.field("backends", &"...")
.field("logger", &self.logger);
#[cfg(feature = "backend_session")]
debug.field("links", &self.links);
debug.finish()
}
}
impl<D: RawDevice + ControlDevice + 'static> EglStreamDevice<D> { impl<D: RawDevice + ControlDevice + 'static> EglStreamDevice<D> {
/// Try to create a new [`EglStreamDevice`] from an open device. /// Try to create a new [`EglStreamDevice`] from an open device.
/// ///

View File

@ -19,6 +19,7 @@ use drm::control::{crtc, Device as ControlDevice};
/// [`SessionObserver`](SessionObserver) /// [`SessionObserver`](SessionObserver)
/// linked to the [`EglStreamDevice`](EglStreamDevice) it was /// linked to the [`EglStreamDevice`](EglStreamDevice) it was
/// created from. /// created from.
#[derive(Debug)]
pub struct EglStreamDeviceObserver<S: RawSurface + 'static> { pub struct EglStreamDeviceObserver<S: RawSurface + 'static> {
backends: Weak<RefCell<HashMap<crtc::Handle, WeakArc<EglStreamSurfaceInternal<S>>>>>, backends: Weak<RefCell<HashMap<crtc::Handle, WeakArc<EglStreamSurfaceInternal<S>>>>>,
logger: ::slog::Logger, logger: ::slog::Logger,

View File

@ -30,10 +30,12 @@ use crate::backend::graphics::CursorBackend;
// We do not want to mark the whole surface as `Send` in case we screw up somewhere else // We do not want to mark the whole surface as `Send` in case we screw up somewhere else
// and because S needs to be `Send` as well for this to work. // and because S needs to be `Send` as well for this to work.
#[derive(Debug)]
pub(super) struct StreamHandle(pub(super) EGLStreamKHR); pub(super) struct StreamHandle(pub(super) EGLStreamKHR);
// EGLStreamKHR can be moved between threads // EGLStreamKHR can be moved between threads
unsafe impl Send for StreamHandle {} unsafe impl Send for StreamHandle {}
#[derive(Debug)]
pub(in crate::backend::drm) struct EglStreamSurfaceInternal<S: RawSurface + 'static> { pub(in crate::backend::drm) struct EglStreamSurfaceInternal<S: RawSurface + 'static> {
pub(in crate::backend::drm) crtc: S, pub(in crate::backend::drm) crtc: S,
pub(in crate::backend::drm) cursor: Mutex<Option<(DumbBuffer, (u32, u32))>>, pub(in crate::backend::drm) cursor: Mutex<Option<(DumbBuffer, (u32, u32))>>,
@ -205,6 +207,7 @@ impl<S: RawSurface + 'static> CursorBackend for EglStreamSurfaceInternal<S> {
} }
/// egl stream surface for rendering /// egl stream surface for rendering
#[derive(Debug)]
pub struct EglStreamSurface<S: RawSurface + 'static>( pub struct EglStreamSurface<S: RawSurface + 'static>(
pub(in crate::backend::drm) Arc<EglStreamSurfaceInternal<S>>, pub(in crate::backend::drm) Arc<EglStreamSurfaceInternal<S>>,
); );

View File

@ -10,6 +10,7 @@ use std::ptr;
use std::sync::{atomic::Ordering, Arc}; use std::sync::{atomic::Ordering, Arc};
/// EGL context for rendering /// EGL context for rendering
#[derive(Debug)]
pub struct EGLContext { pub struct EGLContext {
context: ffi::egl::types::EGLContext, context: ffi::egl::types::EGLContext,
display: Arc<EGLDisplayHandle>, display: Arc<EGLDisplayHandle>,

View File

@ -24,10 +24,12 @@ use std::ffi::CStr;
use std::marker::PhantomData; use std::marker::PhantomData;
use std::mem::MaybeUninit; use std::mem::MaybeUninit;
use std::fmt;
use std::ops::Deref; use std::ops::Deref;
/// Wrapper around [`ffi::EGLDisplay`](ffi::egl::types::EGLDisplay) to ensure display is only destroyed /// Wrapper around [`ffi::EGLDisplay`](ffi::egl::types::EGLDisplay) to ensure display is only destroyed
/// once all resources bound to it have been dropped. /// once all resources bound to it have been dropped.
#[derive(Debug)]
pub struct EGLDisplayHandle { pub struct EGLDisplayHandle {
/// ffi EGLDisplay ptr /// ffi EGLDisplay ptr
pub handle: ffi::egl::types::EGLDisplay, pub handle: ffi::egl::types::EGLDisplay,
@ -54,6 +56,7 @@ impl Drop for EGLDisplayHandle {
} }
/// [`EGLDisplay`] represents an initialised EGL environment /// [`EGLDisplay`] represents an initialised EGL environment
#[derive(Debug)]
pub struct EGLDisplay<B: native::Backend, N: native::NativeDisplay<B>> { pub struct EGLDisplay<B: native::Backend, N: native::NativeDisplay<B>> {
native: RefCell<N>, native: RefCell<N>,
pub(crate) display: Arc<EGLDisplayHandle>, pub(crate) display: Arc<EGLDisplayHandle>,
@ -454,6 +457,17 @@ pub struct EGLBufferReader {
gl: gl_ffi::Gles2, gl: gl_ffi::Gles2,
} }
// Gles2 does not implement debug, so we have to impl Debug manually
#[cfg(feature = "use_system_lib")]
impl fmt::Debug for EGLBufferReader {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("EGLBufferReader")
.field("display", &self.display)
.field("wayland", &self.wayland)
.finish()
}
}
#[cfg(feature = "use_system_lib")] #[cfg(feature = "use_system_lib")]
impl EGLBufferReader { impl EGLBufferReader {
fn new(display: Arc<EGLDisplayHandle>, wayland: *mut wl_display) -> Self { fn new(display: Arc<EGLDisplayHandle>, wayland: *mut wl_display) -> Self {

View File

@ -269,6 +269,21 @@ pub struct EGLImages {
gl: gl_ffi::Gles2, gl: gl_ffi::Gles2,
} }
// Gles2 does not implement debug, so we have to impl Debug manually
#[cfg(feature = "wayland_frontend")]
impl fmt::Debug for EGLImages {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Point")
.field("display", &self.display)
.field("width", &self.width)
.field("height", &self.height)
.field("y_inverted", &self.y_inverted)
.field("format", &self.format)
.field("images", &self.images)
.finish()
}
}
#[cfg(feature = "wayland_frontend")] #[cfg(feature = "wayland_frontend")]
impl EGLImages { impl EGLImages {
/// Amount of planes of these `EGLImages` /// Amount of planes of these `EGLImages`

View File

@ -35,6 +35,7 @@ pub trait Backend {
} }
#[cfg(feature = "backend_winit")] #[cfg(feature = "backend_winit")]
#[derive(Debug)]
/// Wayland backend type /// Wayland backend type
pub enum Wayland {} pub enum Wayland {}
#[cfg(feature = "backend_winit")] #[cfg(feature = "backend_winit")]
@ -79,10 +80,12 @@ impl Backend for Wayland {
} }
#[cfg(feature = "backend_winit")] #[cfg(feature = "backend_winit")]
#[derive(Debug)]
/// Typed Xlib window for the `X11` backend /// Typed Xlib window for the `X11` backend
pub struct XlibWindow(u64); pub struct XlibWindow(u64);
#[cfg(feature = "backend_winit")] #[cfg(feature = "backend_winit")]
/// X11 backend type /// X11 backend type
#[derive(Debug)]
pub enum X11 {} pub enum X11 {}
#[cfg(feature = "backend_winit")] #[cfg(feature = "backend_winit")]
impl Backend for X11 { impl Backend for X11 {

View File

@ -11,6 +11,7 @@ use std::sync::{
}; };
/// EGL surface of a given EGL context for rendering /// EGL surface of a given EGL context for rendering
#[derive(Debug)]
pub struct EGLSurface<N: native::NativeSurface> { pub struct EGLSurface<N: native::NativeSurface> {
pub(crate) display: Arc<EGLDisplayHandle>, pub(crate) display: Arc<EGLDisplayHandle>,
native: N, native: N,

View File

@ -8,6 +8,7 @@ use glium::{
}; };
use std::{ use std::{
cell::{Cell, Ref, RefCell, RefMut}, cell::{Cell, Ref, RefCell, RefMut},
fmt,
os::raw::c_void, os::raw::c_void,
rc::Rc, rc::Rc,
}; };
@ -22,6 +23,29 @@ pub struct GliumGraphicsBackend<T: GLGraphicsBackend> {
error_channel: Rc<Cell<Option<Box<dyn std::error::Error>>>>, error_channel: Rc<Cell<Option<Box<dyn std::error::Error>>>>,
} }
// GLGraphicsBackend is a trait, so we have to impl Debug manually
impl<T: GLGraphicsBackend> fmt::Debug for GliumGraphicsBackend<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
struct BackendDebug<'a, T: GLGraphicsBackend>(&'a Rc<InternalBackend<T>>);
impl<'a, T: GLGraphicsBackend> fmt::Debug for BackendDebug<'a, T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let b = &self.0 .0.borrow();
f.debug_struct("GLGraphicsBackend")
.field("framebuffer_dimensions", &b.get_framebuffer_dimensions())
.field("is_current", &b.is_current())
.field("pixel_format", &b.get_pixel_format())
.finish()
}
}
f.debug_struct("GliumGraphicsBackend")
.field("context", &"...")
.field("backend", &BackendDebug(&self.backend))
.field("error_channel", &"...")
.finish()
}
}
struct InternalBackend<T: GLGraphicsBackend>(RefCell<T>, Rc<Cell<Option<Box<dyn std::error::Error>>>>); struct InternalBackend<T: GLGraphicsBackend>(RefCell<T>, Rc<Cell<Option<Box<dyn std::error::Error>>>>);
impl<T: GLGraphicsBackend + 'static> GliumGraphicsBackend<T> { impl<T: GLGraphicsBackend + 'static> GliumGraphicsBackend<T> {

View File

@ -87,6 +87,7 @@ pub trait Event {
/// that is not used by an [`InputBackend`] implementation. Initialization is not /// that is not used by an [`InputBackend`] implementation. Initialization is not
/// possible, making accidental use impossible and enabling a lot of possible /// possible, making accidental use impossible and enabling a lot of possible
/// compiler optimizations. /// compiler optimizations.
#[derive(Debug)]
pub enum UnusedEvent {} pub enum UnusedEvent {}
impl Event for UnusedEvent { impl Event for UnusedEvent {
@ -537,6 +538,7 @@ pub trait InputBackend: Sized {
} }
/// Different events that can be generated by an input backend /// Different events that can be generated by an input backend
#[derive(Debug)]
pub enum InputEvent<B: InputBackend> { pub enum InputEvent<B: InputBackend> {
/// A new seat has been created /// A new seat has been created
NewSeat(Seat), NewSeat(Seat),

View File

@ -16,6 +16,7 @@ use input::event;
use std::path::Path; use std::path::Path;
use std::{ use std::{
collections::hash_map::HashMap, collections::hash_map::HashMap,
fmt,
io::Error as IoError, io::Error as IoError,
os::unix::io::{AsRawFd, RawFd}, os::unix::io::{AsRawFd, RawFd},
}; };
@ -32,6 +33,7 @@ const INPUT_MAJOR: u32 = 13;
/// ///
/// Tracks input of all devices given manually or via a udev seat to a provided libinput /// Tracks input of all devices given manually or via a udev seat to a provided libinput
/// context. /// context.
#[derive(Debug)]
pub struct LibinputInputBackend { pub struct LibinputInputBackend {
context: libinput::Libinput, context: libinput::Libinput,
config: LibinputConfig, config: LibinputConfig,
@ -273,6 +275,7 @@ impl backend::Event for event::touch::TouchFrameEvent {
impl backend::TouchFrameEvent for event::touch::TouchFrameEvent {} impl backend::TouchFrameEvent for event::touch::TouchFrameEvent {}
/// Special events generated by Libinput /// Special events generated by Libinput
#[derive(Debug)]
pub enum LibinputEvent { pub enum LibinputEvent {
/// A new device was plugged in /// A new device was plugged in
NewDevice(libinput::Device), NewDevice(libinput::Device),
@ -284,6 +287,7 @@ pub enum LibinputEvent {
/// ///
/// This type allows you to access the list of know devices to configure them /// This type allows you to access the list of know devices to configure them
/// if relevant /// if relevant
#[derive(Debug)]
pub struct LibinputConfig { pub struct LibinputConfig {
devices: Vec<libinput::Device>, devices: Vec<libinput::Device>,
} }
@ -421,6 +425,7 @@ impl From<event::pointer::ButtonState> for backend::MouseButtonState {
/// Wrapper for types implementing the [`Session`] trait to provide /// Wrapper for types implementing the [`Session`] trait to provide
/// a [`libinput::LibinputInterface`] implementation. /// a [`libinput::LibinputInterface`] implementation.
#[cfg(feature = "backend_session")] #[cfg(feature = "backend_session")]
#[derive(Debug)]
pub struct LibinputSessionInterface<S: Session>(S); pub struct LibinputSessionInterface<S: Session>(S);
#[cfg(feature = "backend_session")] #[cfg(feature = "backend_session")]

View File

@ -44,7 +44,7 @@ use std::{cell::RefCell, io, os::unix::io::RawFd, path::Path, rc::Rc};
use calloop::{EventSource, Poll, Readiness, Token}; use calloop::{EventSource, Poll, Readiness, Token};
/// [`Session`] using the best available interface /// [`Session`] using the best available interface
#[derive(Clone)] #[derive(Debug, Clone)]
pub enum AutoSession { pub enum AutoSession {
/// Logind session /// Logind session
#[cfg(feature = "backend_session_logind")] #[cfg(feature = "backend_session_logind")]
@ -54,6 +54,7 @@ pub enum AutoSession {
} }
/// [`SessionNotifier`] using the best available interface /// [`SessionNotifier`] using the best available interface
#[derive(Debug)]
pub enum AutoSessionNotifier { pub enum AutoSessionNotifier {
/// Logind session notifier /// Logind session notifier
#[cfg(feature = "backend_session_logind")] #[cfg(feature = "backend_session_logind")]

View File

@ -49,6 +49,7 @@ use nix::{
}; };
use std::{ use std::{
cell::RefCell, cell::RefCell,
fmt,
io::Error as IoError, io::Error as IoError,
os::unix::io::RawFd, os::unix::io::RawFd,
path::Path, path::Path,
@ -70,15 +71,30 @@ struct LogindSessionImpl {
logger: ::slog::Logger, logger: ::slog::Logger,
} }
// DBusConnection does not implement debug, so we have to impl Debug manually
impl fmt::Debug for LogindSessionImpl {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("LogindSessionImpl ")
.field("session_id", &self.session_id)
.field("conn", &"...")
.field("session_path", &self.session_path)
.field("active", &self.active)
.field("signaler", &self.signaler)
.field("seat", &self.seat)
.field("logger", &self.logger)
.finish()
}
}
/// [`Session`] via the logind dbus interface /// [`Session`] via the logind dbus interface
#[derive(Clone)] #[derive(Debug, Clone)]
pub struct LogindSession { pub struct LogindSession {
internal: Weak<LogindSessionImpl>, internal: Weak<LogindSessionImpl>,
seat: String, seat: String,
} }
/// [`SessionNotifier`] via the logind dbus interface /// [`SessionNotifier`] via the logind dbus interface
#[derive(Clone)] #[derive(Debug, Clone)]
pub struct LogindSessionNotifier { pub struct LogindSessionNotifier {
internal: Rc<LogindSessionImpl>, internal: Rc<LogindSessionImpl>,
} }

View File

@ -57,6 +57,7 @@ use nix::{
Error as NixError, Result as NixResult, Error as NixError, Result as NixResult,
}; };
use std::{ use std::{
fmt,
os::unix::io::RawFd, os::unix::io::RawFd,
path::Path, path::Path,
sync::{ sync::{
@ -142,6 +143,7 @@ fn is_tty_device(dev: dev_t, path: Option<&Path>) -> bool {
} }
/// [`Session`] via the virtual terminal direct kernel interface /// [`Session`] via the virtual terminal direct kernel interface
#[derive(Debug)]
pub struct DirectSession { pub struct DirectSession {
tty: RawFd, tty: RawFd,
active: Arc<AtomicBool>, active: Arc<AtomicBool>,
@ -160,6 +162,26 @@ pub struct DirectSessionNotifier {
source: Option<Signals>, source: Option<Signals>,
} }
impl fmt::Debug for DirectSessionNotifier {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Point")
.field("tty", &self.tty)
.field("active", &self.active)
.field("signaler", &self.signaler)
.field("signal", &self.signal)
.field("logger", &self.logger)
// Signal deos not implement Debug`
.field(
"source",
&match self.source {
Some(_) => "Some(..)",
None => "None",
},
)
.finish()
}
}
impl DirectSession { impl DirectSession {
/// Tries to create a new session via the legacy virtual terminal interface. /// Tries to create a new session via the legacy virtual terminal interface.
/// ///

View File

@ -43,6 +43,7 @@ use nix::sys::stat::{dev_t, stat};
use std::{ use std::{
collections::HashMap, collections::HashMap,
ffi::OsString, ffi::OsString,
fmt,
io::Result as IoResult, io::Result as IoResult,
os::unix::io::{AsRawFd, RawFd}, os::unix::io::{AsRawFd, RawFd},
path::{Path, PathBuf}, path::{Path, PathBuf},
@ -62,6 +63,18 @@ pub struct UdevBackend {
logger: ::slog::Logger, logger: ::slog::Logger,
} }
// MonitorSocket does not implement debug, so we have to impl Debug manually
impl fmt::Debug for UdevBackend {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
use udev::AsRaw;
f.debug_struct("UdevBackend")
.field("devices", &self.devices)
.field("monitor", &format!("MonitorSocket ({:?})", self.monitor.as_raw()))
.field("logger", &self.logger)
.finish()
}
}
impl AsRawFd for UdevBackend { impl AsRawFd for UdevBackend {
fn as_raw_fd(&self) -> RawFd { fn as_raw_fd(&self) -> RawFd {
self.monitor.as_raw_fd() self.monitor.as_raw_fd()
@ -182,6 +195,7 @@ impl EventSource for UdevBackend {
} }
/// Events generated by the [`UdevBackend`], notifying you of changes in system devices /// Events generated by the [`UdevBackend`], notifying you of changes in system devices
#[derive(Debug)]
pub enum UdevEvent { pub enum UdevEvent {
/// A new device has been detected /// A new device has been detected
Added { Added {

View File

@ -16,6 +16,7 @@ use nix::libc::c_void;
use std::{ use std::{
cell::{Ref, RefCell}, cell::{Ref, RefCell},
convert::TryInto, convert::TryInto,
fmt,
rc::Rc, rc::Rc,
time::Instant, time::Instant,
}; };
@ -65,6 +66,30 @@ enum Window {
}, },
} }
// WlEglSurface does not implement debug, so we have to impl Debug manually
impl fmt::Debug for Window {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Window::Wayland { display, context, .. } => f
.debug_struct("Window::Wayland")
.field("display", &display)
.field("context", &context)
.field("surface", &"...")
.finish(),
Window::X11 {
display,
context,
surface,
} => f
.debug_struct("Window::X11")
.field("display", &display)
.field("context", &context)
.field("surface", &surface)
.finish(),
}
}
}
impl Window { impl Window {
fn window(&self) -> Ref<'_, WinitWindow> { fn window(&self) -> Ref<'_, WinitWindow> {
match *self { match *self {
@ -74,6 +99,7 @@ impl Window {
} }
} }
#[derive(Debug)]
struct WindowSize { struct WindowSize {
physical_size: PhysicalSize<u32>, physical_size: PhysicalSize<u32>,
scale_factor: f64, scale_factor: f64,
@ -81,6 +107,7 @@ struct WindowSize {
/// Window with an active EGL Context created by `winit`. Implements the /// Window with an active EGL Context created by `winit`. Implements the
/// [`EGLGraphicsBackend`] and [`GLGraphicsBackend`] graphics backend trait /// [`EGLGraphicsBackend`] and [`GLGraphicsBackend`] graphics backend trait
#[derive(Debug)]
pub struct WinitGraphicsBackend { pub struct WinitGraphicsBackend {
window: Rc<Window>, window: Rc<Window>,
size: Rc<RefCell<WindowSize>>, size: Rc<RefCell<WindowSize>>,
@ -91,6 +118,7 @@ pub struct WinitGraphicsBackend {
/// ///
/// You need to call [`dispatch_new_events`](InputBackend::dispatch_new_events) /// You need to call [`dispatch_new_events`](InputBackend::dispatch_new_events)
/// periodically to receive any events. /// periodically to receive any events.
#[derive(Debug)]
pub struct WinitInputBackend { pub struct WinitInputBackend {
events_loop: EventLoop<()>, events_loop: EventLoop<()>,
window: Rc<Window>, window: Rc<Window>,
@ -226,6 +254,7 @@ where
} }
/// Specific events generated by Winit /// Specific events generated by Winit
#[derive(Debug)]
pub enum WinitEvent { pub enum WinitEvent {
/// The window has been resized /// The window has been resized
Resized { Resized {
@ -358,8 +387,8 @@ pub enum WinitInputError {
WindowClosed, WindowClosed,
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
/// Winit-Backend internal event wrapping `winit`'s types into a [`KeyboardKeyEvent`] /// Winit-Backend internal event wrapping `winit`'s types into a [`KeyboardKeyEvent`]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct WinitKeyboardInputEvent { pub struct WinitKeyboardInputEvent {
time: u32, time: u32,
key: u32, key: u32,
@ -387,8 +416,8 @@ impl KeyboardKeyEvent for WinitKeyboardInputEvent {
} }
} }
#[derive(Clone)]
/// Winit-Backend internal event wrapping `winit`'s types into a [`PointerMotionAbsoluteEvent`] /// Winit-Backend internal event wrapping `winit`'s types into a [`PointerMotionAbsoluteEvent`]
#[derive(Debug, Clone)]
pub struct WinitMouseMovedEvent { pub struct WinitMouseMovedEvent {
size: Rc<RefCell<WindowSize>>, size: Rc<RefCell<WindowSize>>,
time: u32, time: u32,
@ -426,8 +455,8 @@ impl PointerMotionAbsoluteEvent for WinitMouseMovedEvent {
} }
} }
#[derive(Debug, Clone, Copy, PartialEq)]
/// Winit-Backend internal event wrapping `winit`'s types into a [`PointerAxisEvent`] /// Winit-Backend internal event wrapping `winit`'s types into a [`PointerAxisEvent`]
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct WinitMouseWheelEvent { pub struct WinitMouseWheelEvent {
time: u32, time: u32,
delta: MouseScrollDelta, delta: MouseScrollDelta,
@ -464,8 +493,8 @@ impl PointerAxisEvent for WinitMouseWheelEvent {
} }
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
/// Winit-Backend internal event wrapping `winit`'s types into a [`PointerButtonEvent`] /// Winit-Backend internal event wrapping `winit`'s types into a [`PointerButtonEvent`]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct WinitMouseInputEvent { pub struct WinitMouseInputEvent {
time: u32, time: u32,
button: WinitMouseButton, button: WinitMouseButton,
@ -488,8 +517,8 @@ impl PointerButtonEvent for WinitMouseInputEvent {
} }
} }
#[derive(Clone)]
/// Winit-Backend internal event wrapping `winit`'s types into a [`TouchDownEvent`] /// Winit-Backend internal event wrapping `winit`'s types into a [`TouchDownEvent`]
#[derive(Debug, Clone)]
pub struct WinitTouchStartedEvent { pub struct WinitTouchStartedEvent {
size: Rc<RefCell<WindowSize>>, size: Rc<RefCell<WindowSize>>,
time: u32, time: u32,
@ -531,8 +560,8 @@ impl TouchDownEvent for WinitTouchStartedEvent {
} }
} }
#[derive(Clone)]
/// Winit-Backend internal event wrapping `winit`'s types into a [`TouchMotionEvent`] /// Winit-Backend internal event wrapping `winit`'s types into a [`TouchMotionEvent`]
#[derive(Debug, Clone)]
pub struct WinitTouchMovedEvent { pub struct WinitTouchMovedEvent {
size: Rc<RefCell<WindowSize>>, size: Rc<RefCell<WindowSize>>,
time: u32, time: u32,
@ -574,8 +603,8 @@ impl TouchMotionEvent for WinitTouchMovedEvent {
} }
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
/// Winit-Backend internal event wrapping `winit`'s types into a `TouchUpEvent` /// Winit-Backend internal event wrapping `winit`'s types into a `TouchUpEvent`
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct WinitTouchEndedEvent { pub struct WinitTouchEndedEvent {
time: u32, time: u32,
id: u64, id: u64,
@ -593,8 +622,8 @@ impl TouchUpEvent for WinitTouchEndedEvent {
} }
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
/// Winit-Backend internal event wrapping `winit`'s types into a [`TouchCancelEvent`] /// Winit-Backend internal event wrapping `winit`'s types into a [`TouchCancelEvent`]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct WinitTouchCancelledEvent { pub struct WinitTouchCancelledEvent {
time: u32, time: u32,
id: u64, id: u64,
@ -615,6 +644,7 @@ impl TouchCancelEvent for WinitTouchCancelledEvent {
/// Input config for Winit /// Input config for Winit
/// ///
/// This backend does not allow any input configuration, so this type does nothing. /// This backend does not allow any input configuration, so this type does nothing.
#[derive(Debug)]
pub struct WinitInputConfig; pub struct WinitInputConfig;
impl InputBackend for WinitInputBackend { impl InputBackend for WinitInputBackend {

View File

@ -21,10 +21,12 @@ use std::{
any::Any, any::Any,
cell::RefCell, cell::RefCell,
collections::VecDeque, collections::VecDeque,
fmt,
rc::{Rc, Weak}, rc::{Rc, Weak},
}; };
/// A signaler, main type for signaling /// A signaler, main type for signaling
#[derive(Debug)]
pub struct Signaler<S> { pub struct Signaler<S> {
inner: Rc<SignalInner<S>>, inner: Rc<SignalInner<S>>,
} }
@ -88,6 +90,7 @@ impl<S> Default for Signaler<S> {
/// Dropping it will disable and drop the callback it is associated to. /// Dropping it will disable and drop the callback it is associated to.
/// If you don't plan to ever disable the callback, you can use the `leak` /// If you don't plan to ever disable the callback, you can use the `leak`
/// method to safely get rid of this value. /// method to safely get rid of this value.
#[derive(Debug)]
pub struct SignalToken { pub struct SignalToken {
signal: Rc<dyn Any>, signal: Rc<dyn Any>,
} }
@ -108,6 +111,17 @@ struct SignalInner<S> {
pending_events: RefCell<VecDeque<S>>, pending_events: RefCell<VecDeque<S>>,
} }
// WeakCallback does not implement debug, so we have to impl Debug manually
impl<S: fmt::Debug> fmt::Debug for SignalInner<S> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("SignalInner")
.field("callbacks::len()", &self.callbacks.borrow().len())
.field("pending_callbacks::len()", &self.pending_callbacks.borrow().len())
.field("pending_events", &self.pending_events)
.finish()
}
}
impl<S> SignalInner<S> { impl<S> SignalInner<S> {
fn new() -> SignalInner<S> { fn new() -> SignalInner<S> {
SignalInner { SignalInner {

View File

@ -1,5 +1,6 @@
use std::{rc::Rc, cell::RefCell}; use std::{rc::Rc, cell::RefCell};
#[derive(Debug)]
struct SignalerInner<E> { struct SignalerInner<E> {
closures: RefCell<Vec<Box<dyn FnMut(&mut E)>>> closures: RefCell<Vec<Box<dyn FnMut(&mut E)>>>
} }
@ -12,6 +13,7 @@ impl<E> SignalerInner<E> {
} }
} }
#[derive(Debug)]
pub struct Signaler<E> { pub struct Signaler<E> {
inner: Rc<SignalerInner<E>> inner: Rc<SignalerInner<E>>
} }

View File

@ -68,7 +68,7 @@
//! surfaces. See the documentation of the [`roles`](::wayland::compositor::roles) submodule //! surfaces. See the documentation of the [`roles`](::wayland::compositor::roles) submodule
//! for a detailed explanation. //! for a detailed explanation.
use std::{cell::RefCell, rc::Rc, sync::Mutex}; use std::{cell::RefCell, fmt, rc::Rc, sync::Mutex};
mod handlers; mod handlers;
pub mod roles; pub mod roles;
@ -89,6 +89,7 @@ use wayland_server::{
/// Description of which part of a surface /// Description of which part of a surface
/// should be considered damaged and needs to be redrawn /// should be considered damaged and needs to be redrawn
#[derive(Debug)]
pub enum Damage { pub enum Damage {
/// The whole surface must be considered damaged (this is the default) /// The whole surface must be considered damaged (this is the default)
Full, Full,
@ -100,12 +101,13 @@ pub enum Damage {
Buffer(Rectangle), Buffer(Rectangle),
} }
#[derive(Copy, Clone, Default)] #[derive(Debug, Copy, Clone, Default)]
struct Marker<R> { struct Marker<R> {
_r: ::std::marker::PhantomData<R>, _r: ::std::marker::PhantomData<R>,
} }
/// New buffer assignation for a surface /// New buffer assignation for a surface
#[derive(Debug)]
pub enum BufferAssignment { pub enum BufferAssignment {
/// The surface no longer has a buffer attached to it /// The surface no longer has a buffer attached to it
Removed, Removed,
@ -170,6 +172,22 @@ pub struct SurfaceAttributes {
pub user_data: UserDataMap, pub user_data: UserDataMap,
} }
// UserDataMap does not implement debug, so we have to impl Debug manually
impl fmt::Debug for SurfaceAttributes {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("SurfaceAttributes")
.field("buffer", &self.buffer)
.field("buffer_scale", &self.buffer_scale)
.field("buffer_transform", &self.buffer_transform)
.field("opaque_region", &self.opaque_region)
.field("input_region", &self.input_region)
.field("damage", &self.damage)
.field("frame_callback", &self.frame_callback)
.field("user_data", &"...")
.finish()
}
}
impl Default for SurfaceAttributes { impl Default for SurfaceAttributes {
fn default() -> SurfaceAttributes { fn default() -> SurfaceAttributes {
SurfaceAttributes { SurfaceAttributes {
@ -259,6 +277,7 @@ impl RegionAttributes {
/// access data associated with the [`wl_surface`](wayland_server::protocol::wl_surface) /// access data associated with the [`wl_surface`](wayland_server::protocol::wl_surface)
/// and [`wl_region`](wayland_server::protocol::wl_region) managed /// and [`wl_region`](wayland_server::protocol::wl_region) managed
/// by the `CompositorGlobal` that provided it. /// by the `CompositorGlobal` that provided it.
#[derive(Debug)]
pub struct CompositorToken<R> { pub struct CompositorToken<R> {
_role: ::std::marker::PhantomData<*mut R>, _role: ::std::marker::PhantomData<*mut R>,
} }
@ -516,6 +535,7 @@ where
/// The global provided by smithay cannot process these events for you, so /// The global provided by smithay cannot process these events for you, so
/// they are forwarded directly via your provided implementation, and are /// they are forwarded directly via your provided implementation, and are
/// described by this global. /// described by this global.
#[derive(Debug)]
pub enum SurfaceEvent { pub enum SurfaceEvent {
/// The double-buffered state has been validated by the client /// The double-buffered state has been validated by the client
/// ///

View File

@ -28,6 +28,7 @@ pub enum Location {
} }
/// Possible actions to do after handling a node diring tree traversal /// Possible actions to do after handling a node diring tree traversal
#[derive(Debug)]
pub enum TraversalAction<T> { pub enum TraversalAction<T> {
/// Traverse its children as well, providing them the data T /// Traverse its children as well, providing them the data T
DoChildren(T), DoChildren(T),

View File

@ -78,6 +78,7 @@ pub use self::data_source::{with_source_metadata, SourceMetadata};
pub use self::server_dnd_grab::ServerDndEvent; pub use self::server_dnd_grab::ServerDndEvent;
/// Events that are generated by interactions of the clients with the data device /// Events that are generated by interactions of the clients with the data device
#[derive(Debug)]
pub enum DataDeviceEvent { pub enum DataDeviceEvent {
/// A client has set the selection /// A client has set the selection
NewSelection(Option<wl_data_source::WlDataSource>), NewSelection(Option<wl_data_source::WlDataSource>),
@ -108,7 +109,7 @@ pub enum DataDeviceEvent {
} }
/// The role applied to surfaces used as DnD icons /// The role applied to surfaces used as DnD icons
#[derive(Default)] #[derive(Debug, Default)]
pub struct DnDIconRole; pub struct DnDIconRole;
enum Selection { enum Selection {

View File

@ -11,6 +11,7 @@ use crate::wayland::Serial;
use super::{DataDeviceData, SeatData}; use super::{DataDeviceData, SeatData};
/// Event generated by the interactions of clients with a server initiated drag'n'drop /// Event generated by the interactions of clients with a server initiated drag'n'drop
#[derive(Debug)]
pub enum ServerDndEvent { pub enum ServerDndEvent {
/// The client chose an action /// The client chose an action
Action(DndAction), Action(DndAction),

View File

@ -76,6 +76,7 @@ use wayland_protocols::unstable::linux_dmabuf::v1::server::{
use wayland_server::{protocol::wl_buffer, Display, Filter, Global, Main}; use wayland_server::{protocol::wl_buffer, Display, Filter, Global, Main};
/// Representation of a Dmabuf format, as advertized to the client /// Representation of a Dmabuf format, as advertized to the client
#[derive(Debug)]
pub struct Format { pub struct Format {
/// The format identifier. /// The format identifier.
pub format: ::drm::buffer::format::PixelFormat, pub format: ::drm::buffer::format::PixelFormat,
@ -89,6 +90,7 @@ pub struct Format {
} }
/// A plane send by the client /// A plane send by the client
#[derive(Debug)]
pub struct Plane { pub struct Plane {
/// The file descriptor /// The file descriptor
pub fd: RawFd, pub fd: RawFd,
@ -115,6 +117,7 @@ bitflags! {
} }
/// The complete information provided by the client to create a dmabuf buffer /// The complete information provided by the client to create a dmabuf buffer
#[derive(Debug)]
pub struct BufferInfo { pub struct BufferInfo {
/// The submitted planes /// The submitted planes
pub planes: Vec<Plane>, pub planes: Vec<Plane>,

View File

@ -86,6 +86,7 @@ use wayland_server::{protocol::wl_surface::WlSurface, Display, Filter, Global, M
use crate::wayland::compositor::{CompositorToken, SurfaceAttributes}; use crate::wayland::compositor::{CompositorToken, SurfaceAttributes};
/// An object to signal end of use of a buffer /// An object to signal end of use of a buffer
#[derive(Debug)]
pub struct ExplicitBufferRelease { pub struct ExplicitBufferRelease {
release: ZwpLinuxBufferReleaseV1, release: ZwpLinuxBufferReleaseV1,
} }
@ -111,6 +112,7 @@ impl ExplicitBufferRelease {
/// The client is not required to fill both. `acquire` being `None` means that you don't need to wait /// The client is not required to fill both. `acquire` being `None` means that you don't need to wait
/// before acessing the buffer, `release` being `None` means that the client does not require additionnal /// before acessing the buffer, `release` being `None` means that the client does not require additionnal
/// signaling that you are finished (you still need to send `wl_buffer.release`). /// signaling that you are finished (you still need to send `wl_buffer.release`).
#[derive(Debug)]
pub struct ExplicitSyncState { pub struct ExplicitSyncState {
/// An acquire `dma_fence` object, that you should wait on before accessing the contents of the /// An acquire `dma_fence` object, that you should wait on before accessing the contents of the
/// buffer associated with the surface. /// buffer associated with the surface.
@ -143,6 +145,7 @@ impl ESUserData {
} }
/// Possible errors you can send to an ill-behaving clients /// Possible errors you can send to an ill-behaving clients
#[derive(Debug)]
pub enum ExplicitSyncError { pub enum ExplicitSyncError {
/// An invalid file descriptor was sent by the client for an acquire fence /// An invalid file descriptor was sent by the client for an acquire fence
InvalidFence, InvalidFence,

View File

@ -80,6 +80,7 @@ impl From<Serial> for u32 {
/// ///
/// The counter will wrap around on overflow, ensuring it can run for as long /// The counter will wrap around on overflow, ensuring it can run for as long
/// as needed. /// as needed.
#[derive(Debug)]
pub struct SerialCounter { pub struct SerialCounter {
// TODO: replace with an AtomicU32 when stabilized // TODO: replace with an AtomicU32 when stabilized
serial: AtomicUsize, serial: AtomicUsize,

View File

@ -65,7 +65,7 @@ use wayland_server::{
/// ///
/// This should only describe the characteristics of the video driver, /// This should only describe the characteristics of the video driver,
/// not taking into account any global scaling. /// not taking into account any global scaling.
#[derive(Copy, Clone, PartialEq)] #[derive(Debug, Copy, Clone, PartialEq)]
pub struct Mode { pub struct Mode {
/// The width in pixels /// The width in pixels
pub width: i32, pub width: i32,
@ -78,6 +78,7 @@ pub struct Mode {
} }
/// The physical properties of an output /// The physical properties of an output
#[derive(Debug)]
pub struct PhysicalProperties { pub struct PhysicalProperties {
/// The width in millimeters /// The width in millimeters
pub width: i32, pub width: i32,
@ -91,6 +92,7 @@ pub struct PhysicalProperties {
pub model: String, pub model: String,
} }
#[derive(Debug)]
struct Inner { struct Inner {
name: String, name: String,
log: ::slog::Logger, log: ::slog::Logger,
@ -155,6 +157,7 @@ impl Inner {
/// ///
/// This handle is stored in the event loop, and allows you to notify clients /// This handle is stored in the event loop, and allows you to notify clients
/// about any change in the properties of this output. /// about any change in the properties of this output.
#[derive(Debug)]
pub struct Output { pub struct Output {
inner: Arc<Mutex<Inner>>, inner: Arc<Mutex<Inner>>,
} }

View File

@ -3,6 +3,7 @@ use crate::wayland::Serial;
use std::{ use std::{
cell::RefCell, cell::RefCell,
default::Default, default::Default,
fmt,
io::{Error as IoError, Write}, io::{Error as IoError, Write},
ops::Deref as _, ops::Deref as _,
os::unix::io::AsRawFd, os::unix::io::AsRawFd,
@ -119,6 +120,23 @@ struct KbdInternal {
focus_hook: Box<dyn FnMut(Option<&WlSurface>)>, focus_hook: Box<dyn FnMut(Option<&WlSurface>)>,
} }
// focus_hook does not implement debug, so we have to impl Debug manually
impl fmt::Debug for KbdInternal {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("KbdInternal")
.field("known_kbds", &self.known_kbds)
.field("focus", &self.focus)
.field("pressed_keys", &self.pressed_keys)
.field("mods_state", &self.mods_state)
.field("keymap", &self.keymap.get_raw_ptr())
.field("state", &self.state.get_raw_ptr())
.field("repeat_rate", &self.repeat_rate)
.field("repeat_delay", &self.repeat_delay)
.field("focus_hook", &"...")
.finish()
}
}
// This is OK because all parts of `xkb` will remain on the // This is OK because all parts of `xkb` will remain on the
// same thread // same thread
unsafe impl Send for KbdInternal {} unsafe impl Send for KbdInternal {}
@ -267,6 +285,7 @@ where
}) })
} }
#[derive(Debug)]
struct KbdRc { struct KbdRc {
internal: RefCell<KbdInternal>, internal: RefCell<KbdInternal>,
keymap: String, keymap: String,
@ -284,7 +303,7 @@ struct KbdRc {
/// - process key inputs from the input backend, allowing them to be caught at the compositor-level /// - process key inputs from the input backend, allowing them to be caught at the compositor-level
/// or forwarded to the client. See the documentation of the [`KeyboardHandle::input`] method for /// or forwarded to the client. See the documentation of the [`KeyboardHandle::input`] method for
/// details. /// details.
#[derive(Clone)] #[derive(Debug, Clone)]
pub struct KeyboardHandle { pub struct KeyboardHandle {
arc: Rc<KbdRc>, arc: Rc<KbdRc>,
} }

View File

@ -40,7 +40,7 @@
//! These methods return handles that can be cloned and sent across thread, so you can keep one around //! These methods return handles that can be cloned and sent across thread, so you can keep one around
//! in your event-handling code to forward inputs to your clients. //! in your event-handling code to forward inputs to your clients.
use std::{cell::RefCell, ops::Deref as _, rc::Rc}; use std::{cell::RefCell, fmt, ops::Deref as _, rc::Rc};
mod keyboard; mod keyboard;
mod pointer; mod pointer;
@ -60,6 +60,7 @@ use wayland_server::{
Display, Filter, Global, Main, UserDataMap, Display, Filter, Global, Main, UserDataMap,
}; };
#[derive(Debug)]
struct Inner { struct Inner {
pointer: Option<PointerHandle>, pointer: Option<PointerHandle>,
keyboard: Option<KeyboardHandle>, keyboard: Option<KeyboardHandle>,
@ -73,6 +74,18 @@ pub(crate) struct SeatRc {
name: String, name: String,
} }
// UserDataMap does not implement debug, so we have to impl Debug manually
impl fmt::Debug for SeatRc {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("SeatRc")
.field("inner", &self.inner)
.field("user_data", &"...")
.field("log", &self.log)
.field("name", &self.name)
.finish()
}
}
impl Inner { impl Inner {
fn compute_caps(&self) -> wl_seat::Capability { fn compute_caps(&self) -> wl_seat::Capability {
let mut caps = wl_seat::Capability::empty(); let mut caps = wl_seat::Capability::empty();
@ -103,7 +116,7 @@ impl Inner {
/// This is an handle to the inner logic, it can be cloned. /// This is an handle to the inner logic, it can be cloned.
/// ///
/// See module-level documentation for details of use. /// See module-level documentation for details of use.
#[derive(Clone)] #[derive(Debug, Clone)]
pub struct Seat { pub struct Seat {
pub(crate) arc: Rc<SeatRc>, pub(crate) arc: Rc<SeatRc>,
} }

View File

@ -1,4 +1,4 @@
use std::{cell::RefCell, ops::Deref as _, rc::Rc}; use std::{cell::RefCell, fmt, ops::Deref as _, rc::Rc};
use wayland_server::{ use wayland_server::{
protocol::{ protocol::{
@ -12,14 +12,14 @@ use crate::wayland::compositor::{roles::Role, CompositorToken};
use crate::wayland::Serial; use crate::wayland::Serial;
/// The role representing a surface set as the pointer cursor /// The role representing a surface set as the pointer cursor
#[derive(Default, Copy, Clone)] #[derive(Debug, Default, Copy, Clone)]
pub struct CursorImageRole { pub struct CursorImageRole {
/// Location of the hotspot of the pointer in the surface /// Location of the hotspot of the pointer in the surface
pub hotspot: (i32, i32), pub hotspot: (i32, i32),
} }
/// Possible status of a cursor as requested by clients /// Possible status of a cursor as requested by clients
#[derive(Clone, PartialEq)] #[derive(Debug, Clone, PartialEq)]
pub enum CursorImageStatus { pub enum CursorImageStatus {
/// The cursor should be hidden /// The cursor should be hidden
Hidden, Hidden,
@ -35,6 +35,17 @@ enum GrabStatus {
Borrowed, Borrowed,
} }
// PointerGrab is a trait, so we have to impl Debug manually
impl fmt::Debug for GrabStatus {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
GrabStatus::None => f.debug_tuple("GrabStatus::None").finish(),
GrabStatus::Active(serial, _) => f.debug_tuple("GrabStatus::Active").field(&serial).finish(),
GrabStatus::Borrowed => f.debug_tuple("GrabStatus::Borrowed").finish(),
}
}
}
struct PointerInternal { struct PointerInternal {
known_pointers: Vec<WlPointer>, known_pointers: Vec<WlPointer>,
focus: Option<(WlSurface, (f64, f64))>, focus: Option<(WlSurface, (f64, f64))>,
@ -45,6 +56,21 @@ struct PointerInternal {
image_callback: Box<dyn FnMut(CursorImageStatus)>, image_callback: Box<dyn FnMut(CursorImageStatus)>,
} }
// image_callback does not implement debug, so we have to impl Debug manually
impl fmt::Debug for PointerInternal {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Point")
.field("known_pointers", &self.known_pointers)
.field("focus", &self.focus)
.field("pending_focus", &self.pending_focus)
.field("location", &self.location)
.field("grab", &self.grab)
.field("pressed_buttons", &self.pressed_buttons)
.field("image_callback", &"...")
.finish()
}
}
impl PointerInternal { impl PointerInternal {
fn new<F, R>(token: CompositorToken<R>, mut cb: F) -> PointerInternal fn new<F, R>(token: CompositorToken<R>, mut cb: F) -> PointerInternal
where where
@ -125,7 +151,7 @@ impl PointerInternal {
/// ///
/// When sending events using this handle, they will be intercepted by a pointer /// When sending events using this handle, they will be intercepted by a pointer
/// grab if any is active. See the [`PointerGrab`] trait for details. /// grab if any is active. See the [`PointerGrab`] trait for details.
#[derive(Clone)] #[derive(Debug, Clone)]
pub struct PointerHandle { pub struct PointerHandle {
inner: Rc<RefCell<PointerInternal>>, inner: Rc<RefCell<PointerInternal>>,
} }
@ -233,7 +259,7 @@ impl PointerHandle {
} }
/// Data about the event that started the grab. /// Data about the event that started the grab.
#[derive(Clone)] #[derive(Debug, Clone)]
pub struct GrabStartData { pub struct GrabStartData {
/// The focused surface and its location, if any, at the start of the grab. /// The focused surface and its location, if any, at the start of the grab.
/// ///
@ -287,6 +313,7 @@ pub trait PointerGrab {
/// This inner handle is accessed from inside a pointer grab logic, and directly /// This inner handle is accessed from inside a pointer grab logic, and directly
/// sends event to the client /// sends event to the client
#[derive(Debug)]
pub struct PointerInnerHandle<'a> { pub struct PointerInnerHandle<'a> {
inner: &'a mut PointerInternal, inner: &'a mut PointerInternal,
} }

View File

@ -77,6 +77,7 @@ use wayland_server::{
mod wl_handlers; mod wl_handlers;
/// Metadata associated with the `wl_surface` role /// Metadata associated with the `wl_surface` role
#[derive(Debug)]
pub struct ShellSurfaceRole { pub struct ShellSurfaceRole {
/// Title of the surface /// Title of the surface
pub title: String, pub title: String,
@ -86,6 +87,7 @@ pub struct ShellSurfaceRole {
} }
/// A handle to a shell surface /// A handle to a shell surface
#[derive(Debug)]
pub struct ShellSurface<R> { pub struct ShellSurface<R> {
wl_surface: wl_surface::WlSurface, wl_surface: wl_surface::WlSurface,
shell_surface: wl_shell_surface::WlShellSurface, shell_surface: wl_shell_surface::WlShellSurface,
@ -169,6 +171,7 @@ where
} }
/// Possible kinds of shell surface of the `wl_shell` protocol /// Possible kinds of shell surface of the `wl_shell` protocol
#[derive(Debug)]
pub enum ShellSurfaceKind { pub enum ShellSurfaceKind {
/// Toplevel, a regular window displayed somewhere in the compositor space /// Toplevel, a regular window displayed somewhere in the compositor space
Toplevel, Toplevel,
@ -222,6 +225,7 @@ pub enum ShellSurfaceKind {
} }
/// A request triggered by a `wl_shell_surface` /// A request triggered by a `wl_shell_surface`
#[derive(Debug)]
pub enum ShellRequest<R> { pub enum ShellRequest<R> {
/// A new shell surface was created /// A new shell surface was created
/// ///
@ -275,6 +279,7 @@ pub enum ShellRequest<R> {
/// ///
/// This state allows you to retrieve a list of surfaces /// This state allows you to retrieve a list of surfaces
/// currently known to the shell global. /// currently known to the shell global.
#[derive(Debug)]
pub struct ShellState<R> { pub struct ShellState<R> {
known_surfaces: Vec<ShellSurface<R>>, known_surfaces: Vec<ShellSurface<R>>,
} }

View File

@ -109,6 +109,7 @@ mod xdg_handlers;
mod zxdgv6_handlers; mod zxdgv6_handlers;
/// Metadata associated with the `xdg_surface` role /// Metadata associated with the `xdg_surface` role
#[derive(Debug)]
pub struct XdgSurfaceRole { pub struct XdgSurfaceRole {
/// Pending state as requested by the client /// Pending state as requested by the client
/// ///
@ -177,6 +178,7 @@ impl PositionerState {
} }
/// Contents of the pending state of a shell surface, depending on its role /// Contents of the pending state of a shell surface, depending on its role
#[derive(Debug)]
pub enum XdgSurfacePendingState { pub enum XdgSurfacePendingState {
/// This a regular, toplevel surface /// This a regular, toplevel surface
/// ///
@ -196,6 +198,7 @@ pub enum XdgSurfacePendingState {
} }
/// State of a regular toplevel surface /// State of a regular toplevel surface
#[derive(Debug)]
pub struct ToplevelState { pub struct ToplevelState {
/// Parent of this surface /// Parent of this surface
/// ///
@ -233,6 +236,7 @@ impl Clone for ToplevelState {
} }
/// The pending state of a popup surface /// The pending state of a popup surface
#[derive(Debug)]
pub struct PopupState { pub struct PopupState {
/// Parent of this popup surface /// Parent of this popup surface
pub parent: Option<wl_surface::WlSurface>, pub parent: Option<wl_surface::WlSurface>,
@ -326,6 +330,7 @@ where
/// ///
/// This state allows you to retrieve a list of surfaces /// This state allows you to retrieve a list of surfaces
/// currently known to the shell global. /// currently known to the shell global.
#[derive(Debug)]
pub struct ShellState<R> { pub struct ShellState<R> {
known_toplevels: Vec<ToplevelSurface<R>>, known_toplevels: Vec<ToplevelSurface<R>>,
known_popups: Vec<PopupSurface<R>>, known_popups: Vec<PopupSurface<R>>,
@ -350,6 +355,7 @@ where
* User interaction * User interaction
*/ */
#[derive(Debug)]
enum ShellClientKind { enum ShellClientKind {
Xdg(xdg_wm_base::XdgWmBase), Xdg(xdg_wm_base::XdgWmBase),
ZxdgV6(zxdg_shell_v6::ZxdgShellV6), ZxdgV6(zxdg_shell_v6::ZxdgShellV6),
@ -377,6 +383,7 @@ fn make_shell_client_data() -> ShellClientData {
/// ///
/// You can use this handle to access a storage for any /// You can use this handle to access a storage for any
/// client-specific data you wish to associate with it. /// client-specific data you wish to associate with it.
#[derive(Debug)]
pub struct ShellClient<R> { pub struct ShellClient<R> {
kind: ShellClientKind, kind: ShellClientKind,
_token: CompositorToken<R>, _token: CompositorToken<R>,
@ -481,13 +488,14 @@ where
} }
} }
#[derive(Clone)] #[derive(Debug, Clone)]
pub(crate) enum ToplevelKind { pub(crate) enum ToplevelKind {
Xdg(xdg_toplevel::XdgToplevel), Xdg(xdg_toplevel::XdgToplevel),
ZxdgV6(zxdg_toplevel_v6::ZxdgToplevelV6), ZxdgV6(zxdg_toplevel_v6::ZxdgToplevelV6),
} }
/// A handle to a toplevel surface /// A handle to a toplevel surface
#[derive(Debug)]
pub struct ToplevelSurface<R> { pub struct ToplevelSurface<R> {
wl_surface: wl_surface::WlSurface, wl_surface: wl_surface::WlSurface,
shell_surface: ToplevelKind, shell_surface: ToplevelKind,
@ -650,6 +658,7 @@ where
} }
} }
#[derive(Debug)]
pub(crate) enum PopupKind { pub(crate) enum PopupKind {
Xdg(xdg_popup::XdgPopup), Xdg(xdg_popup::XdgPopup),
ZxdgV6(zxdg_popup_v6::ZxdgPopupV6), ZxdgV6(zxdg_popup_v6::ZxdgPopupV6),
@ -659,6 +668,7 @@ pub(crate) enum PopupKind {
/// ///
/// This is an unified abstraction over the popup surfaces /// This is an unified abstraction over the popup surfaces
/// of both `wl_shell` and `xdg_shell`. /// of both `wl_shell` and `xdg_shell`.
#[derive(Debug)]
pub struct PopupSurface<R> { pub struct PopupSurface<R> {
wl_surface: wl_surface::WlSurface, wl_surface: wl_surface::WlSurface,
shell_surface: PopupKind, shell_surface: PopupKind,
@ -818,6 +828,7 @@ where
} }
/// A configure message for toplevel surfaces /// A configure message for toplevel surfaces
#[derive(Debug)]
pub struct ToplevelConfigure { pub struct ToplevelConfigure {
/// A suggestion for a new size for the surface /// A suggestion for a new size for the surface
pub size: Option<(i32, i32)>, pub size: Option<(i32, i32)>,
@ -835,6 +846,7 @@ pub struct ToplevelConfigure {
} }
/// A configure message for popup surface /// A configure message for popup surface
#[derive(Debug)]
pub struct PopupConfigure { pub struct PopupConfigure {
/// The position chosen for this popup relative to /// The position chosen for this popup relative to
/// its parent /// its parent
@ -855,6 +867,7 @@ pub struct PopupConfigure {
/// for you directly. /// for you directly.
/// ///
/// Depending on what you want to do, you might ignore some of them /// Depending on what you want to do, you might ignore some of them
#[derive(Debug)]
pub enum XdgRequest<R> { pub enum XdgRequest<R> {
/// A new shell client was instantiated /// A new shell client was instantiated
NewClient { NewClient {

View File

@ -82,7 +82,7 @@ use wayland_server::{
mod pool; mod pool;
#[derive(Clone)] #[derive(Debug, Clone)]
/// Internal data storage of `ShmGlobal` /// Internal data storage of `ShmGlobal`
/// ///
/// This type is only visible as type parameter of /// This type is only visible as type parameter of