mirror of
https://github.com/rust-windowing/winit.git
synced 2026-08-29 04:40:04 -04:00
winit-wayland: use ext-background-effect if available
A more modern protocol compared to the KDE one.
This commit is contained in:
@@ -29,7 +29,6 @@ use sctk::shm::slot::SlotPool;
|
||||
use sctk::subcompositor::SubcompositorState;
|
||||
use tracing::{info, warn};
|
||||
use wayland_protocols::xdg::toplevel_icon::v1::client::xdg_toplevel_icon_manager_v1::XdgToplevelIconManagerV1;
|
||||
use wayland_protocols_plasma::blur::client::org_kde_kwin_blur::OrgKdeKwinBlur;
|
||||
use winit_core::cursor::{CursorIcon, CustomCursor as CoreCustomCursor};
|
||||
use winit_core::error::{NotSupportedError, RequestError};
|
||||
use winit_core::window::{
|
||||
@@ -43,8 +42,8 @@ use crate::seat::{
|
||||
ZwpTextInputV3Ext,
|
||||
};
|
||||
use crate::state::{WindowCompositorUpdate, WinitState};
|
||||
use crate::types::bgr_effects::{BgrEffectManager, SurfaceBlurEffect};
|
||||
use crate::types::cursor::{CustomCursor, SelectedCursor, WaylandCustomCursor};
|
||||
use crate::types::kwin_blur::KWinBlurManager;
|
||||
use crate::types::xdg_toplevel_icon_manager::ToplevelIcon;
|
||||
|
||||
#[cfg(feature = "sctk-adwaita")]
|
||||
@@ -156,8 +155,8 @@ pub struct WindowState {
|
||||
|
||||
viewport: Option<WpViewport>,
|
||||
fractional_scale: Option<WpFractionalScaleV1>,
|
||||
blur: Option<OrgKdeKwinBlur>,
|
||||
blur_manager: Option<KWinBlurManager>,
|
||||
blur: Option<SurfaceBlurEffect>,
|
||||
blur_manager: Option<BgrEffectManager>,
|
||||
|
||||
/// Whether the client side decorations have pending move operations.
|
||||
///
|
||||
@@ -206,7 +205,7 @@ impl WindowState {
|
||||
toplevel_icon: None,
|
||||
xdg_toplevel_icon_manager,
|
||||
blur: None,
|
||||
blur_manager: winit_state.kwin_blur_manager.clone(),
|
||||
blur_manager: winit_state.blur_manager.clone(),
|
||||
compositor,
|
||||
handle,
|
||||
csd_fails: false,
|
||||
@@ -742,6 +741,13 @@ impl WindowState {
|
||||
// Set surface size without the borders.
|
||||
viewport.set_destination(self.size.width as _, self.size.height as _);
|
||||
}
|
||||
|
||||
// Update blur region with new size.
|
||||
if self.blur.is_some() {
|
||||
// NOTE: either user resized or configure, in both cases
|
||||
// the redraw scheduling is done on the caller side.
|
||||
let _ = self.set_blur(true);
|
||||
}
|
||||
}
|
||||
|
||||
/// Get the scale factor of the window.
|
||||
@@ -1113,20 +1119,37 @@ impl WindowState {
|
||||
}
|
||||
}
|
||||
|
||||
/// Make window background blurred
|
||||
#[inline]
|
||||
pub fn set_blur(&mut self, blurred: bool) {
|
||||
if blurred && self.blur.is_none() {
|
||||
if let Some(blur_manager) = self.blur_manager.as_ref() {
|
||||
let blur = blur_manager.blur(self.window.wl_surface(), &self.queue_handle);
|
||||
blur.commit();
|
||||
self.blur = Some(blur);
|
||||
} else {
|
||||
info!("Blur manager unavailable, unable to change blur")
|
||||
}
|
||||
} else if !blurred && self.blur.is_some() {
|
||||
self.blur_manager.as_ref().unwrap().unset(self.window.wl_surface());
|
||||
self.blur.take().unwrap().release();
|
||||
/// Make window background blurred.
|
||||
///
|
||||
/// Returns `true` if redraw is required.
|
||||
#[must_use]
|
||||
pub fn set_blur(&mut self, blurred: bool) -> bool {
|
||||
if !blurred {
|
||||
self.blur = None;
|
||||
return true;
|
||||
}
|
||||
|
||||
let mgr = match self.blur_manager.as_mut() {
|
||||
Some(mgr) => mgr,
|
||||
None => {
|
||||
info!("Blur manager unavailable, unable to change blur");
|
||||
return false;
|
||||
},
|
||||
};
|
||||
|
||||
let blur = match self.blur.as_ref() {
|
||||
Some(blur) => blur,
|
||||
None => {
|
||||
self.blur = Some(mgr.new_blur_effect(self.window.wl_surface(), &self.queue_handle));
|
||||
self.blur.as_ref().unwrap()
|
||||
},
|
||||
};
|
||||
|
||||
if let Ok(region) = Region::new(&*self.compositor) {
|
||||
region.add(0, 0, i32::MAX, i32::MAX);
|
||||
blur.set_blur(Some(®ion))
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1224,10 +1247,6 @@ impl WindowState {
|
||||
|
||||
impl Drop for WindowState {
|
||||
fn drop(&mut self) {
|
||||
if let Some(blur) = self.blur.take() {
|
||||
blur.release();
|
||||
}
|
||||
|
||||
if let Some(fs) = self.fractional_scale.take() {
|
||||
fs.destroy();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user