Use Serial type for all serials

This commit is contained in:
Mateus Carmo M de F Barbosa 2020-08-08 01:37:35 -03:00 committed by Victor Berger
parent 0a0399a339
commit 2a351d0879
12 changed files with 142 additions and 100 deletions

View File

@ -29,6 +29,7 @@ use smithay::{
XdgSurfacePendingState, XdgSurfaceRole,
},
},
Serial,
},
};
@ -61,7 +62,7 @@ impl PointerGrab for MoveSurfaceGrab {
_handle: &mut PointerInnerHandle<'_>,
location: (f64, f64),
_focus: Option<(wl_surface::WlSurface, (f64, f64))>,
_serial: u32,
_serial: Serial,
_time: u32,
) {
let dx = location.0 - self.start_data.location.0;
@ -79,7 +80,7 @@ impl PointerGrab for MoveSurfaceGrab {
handle: &mut PointerInnerHandle<'_>,
button: u32,
state: ButtonState,
serial: u32,
serial: Serial,
time: u32,
) {
handle.button(button, state, serial, time);
@ -155,7 +156,7 @@ impl PointerGrab for ResizeSurfaceGrab {
_handle: &mut PointerInnerHandle<'_>,
location: (f64, f64),
_focus: Option<(wl_surface::WlSurface, (f64, f64))>,
serial: u32,
serial: Serial,
_time: u32,
) {
let mut dx = location.0 - self.start_data.location.0;
@ -226,7 +227,7 @@ impl PointerGrab for ResizeSurfaceGrab {
handle: &mut PointerInnerHandle<'_>,
button: u32,
state: ButtonState,
serial: u32,
serial: Serial,
time: u32,
) {
handle.button(button, state, serial, time);
@ -328,7 +329,7 @@ pub fn init_shell(display: &mut Display, buffer_utils: BufferUtils, log: ::slog:
surface.send_configure(ToplevelConfigure {
size: None,
states: vec![],
serial: 42,
serial: Serial::from(42),
});
xdg_window_map
.borrow_mut()
@ -337,7 +338,7 @@ pub fn init_shell(display: &mut Display, buffer_utils: BufferUtils, log: ::slog:
XdgRequest::NewPopup { surface } => surface.send_configure(PopupConfigure {
size: (10, 10),
position: (10, 10),
serial: 42,
serial: Serial::from(42),
}),
XdgRequest::Move {
surface,
@ -453,7 +454,7 @@ pub fn init_shell(display: &mut Display, buffer_utils: BufferUtils, log: ::slog:
if let Some(serial) = waiting_for_serial {
let acked = compositor_token
.with_role_data(&surface, |role: &mut XdgSurfaceRole| {
!role.pending_configures.contains(&serial)
!role.pending_configures.contains(&serial.into())
})
.unwrap();
@ -632,7 +633,7 @@ pub enum ResizeState {
/// The surface is currently being resized.
Resizing(ResizeData),
/// The resize has finished, and the surface needs to ack the final configure.
WaitingForFinalAck(ResizeData, u32),
WaitingForFinalAck(ResizeData, Serial),
/// The resize has finished, and the surface needs to commit its final state.
WaitingForCommit(ResizeData),
}
@ -754,9 +755,9 @@ impl SurfaceData {
}
/// Send the frame callback if it had been requested
pub fn send_frame(&mut self, serial: u32) {
pub fn send_frame(&mut self, serial: Serial) {
if let Some(callback) = self.current_state.frame_callback.take() {
callback.done(serial);
callback.done(serial.into());
}
}
}

View File

@ -9,6 +9,7 @@ use smithay::{
legacy::{ShellSurface, ShellSurfaceRole},
xdg::{ToplevelSurface, XdgSurfaceRole},
},
Serial,
},
};
@ -172,7 +173,7 @@ where
/// Sends the frame callback to all the subsurfaces in this
/// window that requested it
pub fn send_frame(&self, serial: u32, ctoken: CompositorToken<R>) {
pub fn send_frame(&self, serial: Serial, ctoken: CompositorToken<R>) {
if let Some(wl_surface) = self.toplevel.get_surface() {
ctoken.with_surface_tree_downward(
wl_surface,
@ -312,7 +313,7 @@ where
.map(|w| w.geometry(self.ctoken))
}
pub fn send_frames(&self, serial: u32) {
pub fn send_frames(&self, serial: Serial) {
for window in &self.windows {
window.send_frame(serial, self.ctoken);
}

View File

@ -8,6 +8,7 @@ use wayland_server::{
use crate::wayland::{
compositor::{roles::Role, CompositorToken},
seat::{AxisFrame, GrabStartData, PointerGrab, PointerInnerHandle, Seat},
Serial,
};
use super::{with_source_metadata, DataDeviceData, DnDIconRole, SeatData};
@ -56,7 +57,7 @@ impl<R: Role<DnDIconRole> + 'static> PointerGrab for DnDGrab<R> {
_handle: &mut PointerInnerHandle<'_>,
location: (f64, f64),
focus: Option<(wl_surface::WlSurface, (f64, f64))>,
serial: u32,
serial: Serial,
time: u32,
) {
let (x, y) = location;
@ -132,7 +133,7 @@ impl<R: Role<DnDIconRole> + 'static> PointerGrab for DnDGrab<R> {
offer.source_actions(meta.dnd_action.to_raw());
})
.unwrap();
device.enter(serial, &surface, x - sx, y - sy, Some(&offer));
device.enter(serial.into(), &surface, x - sx, y - sy, Some(&offer));
self.pending_offers.push(offer);
}
self.offer_data = Some(offer_data);
@ -141,7 +142,7 @@ impl<R: Role<DnDIconRole> + 'static> PointerGrab for DnDGrab<R> {
if self.origin.as_ref().same_client_as(&surface.as_ref()) {
for device in &seat_data.known_devices {
if device.as_ref().same_client_as(&surface.as_ref()) {
device.enter(serial, &surface, x - sx, y - sy, None);
device.enter(serial.into(), &surface, x - sx, y - sy, None);
}
}
}
@ -165,7 +166,7 @@ impl<R: Role<DnDIconRole> + 'static> PointerGrab for DnDGrab<R> {
handle: &mut PointerInnerHandle<'_>,
_button: u32,
_state: wl_pointer::ButtonState,
serial: u32,
serial: Serial,
time: u32,
) {
if handle.current_pressed().is_empty() {

View File

@ -67,6 +67,7 @@ use wayland_server::{
use crate::wayland::{
compositor::{roles::Role, CompositorToken},
seat::{GrabStartData, Seat},
Serial,
};
mod data_source;
@ -342,7 +343,7 @@ pub fn set_data_device_selection(seat: &Seat, mime_types: Vec<String>) {
/// which events can be generated and what response is expected from you to them.
pub fn start_dnd<C>(
seat: &Seat,
serial: u32,
serial: Serial,
start_data: GrabStartData,
metadata: SourceMetadata,
callback: C,
@ -443,6 +444,7 @@ where
serial,
} => {
/* TODO: handle the icon */
let serial = Serial::from(serial);
if let Some(pointer) = seat.get_pointer() {
if pointer.has_grab(serial) {
if let Some(ref icon) = icon {

View File

@ -6,6 +6,7 @@ use wayland_server::{
};
use crate::wayland::seat::{AxisFrame, GrabStartData, PointerGrab, PointerInnerHandle, Seat};
use crate::wayland::Serial;
use super::{DataDeviceData, SeatData};
@ -72,7 +73,7 @@ where
_handle: &mut PointerInnerHandle<'_>,
location: (f64, f64),
focus: Option<(wl_surface::WlSurface, (f64, f64))>,
serial: u32,
serial: Serial,
time: u32,
) {
let (x, y) = location;
@ -142,7 +143,7 @@ where
offer.offer(mime_type);
}
offer.source_actions(self.metadata.dnd_action.to_raw());
device.enter(serial, &surface, x - sx, y - sy, Some(&offer));
device.enter(serial.into(), &surface, x - sx, y - sy, Some(&offer));
self.pending_offers.push(offer);
}
self.offer_data = Some(offer_data);
@ -163,7 +164,7 @@ where
handle: &mut PointerInnerHandle<'_>,
_button: u32,
_state: wl_pointer::ButtonState,
serial: u32,
serial: Serial,
time: u32,
) {
if handle.current_pressed().is_empty() {

View File

@ -1,4 +1,5 @@
use crate::backend::input::KeyState;
use crate::wayland::Serial;
use std::{
cell::RefCell,
default::Default,
@ -301,7 +302,7 @@ impl KeyboardHandle {
///
/// The module [`wayland::seat::keysyms`](::wayland::seat::keysyms) exposes definitions of all possible keysyms
/// to be compared against. This includes non-character keysyms, such as XF86 special keys.
pub fn input<F>(&self, keycode: u32, state: KeyState, serial: u32, time: u32, filter: F)
pub fn input<F>(&self, keycode: u32, state: KeyState, serial: Serial, time: u32, filter: F)
where
F: FnOnce(&ModifiersState, Keysym) -> bool,
{
@ -337,9 +338,9 @@ impl KeyboardHandle {
guard.with_focused_kbds(|kbd, _| {
// key event must be sent before modifers event for libxkbcommon
// to process them correctly
kbd.key(serial, time, keycode, wl_state);
kbd.key(serial.into(), time, keycode, wl_state);
if let Some((dep, la, lo, gr)) = modifiers {
kbd.modifiers(serial, dep, la, lo, gr);
kbd.modifiers(serial.into(), dep, la, lo, gr);
}
});
if guard.focus.is_some() {
@ -355,7 +356,7 @@ impl KeyboardHandle {
/// will be sent a [`wl_keyboard::Event::Leave`](wayland_server::protocol::wl_keyboard::Event::Leave)
/// event, and if the new focus is not `None`,
/// a [`wl_keyboard::Event::Enter`](wayland_server::protocol::wl_keyboard::Event::Enter) event will be sent.
pub fn set_focus(&self, focus: Option<&WlSurface>, serial: u32) {
pub fn set_focus(&self, focus: Option<&WlSurface>, serial: Serial) {
let mut guard = self.arc.internal.borrow_mut();
let same = guard
@ -367,7 +368,7 @@ impl KeyboardHandle {
if !same {
// unset old focus
guard.with_focused_kbds(|kbd, s| {
kbd.leave(serial, &s);
kbd.leave(serial.into(), &s);
});
// set new focus
@ -375,9 +376,9 @@ impl KeyboardHandle {
let (dep, la, lo, gr) = guard.serialize_modifiers();
let keys = guard.serialize_pressed_keys();
guard.with_focused_kbds(|kbd, surface| {
kbd.enter(serial, &surface, keys.clone());
kbd.enter(serial.into(), &surface, keys.clone());
// Modifiers must be send after enter event.
kbd.modifiers(serial, dep, la, lo, gr);
kbd.modifiers(serial.into(), dep, la, lo, gr);
});
{
let KbdInternal {

View File

@ -9,6 +9,7 @@ use wayland_server::{
};
use crate::wayland::compositor::{roles::Role, CompositorToken};
use crate::wayland::Serial;
/// The role representing a surface set as the pointer cursor
#[derive(Default, Copy, Clone)]
@ -30,7 +31,7 @@ pub enum CursorImageStatus {
enum GrabStatus {
None,
Active(u32, Box<dyn PointerGrab>),
Active(Serial, Box<dyn PointerGrab>),
Borrowed,
}
@ -138,7 +139,7 @@ impl PointerHandle {
/// Change the current grab on this pointer to the provided grab
///
/// Overwrites any current grab.
pub fn set_grab<G: PointerGrab + 'static>(&self, grab: G, serial: u32) {
pub fn set_grab<G: PointerGrab + 'static>(&self, grab: G, serial: Serial) {
self.inner.borrow_mut().grab = GrabStatus::Active(serial, Box::new(grab));
}
@ -148,7 +149,7 @@ impl PointerHandle {
}
/// Check if this pointer is currently grabbed with this serial
pub fn has_grab(&self, serial: u32) -> bool {
pub fn has_grab(&self, serial: Serial) -> bool {
let guard = self.inner.borrow_mut();
match guard.grab {
GrabStatus::Active(s, _) => s == serial,
@ -189,7 +190,7 @@ impl PointerHandle {
&self,
location: (f64, f64),
focus: Option<(WlSurface, (f64, f64))>,
serial: u32,
serial: Serial,
time: u32,
) {
let mut inner = self.inner.borrow_mut();
@ -203,7 +204,7 @@ impl PointerHandle {
///
/// This will internally send the appropriate button event to the client
/// objects matching with the currently focused surface.
pub fn button(&self, button: u32, state: ButtonState, serial: u32, time: u32) {
pub fn button(&self, button: u32, state: ButtonState, serial: Serial, time: u32) {
let mut inner = self.inner.borrow_mut();
match state {
ButtonState::Pressed => {
@ -269,7 +270,7 @@ pub trait PointerGrab {
handle: &mut PointerInnerHandle<'_>,
location: (f64, f64),
focus: Option<(WlSurface, (f64, f64))>,
serial: u32,
serial: Serial,
time: u32,
);
/// A button press was reported
@ -278,7 +279,7 @@ pub trait PointerGrab {
handle: &mut PointerInnerHandle<'_>,
button: u32,
state: ButtonState,
serial: u32,
serial: Serial,
time: u32,
);
/// An axis scroll was reported
@ -297,14 +298,14 @@ impl<'a> PointerInnerHandle<'a> {
/// Change the current grab on this pointer to the provided grab
///
/// Overwrites any current grab.
pub fn set_grab<G: PointerGrab + 'static>(&mut self, serial: u32, grab: G) {
pub fn set_grab<G: PointerGrab + 'static>(&mut self, serial: Serial, grab: G) {
self.inner.grab = GrabStatus::Active(serial, Box::new(grab));
}
/// Remove any current grab on this pointer, resetting it to the default behavior
///
/// This will also restore the focus of the underlying pointer
pub fn unset_grab(&mut self, serial: u32, time: u32) {
pub fn unset_grab(&mut self, serial: Serial, time: u32) {
self.inner.grab = GrabStatus::None;
// restore the focus
let location = self.current_location();
@ -345,7 +346,7 @@ impl<'a> PointerInnerHandle<'a> {
&mut self,
(x, y): (f64, f64),
focus: Option<(WlSurface, (f64, f64))>,
serial: u32,
serial: Serial,
time: u32,
) {
// do we leave a surface ?
@ -360,7 +361,7 @@ impl<'a> PointerInnerHandle<'a> {
}
if leave {
self.inner.with_focused_pointers(|pointer, surface| {
pointer.leave(serial, &surface);
pointer.leave(serial.into(), &surface);
if pointer.as_ref().version() >= 5 {
pointer.frame();
}
@ -377,7 +378,7 @@ impl<'a> PointerInnerHandle<'a> {
self.inner.focus = Some((surface, (sx, sy)));
if entered {
self.inner.with_focused_pointers(|pointer, surface| {
pointer.enter(serial, &surface, x - sx, y - sy);
pointer.enter(serial.into(), &surface, x - sx, y - sy);
if pointer.as_ref().version() >= 5 {
pointer.frame();
}
@ -398,9 +399,9 @@ impl<'a> PointerInnerHandle<'a> {
///
/// This will internally send the appropriate button event to the client
/// objects matching with the currently focused surface.
pub fn button(&self, button: u32, state: ButtonState, serial: u32, time: u32) {
pub fn button(&self, button: u32, state: ButtonState, serial: Serial, time: u32) {
self.inner.with_focused_pointers(|pointer, _| {
pointer.button(serial, time, button, state);
pointer.button(serial.into(), time, button, state);
if pointer.as_ref().version() >= 5 {
pointer.frame();
}
@ -639,7 +640,7 @@ impl PointerGrab for DefaultGrab {
handle: &mut PointerInnerHandle<'_>,
location: (f64, f64),
focus: Option<(WlSurface, (f64, f64))>,
serial: u32,
serial: Serial,
time: u32,
) {
handle.motion(location, focus, serial, time);
@ -649,7 +650,7 @@ impl PointerGrab for DefaultGrab {
handle: &mut PointerInnerHandle<'_>,
button: u32,
state: ButtonState,
serial: u32,
serial: Serial,
time: u32,
) {
handle.button(button, state, serial, time);
@ -687,7 +688,7 @@ impl PointerGrab for ClickGrab {
handle: &mut PointerInnerHandle<'_>,
location: (f64, f64),
_focus: Option<(WlSurface, (f64, f64))>,
serial: u32,
serial: Serial,
time: u32,
) {
handle.motion(location, self.start_data.focus.clone(), serial, time);
@ -697,7 +698,7 @@ impl PointerGrab for ClickGrab {
handle: &mut PointerInnerHandle<'_>,
button: u32,
state: ButtonState,
serial: u32,
serial: Serial,
time: u32,
) {
handle.button(button, state, serial, time);

View File

@ -67,6 +67,7 @@ use std::{
};
use crate::wayland::compositor::{roles::Role, CompositorToken};
use crate::wayland::Serial;
use wayland_server::{
protocol::{wl_output, wl_seat, wl_shell, wl_shell_surface, wl_surface},
@ -81,7 +82,7 @@ pub struct ShellSurfaceRole {
pub title: String,
/// Class of the surface
pub class: String,
pending_ping: u32,
pending_ping: Serial,
}
/// A handle to a shell surface
@ -136,12 +137,12 @@ where
/// down to 0 before a pong is received, mark the client as unresponsive.
///
/// Fails if this shell client already has a pending ping or is already dead.
pub fn send_ping(&self, serial: u32) -> Result<(), ()> {
pub fn send_ping(&self, serial: Serial) -> Result<(), ()> {
if !self.alive() {
return Err(());
}
let ret = self.token.with_role_data(&self.wl_surface, |data| {
if data.pending_ping == 0 {
if data.pending_ping == Serial::from(0) {
data.pending_ping = serial;
true
} else {
@ -149,7 +150,7 @@ where
}
});
if let Ok(true) = ret {
self.shell_surface.ping(serial);
self.shell_surface.ping(serial.into());
Ok(())
} else {
Err(())
@ -201,7 +202,7 @@ pub enum ShellSurfaceKind {
parent: wl_surface::WlSurface,
/// The serial of the input event triggering the creation of this
/// popup
serial: u32,
serial: Serial,
/// Wether this popup should be marked as inactive
inactive: bool,
/// Location of the popup relative to its parent
@ -244,7 +245,7 @@ pub enum ShellRequest<R> {
/// The surface requesting the move
surface: ShellSurface<R>,
/// Serial of the implicit grab that initiated the move
serial: u32,
serial: Serial,
/// Seat associated with the move
seat: wl_seat::WlSeat,
},
@ -255,7 +256,7 @@ pub enum ShellRequest<R> {
/// The surface requesting the resize
surface: ShellSurface<R>,
/// Serial of the implicit grab that initiated the resize
serial: u32,
serial: Serial,
/// Seat associated with the resize
seat: wl_seat::WlSeat,
/// Direction of the resize

View File

@ -11,6 +11,7 @@ use wayland_server::{
};
use crate::wayland::compositor::{roles::Role, CompositorToken};
use crate::wayland::Serial;
use super::{ShellRequest, ShellState, ShellSurface, ShellSurfaceKind, ShellSurfaceRole};
@ -31,7 +32,7 @@ pub(crate) fn implement_shell<R, Impl>(
let role_data = ShellSurfaceRole {
title: "".into(),
class: "".into(),
pending_ping: 0,
pending_ping: Serial::from(0),
};
if ctoken.give_role_with(&surface, role_data).is_err() {
shell
@ -98,10 +99,11 @@ where
let mut user_impl = implementation.borrow_mut();
match req {
Request::Pong { serial } => {
let serial = Serial::from(serial);
let valid = ctoken
.with_role_data(&data.surface, |data| {
if data.pending_ping == serial {
data.pending_ping = 0;
data.pending_ping = Serial::from(0);
true
} else {
false
@ -114,17 +116,23 @@ where
});
}
}
Request::Move { seat, serial } => (&mut *user_impl)(ShellRequest::Move {
Request::Move { seat, serial } => {
let serial = Serial::from(serial);
(&mut *user_impl)(ShellRequest::Move {
surface: make_handle(&shell_surface, ctoken),
serial,
seat,
}),
Request::Resize { seat, serial, edges } => (&mut *user_impl)(ShellRequest::Resize {
})
}
Request::Resize { seat, serial, edges } => {
let serial = Serial::from(serial);
(&mut *user_impl)(ShellRequest::Resize {
surface: make_handle(&shell_surface, ctoken),
serial,
seat,
edges,
}),
})
}
Request::SetToplevel => (&mut *user_impl)(ShellRequest::SetKind {
surface: make_handle(&shell_surface, ctoken),
kind: ShellSurfaceKind::Toplevel,
@ -156,7 +164,9 @@ where
x,
y,
flags,
} => (&mut *user_impl)(ShellRequest::SetKind {
} => {
let serial = Serial::from(serial);
(&mut *user_impl)(ShellRequest::SetKind {
surface: make_handle(&shell_surface, ctoken),
kind: ShellSurfaceKind::Popup {
parent,
@ -165,7 +175,8 @@ where
location: (x, y),
inactive: flags.contains(wl_shell_surface::Transient::Inactive),
},
}),
})
}
Request::SetMaximized { output } => (&mut *user_impl)(ShellRequest::SetKind {
surface: make_handle(&shell_surface, ctoken),
kind: ShellSurfaceKind::Maximized { output },

View File

@ -88,6 +88,7 @@
use crate::utils::Rectangle;
use crate::wayland::compositor::{roles::Role, CompositorToken};
use crate::wayland::Serial;
use std::{
cell::RefCell,
rc::Rc,
@ -355,13 +356,13 @@ enum ShellClientKind {
}
pub(crate) struct ShellClientData {
pending_ping: u32,
pending_ping: Serial,
data: UserDataMap,
}
fn make_shell_client_data() -> ShellClientData {
ShellClientData {
pending_ping: 0,
pending_ping: Serial::from(0),
data: UserDataMap::new(),
}
}
@ -414,7 +415,7 @@ where
/// down to 0 before a pong is received, mark the client as unresponsive.
///
/// Fails if this shell client already has a pending ping or is already dead.
pub fn send_ping(&self, serial: u32) -> Result<(), ()> {
pub fn send_ping(&self, serial: Serial) -> Result<(), ()> {
if !self.alive() {
return Err(());
}
@ -426,11 +427,11 @@ where
.get::<self::xdg_handlers::ShellUserData<R>>()
.unwrap();
let mut guard = user_data.client_data.lock().unwrap();
if guard.pending_ping == 0 {
if guard.pending_ping == Serial::from(0) {
return Err(());
}
guard.pending_ping = serial;
shell.ping(serial);
shell.ping(serial.into());
}
ShellClientKind::ZxdgV6(ref shell) => {
let user_data = shell
@ -439,11 +440,11 @@ where
.get::<self::zxdgv6_handlers::ShellUserData<R>>()
.unwrap();
let mut guard = user_data.client_data.lock().unwrap();
if guard.pending_ping == 0 {
if guard.pending_ping == Serial::from(0) {
return Err(());
}
guard.pending_ping = serial;
shell.ping(serial);
shell.ping(serial.into());
}
}
Ok(())
@ -830,7 +831,7 @@ pub struct ToplevelConfigure {
/// This should be an ever increasing number, as the ACK-ing
/// from a client for a serial will validate all pending lower
/// serials.
pub serial: u32,
pub serial: Serial,
}
/// A configure message for popup surface
@ -845,7 +846,7 @@ pub struct PopupConfigure {
/// This should be an ever increasing number, as the ACK-ing
/// from a client for a serial will validate all pending lower
/// serials.
pub serial: u32,
pub serial: Serial,
}
/// Events generated by xdg shell surfaces
@ -891,7 +892,7 @@ pub enum XdgRequest<R> {
/// the seat associated to this move
seat: wl_seat::WlSeat,
/// the grab serial
serial: u32,
serial: Serial,
},
/// The client requested the start of an interactive resize for this surface
Resize {
@ -900,7 +901,7 @@ pub enum XdgRequest<R> {
/// The seat associated with this resize
seat: wl_seat::WlSeat,
/// The grab serial
serial: u32,
serial: Serial,
/// Specification of which part of the window's border is being dragged
edges: xdg_toplevel::ResizeEdge,
},
@ -914,7 +915,7 @@ pub enum XdgRequest<R> {
/// The seat to grab
seat: wl_seat::WlSeat,
/// The grab serial
serial: u32,
serial: Serial,
},
/// A toplevel surface requested to be maximized
Maximize {
@ -953,7 +954,7 @@ pub enum XdgRequest<R> {
/// The seat associated with this input grab
seat: wl_seat::WlSeat,
/// the grab serial
serial: u32,
serial: Serial,
/// location of the menu request
location: (i32, i32),
},
@ -962,6 +963,6 @@ pub enum XdgRequest<R> {
/// The surface.
surface: wl_surface::WlSurface,
/// The configure serial.
serial: u32,
serial: Serial,
},
}

View File

@ -1,6 +1,7 @@
use std::{cell::RefCell, ops::Deref as _, sync::Mutex};
use crate::wayland::compositor::{roles::*, CompositorToken};
use crate::wayland::Serial;
use wayland_protocols::xdg_shell::server::{
xdg_popup, xdg_positioner, xdg_surface, xdg_toplevel, xdg_wm_base,
};
@ -94,10 +95,11 @@ where
});
}
xdg_wm_base::Request::Pong { serial } => {
let serial = Serial::from(serial);
let valid = {
let mut guard = data.client_data.lock().unwrap();
if guard.pending_ping == serial {
guard.pending_ping = 0;
guard.pending_ping = Serial::from(0);
true
} else {
false
@ -344,6 +346,7 @@ where
.expect("xdg_surface exists but surface has not shell_surface role?!");
let mut user_impl = data.shell_data.user_impl.borrow_mut();
let serial = Serial::from(serial);
(&mut *user_impl)(XdgRequest::AckConfigure {
surface: data.wl_surface.clone(),
serial,
@ -405,11 +408,13 @@ where
};
let serial = configure.serial;
resource.configure(width, height, states);
data.xdg_surface.configure(serial);
data.xdg_surface.configure(serial.into());
// Add the configure as pending
data.shell_data
.compositor_token
.with_role_data::<XdgSurfaceRole, _, _>(&data.wl_surface, |data| data.pending_configures.push(serial))
.with_role_data::<XdgSurfaceRole, _, _>(&data.wl_surface, |data| {
data.pending_configures.push(serial.into())
})
.expect("xdg_toplevel exists but surface has not shell_surface role?!");
}
@ -464,6 +469,7 @@ where
}
xdg_toplevel::Request::ShowWindowMenu { seat, serial, x, y } => {
let handle = make_toplevel_handle(&toplevel);
let serial = Serial::from(serial);
let mut user_impl = data.shell_data.user_impl.borrow_mut();
(&mut *user_impl)(XdgRequest::ShowWindowMenu {
surface: handle,
@ -474,6 +480,7 @@ where
}
xdg_toplevel::Request::Move { seat, serial } => {
let handle = make_toplevel_handle(&toplevel);
let serial = Serial::from(serial);
let mut user_impl = data.shell_data.user_impl.borrow_mut();
(&mut *user_impl)(XdgRequest::Move {
surface: handle,
@ -484,6 +491,7 @@ where
xdg_toplevel::Request::Resize { seat, serial, edges } => {
let handle = make_toplevel_handle(&toplevel);
let mut user_impl = data.shell_data.user_impl.borrow_mut();
let serial = Serial::from(serial);
(&mut *user_impl)(XdgRequest::Resize {
surface: handle,
seat,
@ -581,11 +589,13 @@ where
let (width, height) = configure.size;
let serial = configure.serial;
resource.configure(x, y, width, height);
data.xdg_surface.configure(serial);
data.xdg_surface.configure(serial.into());
// Add the configure as pending
data.shell_data
.compositor_token
.with_role_data::<XdgSurfaceRole, _, _>(&data.wl_surface, |data| data.pending_configures.push(serial))
.with_role_data::<XdgSurfaceRole, _, _>(&data.wl_surface, |data| {
data.pending_configures.push(serial.into())
})
.expect("xdg_toplevel exists but surface has not shell_surface role?!");
}
@ -618,6 +628,7 @@ where
xdg_popup::Request::Grab { seat, serial } => {
let handle = make_popup_handle(&popup);
let mut user_impl = data.shell_data.user_impl.borrow_mut();
let serial = Serial::from(serial);
(&mut *user_impl)(XdgRequest::Grab {
surface: handle,
seat,

View File

@ -1,6 +1,7 @@
use std::{cell::RefCell, ops::Deref as _, sync::Mutex};
use crate::wayland::compositor::{roles::*, CompositorToken};
use crate::wayland::Serial;
use wayland_protocols::{
unstable::xdg_shell::v6::server::{
zxdg_popup_v6, zxdg_positioner_v6, zxdg_shell_v6, zxdg_surface_v6, zxdg_toplevel_v6,
@ -99,8 +100,8 @@ where
zxdg_shell_v6::Request::Pong { serial } => {
let valid = {
let mut guard = data.client_data.lock().unwrap();
if guard.pending_ping == serial {
guard.pending_ping = 0;
if guard.pending_ping == Serial::from(serial) {
guard.pending_ping = Serial::from(0);
true
} else {
false
@ -362,6 +363,7 @@ fn xdg_surface_implementation<R>(
.expect("xdg_surface exists but surface has not shell_surface role?!");
let mut user_impl = data.shell_data.user_impl.borrow_mut();
let serial = Serial::from(serial);
(&mut *user_impl)(XdgRequest::AckConfigure {
surface: data.wl_surface.clone(),
serial,
@ -423,11 +425,13 @@ where
};
let serial = configure.serial;
resource.configure(width, height, states);
data.xdg_surface.configure(serial);
data.xdg_surface.configure(serial.into());
// Add the configure as pending
data.shell_data
.compositor_token
.with_role_data::<XdgSurfaceRole, _, _>(&data.wl_surface, |data| data.pending_configures.push(serial))
.with_role_data::<XdgSurfaceRole, _, _>(&data.wl_surface, |data| {
data.pending_configures.push(serial.into())
})
.expect("xdg_toplevel exists but surface has not shell_surface role?!");
}
@ -484,6 +488,7 @@ where
zxdg_toplevel_v6::Request::ShowWindowMenu { seat, serial, x, y } => {
let handle = make_toplevel_handle(&toplevel);
let mut user_impl = data.shell_data.user_impl.borrow_mut();
let serial = Serial::from(serial);
(&mut *user_impl)(XdgRequest::ShowWindowMenu {
surface: handle,
seat,
@ -494,6 +499,7 @@ where
zxdg_toplevel_v6::Request::Move { seat, serial } => {
let handle = make_toplevel_handle(&toplevel);
let mut user_impl = data.shell_data.user_impl.borrow_mut();
let serial = Serial::from(serial);
(&mut *user_impl)(XdgRequest::Move {
surface: handle,
seat,
@ -505,6 +511,7 @@ where
zxdg_toplevel_v6::ResizeEdge::from_raw(edges).unwrap_or(zxdg_toplevel_v6::ResizeEdge::None);
let handle = make_toplevel_handle(&toplevel);
let mut user_impl = data.shell_data.user_impl.borrow_mut();
let serial = Serial::from(serial);
(&mut *user_impl)(XdgRequest::Resize {
surface: handle,
seat,
@ -602,11 +609,13 @@ where
let (width, height) = configure.size;
let serial = configure.serial;
resource.configure(x, y, width, height);
data.xdg_surface.configure(serial);
data.xdg_surface.configure(serial.into());
// Add the configure as pending
data.shell_data
.compositor_token
.with_role_data::<XdgSurfaceRole, _, _>(&data.wl_surface, |data| data.pending_configures.push(serial))
.with_role_data::<XdgSurfaceRole, _, _>(&data.wl_surface, |data| {
data.pending_configures.push(serial.into())
})
.expect("xdg_toplevel exists but surface has not shell_surface role?!");
}
@ -639,6 +648,7 @@ where
zxdg_popup_v6::Request::Grab { seat, serial } => {
let handle = make_popup_handle(&popup);
let mut user_impl = data.shell_data.user_impl.borrow_mut();
let serial = Serial::from(serial);
(&mut *user_impl)(XdgRequest::Grab {
surface: handle,
seat,