feat(wayland): kde decoration support

This commit is contained in:
Nova
2022-09-19 08:13:23 -04:00
parent 76721a17f8
commit ca192e18a9
4 changed files with 29 additions and 10 deletions

View File

@@ -1,8 +1,10 @@
use super::state::WaylandState; use super::state::WaylandState;
use smithay::{ use smithay::{
delegate_xdg_decoration, delegate_kde_decoration, delegate_xdg_decoration,
reexports::wayland_protocols::xdg::decoration::zv1::server::zxdg_toplevel_decoration_v1::Mode, reexports::wayland_protocols::xdg::decoration::zv1::server::zxdg_toplevel_decoration_v1::Mode,
wayland::shell::xdg::decoration::XdgDecorationHandler, wayland::shell::{
self, kde::decoration::KdeDecorationHandler, xdg::decoration::XdgDecorationHandler,
},
}; };
impl XdgDecorationHandler for WaylandState { impl XdgDecorationHandler for WaylandState {
@@ -23,3 +25,10 @@ impl XdgDecorationHandler for WaylandState {
fn unset_mode(&mut self, _toplevel: smithay::wayland::shell::xdg::ToplevelSurface) {} fn unset_mode(&mut self, _toplevel: smithay::wayland::shell::xdg::ToplevelSurface) {}
} }
delegate_xdg_decoration!(WaylandState); delegate_xdg_decoration!(WaylandState);
impl KdeDecorationHandler for WaylandState {
fn kde_decoration_state(&self) -> &shell::kde::decoration::KdeDecorationState {
&self.kde_decoration_state
}
}
delegate_kde_decoration!(WaylandState);

View File

@@ -1,15 +1,15 @@
pub mod compositor; pub mod compositor;
mod data_device; mod data_device;
pub mod decoration;
pub mod panel_item; pub mod panel_item;
pub mod seat; pub mod seat;
pub mod shaders; pub mod shaders;
pub mod state; pub mod state;
pub mod surface; pub mod surface;
pub mod xdg_decoration;
pub mod xdg_shell; pub mod xdg_shell;
use self::{panel_item::PanelItem, state::WaylandState, surface::CORE_SURFACES}; use self::{panel_item::PanelItem, state::WaylandState, surface::CORE_SURFACES};
use crate::wayland::{seat::SeatData, state::ClientState}; use crate::wayland::state::ClientState;
use anyhow::{ensure, Result}; use anyhow::{ensure, Result};
use once_cell::sync::OnceCell; use once_cell::sync::OnceCell;
use parking_lot::Mutex; use parking_lot::Mutex;

View File

@@ -5,17 +5,23 @@ use slog::Logger;
use smithay::{ use smithay::{
delegate_output, delegate_shm, delegate_output, delegate_shm,
output::{Output, Scale, Subpixel}, output::{Output, Scale, Subpixel},
reexports::wayland_server::{ reexports::{
backend::{ClientData, ClientId, DisconnectReason}, wayland_protocols_misc::server_decoration::server::org_kde_kwin_server_decoration_manager::Mode,
protocol::wl_data_device_manager::WlDataDeviceManager, wayland_server::{
Display, DisplayHandle, backend::{ClientData, ClientId, DisconnectReason},
protocol::wl_data_device_manager::WlDataDeviceManager,
Display, DisplayHandle,
},
}, },
utils::Size, utils::Size,
wayland::{ wayland::{
buffer::BufferHandler, buffer::BufferHandler,
compositor::CompositorState, compositor::CompositorState,
output::OutputManagerState, output::OutputManagerState,
shell::xdg::{decoration::XdgDecorationState, XdgShellState}, shell::{
kde::decoration::KdeDecorationState,
xdg::{decoration::XdgDecorationState, XdgShellState},
},
shm::{ShmHandler, ShmState}, shm::{ShmHandler, ShmState},
}, },
}; };
@@ -42,6 +48,7 @@ pub struct WaylandState {
pub compositor_state: CompositorState, pub compositor_state: CompositorState,
pub xdg_shell_state: XdgShellState, pub xdg_shell_state: XdgShellState,
pub xdg_decoration_state: XdgDecorationState, pub xdg_decoration_state: XdgDecorationState,
pub kde_decoration_state: KdeDecorationState,
pub shm_state: ShmState, pub shm_state: ShmState,
pub output_manager_state: OutputManagerState, pub output_manager_state: OutputManagerState,
pub output: Output, pub output: Output,
@@ -57,6 +64,8 @@ impl WaylandState {
let compositor_state = CompositorState::new::<Self, _>(&display_handle, log.clone()); let compositor_state = CompositorState::new::<Self, _>(&display_handle, log.clone());
let xdg_shell_state = XdgShellState::new::<Self, _>(&display_handle, log.clone()); let xdg_shell_state = XdgShellState::new::<Self, _>(&display_handle, log.clone());
let xdg_decoration_state = XdgDecorationState::new::<Self, _>(&display_handle, log.clone()); let xdg_decoration_state = XdgDecorationState::new::<Self, _>(&display_handle, log.clone());
let kde_decoration_state =
KdeDecorationState::new::<Self, _>(&display_handle, Mode::Server, log.clone());
let shm_state = ShmState::new::<Self, _>(&display_handle, vec![], log.clone()); let shm_state = ShmState::new::<Self, _>(&display_handle, vec![], log.clone());
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 output = Output::new( let output = Output::new(
@@ -82,6 +91,7 @@ impl WaylandState {
compositor_state, compositor_state,
xdg_shell_state, xdg_shell_state,
xdg_decoration_state, xdg_decoration_state,
kde_decoration_state,
shm_state, shm_state,
output_manager_state, output_manager_state,
output, output,

View File

@@ -23,7 +23,7 @@ impl XdgShellHandler for WaylandState {
self.output self.output
.enter(&self.display_handle, surface.wl_surface()); .enter(&self.display_handle, surface.wl_surface());
surface.with_pending_state(|state| { surface.with_pending_state(|state| {
state.states.set(State::Fullscreen); state.states.set(State::Maximized);
state.states.set(State::Activated); state.states.set(State::Activated);
state.decoration_mode = Some(Mode::ServerSide); state.decoration_mode = Some(Mode::ServerSide);
}); });