wayland: implement wl_surface v5
This commit is contained in:
parent
bc5de5188f
commit
0bd61bc242
2 changed files with 31 additions and 9 deletions
|
|
@ -20,7 +20,7 @@ pub struct WlCompositorGlobal {
|
||||||
pub struct WlCompositor {
|
pub struct WlCompositor {
|
||||||
id: WlCompositorId,
|
id: WlCompositorId,
|
||||||
client: Rc<Client>,
|
client: Rc<Client>,
|
||||||
_version: u32,
|
version: u32,
|
||||||
pub tracker: Tracker<Self>,
|
pub tracker: Tracker<Self>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -38,7 +38,7 @@ impl WlCompositorGlobal {
|
||||||
let obj = Rc::new(WlCompositor {
|
let obj = Rc::new(WlCompositor {
|
||||||
id,
|
id,
|
||||||
client: client.clone(),
|
client: client.clone(),
|
||||||
_version: version,
|
version,
|
||||||
tracker: Default::default(),
|
tracker: Default::default(),
|
||||||
});
|
});
|
||||||
track!(client, obj);
|
track!(client, obj);
|
||||||
|
|
@ -50,7 +50,7 @@ impl WlCompositorGlobal {
|
||||||
impl WlCompositor {
|
impl WlCompositor {
|
||||||
fn create_surface(&self, parser: MsgParser<'_, '_>) -> Result<(), WlCompositorError> {
|
fn create_surface(&self, parser: MsgParser<'_, '_>) -> Result<(), WlCompositorError> {
|
||||||
let surface: CreateSurface = self.client.parse(self, parser)?;
|
let surface: CreateSurface = self.client.parse(self, parser)?;
|
||||||
let surface = Rc::new(WlSurface::new(surface.id, &self.client));
|
let surface = Rc::new(WlSurface::new(surface.id, &self.client, self.version));
|
||||||
track!(self.client, surface);
|
track!(self.client, surface);
|
||||||
self.client.add_client_obj(&surface)?;
|
self.client.add_client_obj(&surface)?;
|
||||||
if self.client.is_xwayland {
|
if self.client.is_xwayland {
|
||||||
|
|
@ -80,7 +80,7 @@ impl Global for WlCompositorGlobal {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn version(&self) -> u32 {
|
fn version(&self) -> u32 {
|
||||||
4
|
5
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -75,6 +75,8 @@ const INVALID_TRANSFORM: u32 = 1;
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
const INVALID_SIZE: u32 = 2;
|
const INVALID_SIZE: u32 = 2;
|
||||||
|
|
||||||
|
const OFFSET_SINCE: u32 = 5;
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, PartialEq)]
|
#[derive(Copy, Clone, Debug, PartialEq)]
|
||||||
enum Transform {
|
enum Transform {
|
||||||
Normal,
|
Normal,
|
||||||
|
|
@ -252,6 +254,7 @@ pub struct WlSurface {
|
||||||
xwayland_serial: Cell<Option<u64>>,
|
xwayland_serial: Cell<Option<u64>>,
|
||||||
tearing_control: CloneCell<Option<Rc<WpTearingControlV1>>>,
|
tearing_control: CloneCell<Option<Rc<WpTearingControlV1>>>,
|
||||||
tearing: Cell<bool>,
|
tearing: Cell<bool>,
|
||||||
|
version: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Debug for WlSurface {
|
impl Debug for WlSurface {
|
||||||
|
|
@ -333,7 +336,8 @@ impl SurfaceExt for NoneSurfaceExt {
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct PendingState {
|
struct PendingState {
|
||||||
buffer: Cell<Option<Option<(i32, i32, Rc<WlBuffer>)>>>,
|
buffer: Cell<Option<Option<Rc<WlBuffer>>>>,
|
||||||
|
offset: Cell<(i32, i32)>,
|
||||||
opaque_region: Cell<Option<Option<Rc<Region>>>>,
|
opaque_region: Cell<Option<Option<Rc<Region>>>>,
|
||||||
input_region: Cell<Option<Option<Rc<Region>>>>,
|
input_region: Cell<Option<Option<Rc<Region>>>>,
|
||||||
frame_request: RefCell<Vec<Rc<WlCallback>>>,
|
frame_request: RefCell<Vec<Rc<WlCallback>>>,
|
||||||
|
|
@ -360,7 +364,7 @@ pub struct StackElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WlSurface {
|
impl WlSurface {
|
||||||
pub fn new(id: WlSurfaceId, client: &Rc<Client>) -> Self {
|
pub fn new(id: WlSurfaceId, client: &Rc<Client>, version: u32) -> Self {
|
||||||
Self {
|
Self {
|
||||||
id,
|
id,
|
||||||
node_id: client.state.node_ids.next(),
|
node_id: client.state.node_ids.next(),
|
||||||
|
|
@ -399,6 +403,7 @@ impl WlSurface {
|
||||||
xwayland_serial: Default::default(),
|
xwayland_serial: Default::default(),
|
||||||
tearing_control: Default::default(),
|
tearing_control: Default::default(),
|
||||||
tearing: Cell::new(false),
|
tearing: Cell::new(false),
|
||||||
|
version,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -640,8 +645,15 @@ impl WlSurface {
|
||||||
|
|
||||||
fn attach(self: &Rc<Self>, parser: MsgParser<'_, '_>) -> Result<(), WlSurfaceError> {
|
fn attach(self: &Rc<Self>, parser: MsgParser<'_, '_>) -> Result<(), WlSurfaceError> {
|
||||||
let req: Attach = self.parse(parser)?;
|
let req: Attach = self.parse(parser)?;
|
||||||
|
if self.version >= OFFSET_SINCE {
|
||||||
|
if req.x != 0 || req.y != 0 {
|
||||||
|
return Err(WlSurfaceError::OffsetInAttach);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.pending.offset.set((req.x, req.y));
|
||||||
|
}
|
||||||
let buf = if req.buffer.is_some() {
|
let buf = if req.buffer.is_some() {
|
||||||
Some((req.x, req.y, self.client.lookup(req.buffer)?))
|
Some(self.client.lookup(req.buffer)?)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
@ -729,6 +741,7 @@ impl WlSurface {
|
||||||
}
|
}
|
||||||
let mut buffer_changed = false;
|
let mut buffer_changed = false;
|
||||||
let mut old_raw_size = None;
|
let mut old_raw_size = None;
|
||||||
|
let (dx, dy) = self.pending.offset.take();
|
||||||
if let Some(buffer_change) = self.pending.buffer.take() {
|
if let Some(buffer_change) = self.pending.buffer.take() {
|
||||||
buffer_changed = true;
|
buffer_changed = true;
|
||||||
if let Some(buffer) = self.buffer.take() {
|
if let Some(buffer) = self.buffer.take() {
|
||||||
|
|
@ -737,7 +750,7 @@ impl WlSurface {
|
||||||
buffer.send_release();
|
buffer.send_release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if let Some((dx, dy, buffer)) = buffer_change {
|
if let Some(buffer) = buffer_change {
|
||||||
let _ = buffer.update_texture();
|
let _ = buffer.update_texture();
|
||||||
self.buffer.set(Some(buffer));
|
self.buffer.set(Some(buffer));
|
||||||
self.buf_x.fetch_add(dx);
|
self.buf_x.fetch_add(dx);
|
||||||
|
|
@ -909,6 +922,12 @@ impl WlSurface {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn offset(&self, parser: MsgParser<'_, '_>) -> Result<(), WlSurfaceError> {
|
||||||
|
let req: Offset = self.parse(parser)?;
|
||||||
|
self.pending.offset.set((req.x, req.y));
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
fn find_surface_at(self: &Rc<Self>, x: i32, y: i32) -> Option<(Rc<Self>, i32, i32)> {
|
fn find_surface_at(self: &Rc<Self>, x: i32, y: i32) -> Option<(Rc<Self>, i32, i32)> {
|
||||||
let rect = self.buffer_abs_pos.get().at_point(0, 0);
|
let rect = self.buffer_abs_pos.get().at_point(0, 0);
|
||||||
let children = self.children.borrow();
|
let children = self.children.borrow();
|
||||||
|
|
@ -1033,11 +1052,12 @@ object_base! {
|
||||||
SET_BUFFER_TRANSFORM => set_buffer_transform,
|
SET_BUFFER_TRANSFORM => set_buffer_transform,
|
||||||
SET_BUFFER_SCALE => set_buffer_scale,
|
SET_BUFFER_SCALE => set_buffer_scale,
|
||||||
DAMAGE_BUFFER => damage_buffer,
|
DAMAGE_BUFFER => damage_buffer,
|
||||||
|
OFFSET => offset,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Object for WlSurface {
|
impl Object for WlSurface {
|
||||||
fn num_requests(&self) -> u32 {
|
fn num_requests(&self) -> u32 {
|
||||||
DAMAGE_BUFFER + 1
|
OFFSET + 1
|
||||||
}
|
}
|
||||||
|
|
||||||
fn break_loops(&self) {
|
fn break_loops(&self) {
|
||||||
|
|
@ -1227,6 +1247,8 @@ pub enum WlSurfaceError {
|
||||||
NonIntegerViewportSize,
|
NonIntegerViewportSize,
|
||||||
#[error("Viewport source is not contained in the attached buffer")]
|
#[error("Viewport source is not contained in the attached buffer")]
|
||||||
ViewportOutsideBuffer,
|
ViewportOutsideBuffer,
|
||||||
|
#[error("attach request must not contain offset")]
|
||||||
|
OffsetInAttach,
|
||||||
}
|
}
|
||||||
efrom!(WlSurfaceError, ClientError);
|
efrom!(WlSurfaceError, ClientError);
|
||||||
efrom!(WlSurfaceError, XdgSurfaceError);
|
efrom!(WlSurfaceError, XdgSurfaceError);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue