feat: add selection and decoration protocols
This commit is contained in:
1 parent
475d433ec4
commit
a941b80aa9
3 files changed
+80
-2
No files matched your search
@@ -3,8 +3,20 @@ mod xdg_shell;
|
|||||||
|
|
||||||
use smithay::{
|
use smithay::{
|
||||||
input::{Seat, SeatHandler, SeatState, pointer::CursorImageStatus},
|
input::{Seat, SeatHandler, SeatState, pointer::CursorImageStatus},
|
||||||
reexports::wayland_server::protocol::wl_surface::WlSurface,
|
reexports::wayland_server::{Resource, protocol::wl_surface::WlSurface},
|
||||||
wayland::output::OutputHandler,
|
wayland::{
|
||||||
|
output::OutputHandler,
|
||||||
|
selection::{
|
||||||
|
SelectionHandler,
|
||||||
|
data_device::{
|
||||||
|
ClientDndGrabHandler, DataDeviceHandler, DataDeviceState, ServerDndGrabHandler,
|
||||||
|
set_data_device_focus,
|
||||||
|
},
|
||||||
|
primary_selection::{
|
||||||
|
PrimarySelectionHandler, PrimarySelectionState, set_primary_focus,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::Ferese;
|
use crate::Ferese;
|
||||||
@@ -19,12 +31,40 @@ impl SeatHandler for Ferese {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn cursor_image(&mut self, _seat: &Seat<Self>, _image: CursorImageStatus) {}
|
fn cursor_image(&mut self, _seat: &Seat<Self>, _image: CursorImageStatus) {}
|
||||||
|
|
||||||
|
fn focus_changed(&mut self, seat: &Seat<Self>, focused: Option<&WlSurface>) {
|
||||||
|
let client = focused.and_then(|surface| self.display_handle.get_client(surface.id()).ok());
|
||||||
|
set_data_device_focus(&self.display_handle, seat, client.clone());
|
||||||
|
set_primary_focus(&self.display_handle, seat, client);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl OutputHandler for Ferese {}
|
impl OutputHandler for Ferese {}
|
||||||
|
|
||||||
|
impl SelectionHandler for Ferese {
|
||||||
|
type SelectionUserData = ();
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ClientDndGrabHandler for Ferese {}
|
||||||
|
impl ServerDndGrabHandler for Ferese {}
|
||||||
|
|
||||||
|
impl DataDeviceHandler for Ferese {
|
||||||
|
fn data_device_state(&self) -> &DataDeviceState {
|
||||||
|
&self.data_device_state
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PrimarySelectionHandler for Ferese {
|
||||||
|
fn primary_selection_state(&self) -> &PrimarySelectionState {
|
||||||
|
&self.primary_selection_state
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
smithay::delegate_compositor!(Ferese);
|
smithay::delegate_compositor!(Ferese);
|
||||||
|
smithay::delegate_data_device!(Ferese);
|
||||||
smithay::delegate_output!(Ferese);
|
smithay::delegate_output!(Ferese);
|
||||||
|
smithay::delegate_primary_selection!(Ferese);
|
||||||
smithay::delegate_seat!(Ferese);
|
smithay::delegate_seat!(Ferese);
|
||||||
smithay::delegate_shm!(Ferese);
|
smithay::delegate_shm!(Ferese);
|
||||||
|
smithay::delegate_xdg_decoration!(Ferese);
|
||||||
smithay::delegate_xdg_shell!(Ferese);
|
smithay::delegate_xdg_shell!(Ferese);
|
||||||
@@ -2,10 +2,12 @@ use smithay::{
|
|||||||
desktop::{
|
desktop::{
|
||||||
PopupKind, PopupManager, Space, Window, find_popup_root_surface, get_popup_toplevel_coords,
|
PopupKind, PopupManager, Space, Window, find_popup_root_surface, get_popup_toplevel_coords,
|
||||||
},
|
},
|
||||||
|
reexports::wayland_protocols::xdg::decoration::zv1::server::zxdg_toplevel_decoration_v1::Mode,
|
||||||
reexports::wayland_server::protocol::{wl_seat, wl_surface::WlSurface},
|
reexports::wayland_server::protocol::{wl_seat, wl_surface::WlSurface},
|
||||||
utils::Serial,
|
utils::Serial,
|
||||||
wayland::{
|
wayland::{
|
||||||
compositor::with_states,
|
compositor::with_states,
|
||||||
|
shell::xdg::decoration::XdgDecorationHandler,
|
||||||
shell::xdg::{
|
shell::xdg::{
|
||||||
PopupSurface, PositionerState, ToplevelSurface, XdgShellHandler, XdgShellState,
|
PopupSurface, PositionerState, ToplevelSurface, XdgShellHandler, XdgShellState,
|
||||||
XdgToplevelSurfaceData,
|
XdgToplevelSurfaceData,
|
||||||
@@ -60,6 +62,31 @@ impl XdgShellHandler for Ferese {
|
|||||||
fn grab(&mut self, _: PopupSurface, _: wl_seat::WlSeat, _: Serial) {}
|
fn grab(&mut self, _: PopupSurface, _: wl_seat::WlSeat, _: Serial) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl XdgDecorationHandler for Ferese {
|
||||||
|
fn new_decoration(&mut self, toplevel: ToplevelSurface) {
|
||||||
|
set_decoration_mode(&toplevel, Mode::ClientSide);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn request_mode(&mut self, toplevel: ToplevelSurface, mode: Mode) {
|
||||||
|
// Phase 1 negotiates decorations but does not yet draw a server frame.
|
||||||
|
// Honor CSD and safely fall back to CSD for premature SSD requests.
|
||||||
|
let mode = match mode {
|
||||||
|
Mode::ClientSide | Mode::ServerSide => Mode::ClientSide,
|
||||||
|
_ => Mode::ClientSide,
|
||||||
|
};
|
||||||
|
set_decoration_mode(&toplevel, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn unset_mode(&mut self, toplevel: ToplevelSurface) {
|
||||||
|
set_decoration_mode(&toplevel, Mode::ClientSide);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_decoration_mode(toplevel: &ToplevelSurface, mode: Mode) {
|
||||||
|
toplevel.with_pending_state(|state| state.decoration_mode = Some(mode));
|
||||||
|
toplevel.send_pending_configure();
|
||||||
|
}
|
||||||
|
|
||||||
pub fn handle_commit(popups: &mut PopupManager, space: &Space<Window>, surface: &WlSurface) {
|
pub fn handle_commit(popups: &mut PopupManager, space: &Space<Window>, surface: &WlSurface) {
|
||||||
if let Some(window) = space
|
if let Some(window) = space
|
||||||
.elements()
|
.elements()
|
||||||
|
|||||||
@@ -15,7 +15,9 @@ use smithay::{
|
|||||||
wayland::{
|
wayland::{
|
||||||
compositor::{CompositorClientState, CompositorState},
|
compositor::{CompositorClientState, CompositorState},
|
||||||
output::OutputManagerState,
|
output::OutputManagerState,
|
||||||
|
selection::{data_device::DataDeviceState, primary_selection::PrimarySelectionState},
|
||||||
shell::xdg::XdgShellState,
|
shell::xdg::XdgShellState,
|
||||||
|
shell::xdg::decoration::XdgDecorationState,
|
||||||
shm::ShmState,
|
shm::ShmState,
|
||||||
socket::ListeningSocketSource,
|
socket::ListeningSocketSource,
|
||||||
},
|
},
|
||||||
@@ -30,7 +32,10 @@ pub struct Ferese {
|
|||||||
pub popups: PopupManager,
|
pub popups: PopupManager,
|
||||||
pub seat: Seat<Self>,
|
pub seat: Seat<Self>,
|
||||||
pub compositor_state: CompositorState,
|
pub compositor_state: CompositorState,
|
||||||
|
pub data_device_state: DataDeviceState,
|
||||||
|
pub decoration_state: XdgDecorationState,
|
||||||
pub output_manager_state: OutputManagerState,
|
pub output_manager_state: OutputManagerState,
|
||||||
|
pub primary_selection_state: PrimarySelectionState,
|
||||||
pub seat_state: SeatState<Self>,
|
pub seat_state: SeatState<Self>,
|
||||||
pub shm_state: ShmState,
|
pub shm_state: ShmState,
|
||||||
pub xdg_shell_state: XdgShellState,
|
pub xdg_shell_state: XdgShellState,
|
||||||
@@ -44,8 +49,11 @@ impl Ferese {
|
|||||||
let display_handle = display.handle();
|
let display_handle = display.handle();
|
||||||
let compositor_state = CompositorState::new::<Self>(&display_handle);
|
let compositor_state = CompositorState::new::<Self>(&display_handle);
|
||||||
let xdg_shell_state = XdgShellState::new::<Self>(&display_handle);
|
let xdg_shell_state = XdgShellState::new::<Self>(&display_handle);
|
||||||
|
let decoration_state = XdgDecorationState::new::<Self>(&display_handle);
|
||||||
let shm_state = ShmState::new::<Self>(&display_handle, Vec::new());
|
let shm_state = ShmState::new::<Self>(&display_handle, Vec::new());
|
||||||
let output_manager_state = OutputManagerState::new_with_xdg_output::<Self>(&display_handle);
|
let output_manager_state = OutputManagerState::new_with_xdg_output::<Self>(&display_handle);
|
||||||
|
let data_device_state = DataDeviceState::new::<Self>(&display_handle);
|
||||||
|
let primary_selection_state = PrimarySelectionState::new::<Self>(&display_handle);
|
||||||
let mut seat_state = SeatState::new();
|
let mut seat_state = SeatState::new();
|
||||||
let mut seat = seat_state.new_wl_seat(&display_handle, "ferese-winit");
|
let mut seat = seat_state.new_wl_seat(&display_handle, "ferese-winit");
|
||||||
seat.add_keyboard(Default::default(), 200, 25)?;
|
seat.add_keyboard(Default::default(), 200, 25)?;
|
||||||
@@ -61,7 +69,10 @@ impl Ferese {
|
|||||||
popups: PopupManager::default(),
|
popups: PopupManager::default(),
|
||||||
seat,
|
seat,
|
||||||
compositor_state,
|
compositor_state,
|
||||||
|
data_device_state,
|
||||||
|
decoration_state,
|
||||||
output_manager_state,
|
output_manager_state,
|
||||||
|
primary_selection_state,
|
||||||
seat_state,
|
seat_state,
|
||||||
shm_state,
|
shm_state,
|
||||||
xdg_shell_state,
|
xdg_shell_state,
|
||||||
|
|||||||
Reference in new issue
Block a user