wl_compositor: implement version 7
This commit is contained in:
parent
9b870fb8e2
commit
28e699d1b4
5 changed files with 43 additions and 2 deletions
|
|
@ -166,7 +166,7 @@ Jay supports the following wayland protocols:
|
|||
| jay_popup_ext_manager_v1 | 1 | |
|
||||
| jay_tray_v1 | 1 | |
|
||||
| org_kde_kwin_server_decoration_manager | 1 | |
|
||||
| wl_compositor | 6 | |
|
||||
| wl_compositor | 7 | |
|
||||
| wl_data_device_manager | 4 | |
|
||||
| wl_drm | 2 | |
|
||||
| wl_fixes | 1 | |
|
||||
|
|
|
|||
|
|
@ -69,6 +69,11 @@ impl WlCompositorRequestHandler for WlCompositor {
|
|||
self.client.add_client_obj(®ion)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn release(&self, _req: Release, _slf: &Rc<Self>) -> Result<(), Self::Error> {
|
||||
self.client.remove_obj(self)?;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
global_base!(WlCompositorGlobal, WlCompositor, WlCompositorError);
|
||||
|
|
@ -79,7 +84,7 @@ impl Global for WlCompositorGlobal {
|
|||
}
|
||||
|
||||
fn version(&self) -> u32 {
|
||||
6
|
||||
7
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -218,6 +218,7 @@ pub struct SurfaceBuffer {
|
|||
sync_files: SmallMap<BufferResvUser, SyncFile, 1>,
|
||||
pub release_sync: ReleaseSync,
|
||||
release: Option<SyncObjRelease>,
|
||||
_surface_release: SmallVec<[SurfaceRelease; 1]>,
|
||||
}
|
||||
|
||||
impl Drop for SurfaceBuffer {
|
||||
|
|
@ -462,6 +463,7 @@ struct PendingState {
|
|||
color_description: Option<Option<Rc<ColorDescription>>>,
|
||||
serial: Option<u64>,
|
||||
alpha_mode: Option<AlphaMode>,
|
||||
surface_release: SmallVec<[SurfaceRelease; 1]>,
|
||||
}
|
||||
|
||||
struct AttachedSubsurfaceState {
|
||||
|
|
@ -482,6 +484,7 @@ impl PendingState {
|
|||
self.acquire_point = next.acquire_point.take();
|
||||
self.release_point = next.release_point.take();
|
||||
self.explicit_sync = mem::take(&mut next.explicit_sync);
|
||||
self.surface_release = mem::take(&mut next.surface_release);
|
||||
}
|
||||
macro_rules! opt {
|
||||
($name:ident) => {
|
||||
|
|
@ -1096,6 +1099,9 @@ impl WlSurfaceRequestHandler for WlSurface {
|
|||
release.committed = true;
|
||||
}
|
||||
self.verify_explicit_sync(pending)?;
|
||||
if pending.surface_release.is_not_empty() && not_matches!(pending.buffer, Some(Some(_))) {
|
||||
return Err(WlSurfaceError::SurfaceReleaseWithoutAttach);
|
||||
}
|
||||
if ext.commit_requested(pending) == CommitAction::ContinueCommit {
|
||||
self.commit_timeline.commit(slf, pending)?;
|
||||
}
|
||||
|
|
@ -1132,6 +1138,15 @@ impl WlSurfaceRequestHandler for WlSurface {
|
|||
self.pending.borrow_mut().offset = (req.x, req.y);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_release(&self, req: GetRelease, _slf: &Rc<Self>) -> Result<(), Self::Error> {
|
||||
let cb = Rc::new(WlCallback::new(req.callback, &self.client));
|
||||
track!(self.client, cb);
|
||||
self.client.add_client_obj(&cb)?;
|
||||
let release = SurfaceRelease { cb };
|
||||
self.pending.borrow_mut().surface_release.push(release);
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl WlSurface {
|
||||
|
|
@ -1219,6 +1234,7 @@ impl WlSurface {
|
|||
sync_files: Default::default(),
|
||||
release_sync,
|
||||
release: pending.release_point.take(),
|
||||
_surface_release: mem::take(&mut pending.surface_release),
|
||||
};
|
||||
self.buffer.set(Some(Rc::new(surface_buffer)));
|
||||
} else {
|
||||
|
|
@ -2151,6 +2167,8 @@ pub enum WlSurfaceError {
|
|||
PrepareAsyncUpload(#[source] GfxError),
|
||||
#[error("Could not register a commit timeout")]
|
||||
RegisterCommitTimeout(#[source] IoUringError),
|
||||
#[error("Content update contains release callbacks but no non-null buffer")]
|
||||
SurfaceReleaseWithoutAttach,
|
||||
}
|
||||
efrom!(WlSurfaceError, ClientError);
|
||||
efrom!(WlSurfaceError, XdgSurfaceError);
|
||||
|
|
@ -2282,3 +2300,14 @@ impl Drop for SyncObjRelease {
|
|||
self.signal(None);
|
||||
}
|
||||
}
|
||||
|
||||
pub struct SurfaceRelease {
|
||||
cb: Rc<WlCallback>,
|
||||
}
|
||||
|
||||
impl Drop for SurfaceRelease {
|
||||
fn drop(&mut self) {
|
||||
self.cb.send_done(0);
|
||||
let _ = self.cb.client.remove_obj(&*self.cb);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,3 +5,6 @@ request create_surface {
|
|||
request create_region {
|
||||
id: id(wl_region) (new),
|
||||
}
|
||||
|
||||
request release (destructor, since = 7) {
|
||||
}
|
||||
|
|
|
|||
|
|
@ -64,3 +64,7 @@ event preferred_buffer_scale (since = 6) {
|
|||
event preferred_buffer_transform (since = 6) {
|
||||
transform: u32,
|
||||
}
|
||||
|
||||
request get_release (since = 7) {
|
||||
callback: id(wl_callback) (new),
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue