use crate::buffer::BufferHandle;
use crate::geometry::Size;
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Default)]
pub struct SurfaceId(pub u32);
impl SurfaceId {
#[inline]
pub const fn new(id: u32) -> Self {
Self(id)
}
pub const INVALID: Self = Self(0);
#[inline]
pub const fn is_valid(&self) -> bool {
self.0 != 0
}
}
#[repr(u8)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Default, Hash)]
pub enum SurfaceType {
#[default]
Toplevel = 0,
Popup = 1,
Subsurface = 2,
Dnd = 3,
}
impl SurfaceType {
#[inline]
pub fn from_u8(value: u8) -> Option<Self> {
match value {
0 => Some(Self::Toplevel),
1 => Some(Self::Popup),
2 => Some(Self::Subsurface),
3 => Some(Self::Dnd),
_ => None,
}
}
#[inline]
pub const fn name(&self) -> &'static str {
match self {
Self::Toplevel => "Toplevel",
Self::Popup => "Popup",
Self::Subsurface => "Subsurface",
Self::Dnd => "Dnd",
}
}
}
#[repr(u8)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Default, Hash)]
pub enum BufferMode {
Single = 1,
#[default]
Double = 2,
Triple = 3,
}
impl BufferMode {
#[inline]
pub fn from_u8(value: u8) -> Option<Self> {
match value {
1 => Some(Self::Single),
2 => Some(Self::Double),
3 => Some(Self::Triple),
_ => None,
}
}
#[inline]
pub const fn buffer_count(&self) -> usize {
*self as usize
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug, Default)]
pub struct SurfaceConfig {
pub size: Size,
pub surface_type: SurfaceType,
pub buffer_mode: BufferMode,
pub parent: SurfaceId,
}
impl SurfaceConfig {
#[inline]
pub const fn new(width: u32, height: u32) -> Self {
Self {
size: Size::new(width, height),
surface_type: SurfaceType::Toplevel,
buffer_mode: BufferMode::Double,
parent: SurfaceId::INVALID,
}
}
#[inline]
pub const fn with_type(mut self, stype: SurfaceType) -> Self {
self.surface_type = stype;
self
}
#[inline]
pub const fn with_parent(mut self, parent: SurfaceId) -> Self {
self.parent = parent;
self
}
#[inline]
pub const fn with_buffer_mode(mut self, mode: BufferMode) -> Self {
self.buffer_mode = mode;
self
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug, Default)]
pub struct SurfaceCommit {
pub buffer: BufferHandle,
pub scale: u32,
pub offset_x: i32,
pub offset_y: i32,
}
impl SurfaceCommit {
#[inline]
pub const fn new(buffer: BufferHandle) -> Self {
Self {
buffer,
scale: 1,
offset_x: 0,
offset_y: 0,
}
}
#[inline]
pub const fn with_scale(mut self, scale: u32) -> Self {
self.scale = scale;
self
}
#[inline]
pub const fn with_offset(mut self, x: i32, y: i32) -> Self {
self.offset_x = x;
self.offset_y = y;
self
}
}