use wayland_client::{
QueueHandle, WEnum,
globals::GlobalList,
protocol::{
wl_buffer::WlBuffer,
wl_output::WlOutput,
wl_pointer::{self, ButtonState, WlPointer},
wl_shm::WlShm,
},
};
use crate::id::Id;
use crate::xkb_keyboard::KeyEvent;
use super::WindowState;
use crate::keyboard::ModifiersState;
use std::{fmt::Debug, fs::File};
#[derive(Debug)]
pub enum SessionLockEvent<'a, T, Message> {
InitRequest,
BindProvide(&'a GlobalList, &'a QueueHandle<WindowState<T>>),
RequestBuffer(
&'a mut File,
&'a WlShm,
&'a QueueHandle<WindowState<T>>,
u32,
u32,
),
RequestMessages(&'a DispatchMessage),
NormalDispatch,
UserEvent(Message),
}
#[derive(Debug, PartialEq, Eq)]
pub enum ReturnData {
WlBuffer(WlBuffer),
RequestBind,
RequestUnlockAndExist,
RedrawAllRequest,
RedrawIndexRequest(Id),
RequestSetCursorShape((String, WlPointer)),
None,
}
#[derive(Default, Debug, Clone, Copy, PartialEq)]
pub struct AxisScroll {
pub absolute: f64,
pub discrete: i32,
pub stop: bool,
}
#[allow(unused)]
#[derive(Debug, Clone)]
pub(crate) enum DispatchMessageInner {
NewDisplay(WlOutput),
MouseButton {
state: WEnum<ButtonState>,
serial: u32,
button: u32,
time: u32,
},
MouseLeave,
MouseEnter {
pointer: WlPointer,
serial: u32,
surface_x: f64,
surface_y: f64,
},
MouseMotion {
time: u32,
surface_x: f64,
surface_y: f64,
},
Axis {
time: u32,
scale: f64,
horizontal: AxisScroll,
vertical: AxisScroll,
source: Option<wl_pointer::AxisSource>,
},
TouchDown {
serial: u32,
time: u32,
id: i32,
x: f64,
y: f64,
},
TouchUp {
serial: u32,
time: u32,
id: i32,
x: f64,
y: f64,
},
TouchMotion {
time: u32,
id: i32,
x: f64,
y: f64,
},
TouchCancel {
id: i32,
x: f64,
y: f64,
},
Focused(Id),
UnFocused,
ModifiersChanged(ModifiersState),
KeyboardInput {
event: KeyEvent,
is_synthetic: bool,
},
PreferredScale {
scale_float: f64,
scale_u32: u32,
},
}
#[derive(Debug)]
pub enum DispatchMessage {
MouseButton {
state: WEnum<ButtonState>,
serial: u32,
button: u32,
time: u32,
},
MouseLeave,
MouseEnter {
pointer: WlPointer,
serial: u32,
surface_x: f64,
surface_y: f64,
},
MouseMotion {
time: u32,
surface_x: f64,
surface_y: f64,
},
Axis {
time: u32,
scale: f64,
horizontal: AxisScroll,
vertical: AxisScroll,
source: Option<wl_pointer::AxisSource>,
},
TouchDown {
serial: u32,
time: u32,
id: i32,
x: f64,
y: f64,
},
TouchUp {
serial: u32,
time: u32,
id: i32,
x: f64,
y: f64,
},
TouchMotion {
time: u32,
id: i32,
x: f64,
y: f64,
},
TouchCancel {
id: i32,
x: f64,
y: f64,
},
Focused(Id),
Unfocus,
ModifiersChanged(ModifiersState),
KeyboardInput {
event: KeyEvent,
is_synthetic: bool,
},
RequestRefresh {
width: u32,
height: u32,
scale_float: f64,
},
PreferredScale {
scale_float: f64,
scale_u32: u32,
},
Closed,
}
impl From<DispatchMessageInner> for DispatchMessage {
fn from(val: DispatchMessageInner) -> Self {
match val {
DispatchMessageInner::NewDisplay(_) => unimplemented!(),
DispatchMessageInner::MouseButton {
state,
serial,
button,
time,
} => DispatchMessage::MouseButton {
state,
serial,
button,
time,
},
DispatchMessageInner::MouseLeave => DispatchMessage::MouseLeave,
DispatchMessageInner::MouseEnter {
pointer,
serial,
surface_x,
surface_y,
} => DispatchMessage::MouseEnter {
pointer,
serial,
surface_x,
surface_y,
},
DispatchMessageInner::MouseMotion {
time,
surface_x,
surface_y,
} => DispatchMessage::MouseMotion {
time,
surface_x,
surface_y,
},
DispatchMessageInner::TouchDown {
serial,
time,
id,
x,
y,
} => DispatchMessage::TouchDown {
serial,
time,
id,
x,
y,
},
DispatchMessageInner::TouchUp {
serial,
time,
id,
x,
y,
} => DispatchMessage::TouchUp {
serial,
time,
id,
x,
y,
},
DispatchMessageInner::TouchMotion { time, id, x, y } => {
DispatchMessage::TouchMotion { time, id, x, y }
}
DispatchMessageInner::TouchCancel { id, x, y } => {
DispatchMessage::TouchCancel { id, x, y }
}
DispatchMessageInner::Axis {
time,
scale,
horizontal,
vertical,
source,
} => DispatchMessage::Axis {
time,
scale,
horizontal,
vertical,
source,
},
DispatchMessageInner::ModifiersChanged(modifier) => {
DispatchMessage::ModifiersChanged(modifier)
}
DispatchMessageInner::KeyboardInput {
event,
is_synthetic,
} => DispatchMessage::KeyboardInput {
event,
is_synthetic,
},
DispatchMessageInner::PreferredScale {
scale_float,
scale_u32,
} => DispatchMessage::PreferredScale {
scale_float,
scale_u32,
},
DispatchMessageInner::UnFocused => DispatchMessage::Unfocus,
DispatchMessageInner::Focused(id) => DispatchMessage::Focused(id),
}
}
}