use wayland_protocols_wlr::layer_shell::v1::client::{
zwlr_layer_shell_v1::Layer,
zwlr_layer_surface_v1::{Anchor, KeyboardInteractivity},
};
use wayland_client::{
QueueHandle, WEnum,
globals::GlobalList,
protocol::{
wl_buffer::WlBuffer,
wl_compositor::WlCompositor,
wl_output::{self, WlOutput},
wl_pointer::{self, ButtonState, WlPointer},
wl_shm::WlShm,
},
};
use crate::{id, xkb_keyboard::KeyEvent};
use crate::keyboard::ModifiersState;
use super::WindowState;
use crate::id::Id;
use std::{fmt::Debug, fs::File};
pub enum LayerShellEvent<'a, T, Message> {
InitRequest,
XdgInfoChanged(XdgInfoChangedType),
BindProvide(&'a GlobalList, &'a QueueHandle<WindowState<T>>),
CompositorProvide(&'a WlCompositor, &'a QueueHandle<WindowState<T>>),
RequestBuffer(
&'a mut File,
&'a WlShm,
&'a QueueHandle<WindowState<T>>,
u32,
u32,
),
RequestMessages(&'a DispatchMessage),
NormalDispatch,
UserEvent(Message),
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub enum OutputOption {
LastOutput,
OutputName(String),
Output(wl_output::WlOutput),
#[default]
None,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct NewLayerShellSettings {
pub size: Option<(u32, u32)>,
pub layer: Layer,
pub anchor: Anchor,
pub exclusive_zone: Option<i32>,
pub margin: Option<(i32, i32, i32, i32)>,
pub keyboard_interactivity: KeyboardInteractivity,
pub output_option: OutputOption,
pub events_transparent: bool,
pub namespace: Option<String>,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct NewPopUpSettings {
pub size: (u32, u32),
pub position: (i32, i32),
pub id: id::Id,
}
#[derive(Debug, PartialEq, Eq, Clone, Default)]
pub struct NewXdgWindowSettings {
pub title: Option<String>,
pub size: Option<(u32, u32)>,
pub client_side_decorations: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct NewInputPanelSettings {
pub size: (u32, u32),
pub keyboard: bool,
pub output_option: OutputOption,
}
impl Default for NewLayerShellSettings {
fn default() -> Self {
NewLayerShellSettings {
anchor: Anchor::Bottom | Anchor::Left | Anchor::Right,
layer: Layer::Top,
exclusive_zone: None,
size: None,
margin: Some((0, 0, 0, 0)),
keyboard_interactivity: KeyboardInteractivity::OnDemand,
output_option: OutputOption::None,
events_transparent: false,
namespace: None,
}
}
}
#[derive(Debug, PartialEq, Eq)]
pub enum ReturnData<INFO> {
WlBuffer(WlBuffer),
RequestBind,
RequestExit,
RequestCompositor,
RedrawAllRequest,
RedrawIndexRequest(Id),
RequestSetCursorShape((String, WlPointer)),
NewLayerShell((NewLayerShellSettings, id::Id, Option<INFO>)),
NewPopUp((NewPopUpSettings, id::Id, Option<INFO>)),
NewXdgBase((NewXdgWindowSettings, id::Id, Option<INFO>)),
NewInputPanel((NewInputPanelSettings, id::Id, Option<INFO>)),
None,
}
#[derive(Debug, Clone, Copy)]
pub enum XdgInfoChangedType {
Position,
Size,
Name,
Description,
}
#[derive(Default, Debug, Clone, Copy, PartialEq)]
pub struct AxisScroll {
pub absolute: f64,
pub discrete: i32,
pub stop: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum Ime {
Enabled,
Preedit(String, Option<(usize, usize)>),
Commit(String),
Disabled,
}
#[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,
},
ModifiersChanged(ModifiersState),
Focused(Id),
Unfocus,
KeyboardInput {
event: KeyEvent,
is_synthetic: bool,
},
PreferredScale {
scale_u32: u32,
scale_float: f64,
},
XdgInfoChanged(XdgInfoChangedType),
Ime(Ime),
}
#[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,
is_created: bool,
},
PreferredScale {
scale_u32: u32,
scale_float: f64,
},
Ime(Ime),
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::Focused(id) => DispatchMessage::Focused(id),
DispatchMessageInner::Unfocus => DispatchMessage::Unfocus,
DispatchMessageInner::ModifiersChanged(modifier) => {
DispatchMessage::ModifiersChanged(modifier)
}
DispatchMessageInner::KeyboardInput {
event,
is_synthetic,
} => DispatchMessage::KeyboardInput {
event,
is_synthetic,
},
DispatchMessageInner::PreferredScale {
scale_u32,
scale_float,
} => DispatchMessage::PreferredScale {
scale_u32,
scale_float,
},
DispatchMessageInner::Ime(ime) => DispatchMessage::Ime(ime),
DispatchMessageInner::XdgInfoChanged(_) => unimplemented!(),
}
}
}