fix(wayland): protocol error
This commit is contained in:
@@ -12,7 +12,7 @@ use waynest::{
|
|||||||
server::{
|
server::{
|
||||||
Client, Dispatcher, Result,
|
Client, Dispatcher, Result,
|
||||||
protocol::stable::linux_dmabuf_v1::zwp_linux_buffer_params_v1::{
|
protocol::stable::linux_dmabuf_v1::zwp_linux_buffer_params_v1::{
|
||||||
Flags, ZwpLinuxBufferParamsV1,
|
Error, Flags, ZwpLinuxBufferParamsV1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
wire::ObjectId,
|
wire::ObjectId,
|
||||||
@@ -129,7 +129,7 @@ impl ZwpLinuxBufferParamsV1 for BufferParams {
|
|||||||
async fn create_immed(
|
async fn create_immed(
|
||||||
&self,
|
&self,
|
||||||
client: &mut Client,
|
client: &mut Client,
|
||||||
_sender_id: ObjectId,
|
sender_id: ObjectId,
|
||||||
buffer_id: ObjectId,
|
buffer_id: ObjectId,
|
||||||
width: i32,
|
width: i32,
|
||||||
height: i32,
|
height: i32,
|
||||||
@@ -138,15 +138,27 @@ impl ZwpLinuxBufferParamsV1 for BufferParams {
|
|||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
// TODO: terminate client on fail, or send a fail event or something
|
// TODO: terminate client on fail, or send a fail event or something
|
||||||
// Create the buffer with DMA-BUF backing using self as the backing
|
// Create the buffer with DMA-BUF backing using self as the backing
|
||||||
_ = DmabufBacking::from_params(
|
match DmabufBacking::from_params(
|
||||||
client.get::<Self>(self.id).unwrap(),
|
client.get::<Self>(self.id).unwrap(),
|
||||||
[width as u32, height as u32].into(),
|
[width as u32, height as u32].into(),
|
||||||
DrmFourcc::try_from(format).unwrap(),
|
DrmFourcc::try_from(format).unwrap(),
|
||||||
flags,
|
flags,
|
||||||
)
|
) {
|
||||||
.inspect_err(|e| tracing::error!("Failed to import dmabuf because {e}"))
|
Ok(backing) => {
|
||||||
.map(|backing| Buffer::new(client, buffer_id, BufferBacking::Dmabuf(backing)));
|
Buffer::new(client, buffer_id, BufferBacking::Dmabuf(backing));
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
client
|
||||||
|
.protocol_error(
|
||||||
|
sender_id,
|
||||||
|
buffer_id,
|
||||||
|
Error::Incomplete as u32,
|
||||||
|
format!("Failed to import dmabuf because {e}"),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
tracing::error!("Failed to import dmabuf because {e}");
|
||||||
|
}
|
||||||
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,10 +15,7 @@ use vulkano::format::FormatFeatures;
|
|||||||
use waynest::{
|
use waynest::{
|
||||||
server::{
|
server::{
|
||||||
Client, Dispatcher, Error, Result,
|
Client, Dispatcher, Error, Result,
|
||||||
protocol::{
|
protocol::stable::linux_dmabuf_v1::zwp_linux_dmabuf_v1::ZwpLinuxDmabufV1,
|
||||||
core::wayland::wl_display::WlDisplay,
|
|
||||||
stable::linux_dmabuf_v1::zwp_linux_dmabuf_v1::ZwpLinuxDmabufV1,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
wire::ObjectId,
|
wire::ObjectId,
|
||||||
};
|
};
|
||||||
@@ -146,9 +143,7 @@ impl ZwpLinuxDmabufV1 for Dmabuf {
|
|||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
if self.version < 3 {
|
if self.version < 3 {
|
||||||
client
|
client
|
||||||
.display()
|
.protocol_error(
|
||||||
.error(
|
|
||||||
client,
|
|
||||||
sender_id,
|
sender_id,
|
||||||
id,
|
id,
|
||||||
71,
|
71,
|
||||||
|
|||||||
@@ -110,6 +110,7 @@ pub fn get_free_wayland_socket_path() -> Option<(PathBuf, FlockLock<File>)> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub enum Message {
|
pub enum Message {
|
||||||
|
Disconnect,
|
||||||
Frame(Arc<Callback>),
|
Frame(Arc<Callback>),
|
||||||
ReleaseBuffer(Arc<Buffer>),
|
ReleaseBuffer(Arc<Buffer>),
|
||||||
CloseToplevel(Arc<Toplevel>),
|
CloseToplevel(Arc<Toplevel>),
|
||||||
@@ -200,8 +201,9 @@ impl WaylandClient {
|
|||||||
async fn handle_render_message(
|
async fn handle_render_message(
|
||||||
client: &mut server::Client,
|
client: &mut server::Client,
|
||||||
message: Message,
|
message: Message,
|
||||||
) -> Result<(), waynest::server::Error> {
|
) -> Result<bool, waynest::server::Error> {
|
||||||
match message {
|
match message {
|
||||||
|
Message::Disconnect => return Ok(true),
|
||||||
Message::Frame(callback) => {
|
Message::Frame(callback) => {
|
||||||
let serial = client.next_event_serial();
|
let serial = client.next_event_serial();
|
||||||
callback.done(client, callback.0, serial).await?;
|
callback.done(client, callback.0, serial).await?;
|
||||||
@@ -211,25 +213,28 @@ impl WaylandClient {
|
|||||||
.delete_id(client, ObjectId::DISPLAY, callback.0.as_raw())
|
.delete_id(client, ObjectId::DISPLAY, callback.0.as_raw())
|
||||||
.await?;
|
.await?;
|
||||||
client.remove(callback.0);
|
client.remove(callback.0);
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
Message::ReleaseBuffer(buffer) => buffer.release(client, buffer.id).await,
|
Message::ReleaseBuffer(buffer) => {
|
||||||
Message::CloseToplevel(toplevel) => toplevel.close(client, toplevel.id).await,
|
buffer.release(client, buffer.id).await?;
|
||||||
|
}
|
||||||
|
Message::CloseToplevel(toplevel) => {
|
||||||
|
toplevel.close(client, toplevel.id).await?;
|
||||||
|
}
|
||||||
Message::ResizeToplevel { toplevel, size } => {
|
Message::ResizeToplevel { toplevel, size } => {
|
||||||
toplevel.set_size(size);
|
toplevel.set_size(size);
|
||||||
toplevel.reconfigure(client).await
|
toplevel.reconfigure(client).await?;
|
||||||
}
|
}
|
||||||
Message::SetToplevelVisualActive { toplevel, active } => {
|
Message::SetToplevelVisualActive { toplevel, active } => {
|
||||||
toplevel.set_activated(active);
|
toplevel.set_activated(active);
|
||||||
toplevel.reconfigure(client).await
|
toplevel.reconfigure(client).await?;
|
||||||
}
|
}
|
||||||
Message::Seat(seat_message) => {
|
Message::Seat(seat_message) => {
|
||||||
if let Some(seat) = client.get::<Display>(ObjectId::DISPLAY).unwrap().seat.get() {
|
if let Some(seat) = client.get::<Display>(ObjectId::DISPLAY).unwrap().seat.get() {
|
||||||
seat.handle_message(client, seat_message).await?;
|
seat.handle_message(client, seat_message).await?;
|
||||||
}
|
}
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Ok(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl Drop for WaylandClient {
|
impl Drop for WaylandClient {
|
||||||
|
|||||||
@@ -1,12 +1,22 @@
|
|||||||
#![allow(unused)]
|
#![allow(unused)]
|
||||||
|
|
||||||
use super::{MessageSink, display::Display};
|
use super::{Message, MessageSink, display::Display};
|
||||||
use std::{fmt::Debug, sync::Arc};
|
use std::{fmt::Debug, sync::Arc};
|
||||||
use waynest::{server::Client, wire::ObjectId};
|
use waynest::{
|
||||||
|
server::{Client, Result, protocol::core::wayland::wl_display::WlDisplay},
|
||||||
|
wire::ObjectId,
|
||||||
|
};
|
||||||
|
|
||||||
pub trait ClientExt {
|
pub trait ClientExt {
|
||||||
fn message_sink(&self) -> MessageSink;
|
fn message_sink(&self) -> MessageSink;
|
||||||
fn display(&self) -> Arc<Display>;
|
fn display(&self) -> Arc<Display>;
|
||||||
|
async fn protocol_error(
|
||||||
|
&mut self,
|
||||||
|
sender_id: ObjectId,
|
||||||
|
object_id: ObjectId,
|
||||||
|
code: u32,
|
||||||
|
message: String,
|
||||||
|
) -> Result<()>;
|
||||||
}
|
}
|
||||||
impl ClientExt for Client {
|
impl ClientExt for Client {
|
||||||
fn message_sink(&self) -> MessageSink {
|
fn message_sink(&self) -> MessageSink {
|
||||||
@@ -19,6 +29,21 @@ impl ClientExt for Client {
|
|||||||
fn display(&self) -> Arc<Display> {
|
fn display(&self) -> Arc<Display> {
|
||||||
self.get::<Display>(ObjectId::DISPLAY).unwrap()
|
self.get::<Display>(ObjectId::DISPLAY).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn protocol_error(
|
||||||
|
&mut self,
|
||||||
|
sender_id: ObjectId,
|
||||||
|
object_id: ObjectId,
|
||||||
|
code: u32,
|
||||||
|
message: String,
|
||||||
|
) -> Result<()> {
|
||||||
|
self.display()
|
||||||
|
.error(self, sender_id, object_id, code, message)
|
||||||
|
.await?;
|
||||||
|
let _ = self.message_sink().send(Message::Disconnect);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default)]
|
#[derive(Debug, Default)]
|
||||||
|
|||||||
Reference in New Issue
Block a user