From d88bb9664bc7865d5050cecfda23593c2f9a9e3e Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Tue, 21 Jan 2025 15:48:52 -0500 Subject: [PATCH] refactor: remove layer shell proxy This removes support for layer shell in panel clients. I don't believe any applets need to create layer shell surfaces anymore. --- .../src/iced/elements/background.rs | 2 +- cosmic-panel-bin/src/iced/mod.rs | 8 +- cosmic-panel-bin/src/iced/panel_message.rs | 9 - .../src/space/corner_element/mod.rs | 27 +-- cosmic-panel-bin/src/space/layout.rs | 8 +- cosmic-panel-bin/src/space/panel_space.rs | 4 +- cosmic-panel-bin/src/space/render.rs | 7 +- cosmic-panel-bin/src/space/wrapper_space.rs | 11 +- .../src/space_container/space_container.rs | 12 +- .../src/space_container/wrapper_space.rs | 2 +- .../client/handlers/compositor.rs | 37 --- .../client/handlers/keyboard.rs | 25 +- .../client/handlers/layer_shell.rs | 54 +---- .../client/handlers/overlap.rs | 8 +- .../client/handlers/pointer.rs | 215 +++--------------- .../src/xdg_shell_wrapper/client/state.rs | 97 +------- cosmic-panel-bin/src/xdg_shell_wrapper/mod.rs | 22 +- .../server/handlers/compositor.rs | 200 +--------------- .../server/handlers/fractional.rs | 12 - .../server/handlers/layer.rs | 30 --- .../xdg_shell_wrapper/server/handlers/mod.rs | 1 - .../src/xdg_shell_wrapper/server/state.rs | 4 +- .../src/xdg_shell_wrapper/shared_state.rs | 36 +-- cosmic-panel-config/src/panel_config.rs | 1 + 24 files changed, 98 insertions(+), 734 deletions(-) delete mode 100644 cosmic-panel-bin/src/iced/panel_message.rs delete mode 100644 cosmic-panel-bin/src/xdg_shell_wrapper/server/handlers/layer.rs diff --git a/cosmic-panel-bin/src/iced/elements/background.rs b/cosmic-panel-bin/src/iced/elements/background.rs index 993fce57..f7791378 100644 --- a/cosmic-panel-bin/src/iced/elements/background.rs +++ b/cosmic-panel-bin/src/iced/elements/background.rs @@ -2,7 +2,7 @@ use calloop::LoopHandle; use cosmic::{ - iced::{id, Color, Length, Radius}, + iced::{id, Color, Length}, iced_core::Shadow, theme, widget::horizontal_space, diff --git a/cosmic-panel-bin/src/iced/mod.rs b/cosmic-panel-bin/src/iced/mod.rs index f53fcd78..1965ac9b 100644 --- a/cosmic-panel-bin/src/iced/mod.rs +++ b/cosmic-panel-bin/src/iced/mod.rs @@ -16,7 +16,7 @@ use cosmic::{ keyboard::{Event as KeyboardEvent, Modifiers as IcedModifiers}, mouse::{Button as MouseButton, Cursor, Event as MouseEvent, ScrollDelta}, window::Event as WindowEvent, - Limits, Point as IcedPoint, Rectangle as IcedRectangle, Size as IcedSize, Task, + Limits, Point as IcedPoint, Size as IcedSize, Task, }, iced_core::{clipboard::Null as NullClipboard, renderer::Style, Color, Font, Length, Pixels}, iced_renderer::Renderer as IcedRenderer, @@ -28,10 +28,7 @@ use cosmic::{ widget::Id, Theme, }; -use iced_tiny_skia::{ - graphics::{damage, Viewport}, - Primitive, -}; +use iced_tiny_skia::graphics::Viewport; use once_cell::sync::Lazy; use ordered_float::OrderedFloat; use smithay::{ @@ -67,7 +64,6 @@ use smithay::{ }; pub mod elements; -pub mod panel_message; static ID: Lazy = Lazy::new(|| Id::new("Program")); diff --git a/cosmic-panel-bin/src/iced/panel_message.rs b/cosmic-panel-bin/src/iced/panel_message.rs deleted file mode 100644 index d905efaf..00000000 --- a/cosmic-panel-bin/src/iced/panel_message.rs +++ /dev/null @@ -1,9 +0,0 @@ -use cosmic::widget::Id; - -#[derive(Debug, Clone)] -pub enum PanelIcedMessage { - /// Toggle the popup - TogglePopup(Id), - /// Request a redraw when contents in an element changes - Redraw, -} diff --git a/cosmic-panel-bin/src/space/corner_element/mod.rs b/cosmic-panel-bin/src/space/corner_element/mod.rs index df52066c..eb5527bc 100644 --- a/cosmic-panel-bin/src/space/corner_element/mod.rs +++ b/cosmic-panel-bin/src/space/corner_element/mod.rs @@ -101,21 +101,18 @@ pub fn init_shaders(gles_renderer: &mut GlesRenderer) -> Result<(), GlesError> { } } - let rectangle_shader = gles_renderer.compile_custom_pixel_shader( - RECTANGLE_SHADER, - &[ - UniformName::new("rad_tl", UniformType::_1f), - UniformName::new("rad_tr", UniformType::_1f), - UniformName::new("rad_bl", UniformType::_1f), - UniformName::new("rad_br", UniformType::_1f), - UniformName::new("loc", UniformType::_2f), - UniformName::new("rect_size", UniformType::_2f), - UniformName::new("border_width", UniformType::_1f), - UniformName::new("drop_shadow", UniformType::_1f), - UniformName::new("bg_color", UniformType::_4f), - UniformName::new("border_color", UniformType::_4f), - ], - )?; + let rectangle_shader = gles_renderer.compile_custom_pixel_shader(RECTANGLE_SHADER, &[ + UniformName::new("rad_tl", UniformType::_1f), + UniformName::new("rad_tr", UniformType::_1f), + UniformName::new("rad_bl", UniformType::_1f), + UniformName::new("rad_br", UniformType::_1f), + UniformName::new("loc", UniformType::_2f), + UniformName::new("rect_size", UniformType::_2f), + UniformName::new("border_width", UniformType::_1f), + UniformName::new("drop_shadow", UniformType::_1f), + UniformName::new("bg_color", UniformType::_4f), + UniformName::new("border_color", UniformType::_4f), + ])?; let egl_context = gles_renderer.egl_context(); egl_context.user_data().insert_if_missing(|| RoundedRectangleShader(rectangle_shader)); diff --git a/cosmic-panel-bin/src/space/layout.rs b/cosmic-panel-bin/src/space/layout.rs index ca026562..60375cd4 100644 --- a/cosmic-panel-bin/src/space/layout.rs +++ b/cosmic-panel-bin/src/space/layout.rs @@ -935,7 +935,8 @@ impl PanelSpace { } else if c.shrink_priority.is_some() { overflow_partition.movable.push(w); } else { - // make shrinkable if no shrink priority with lowest priority so it is moved last + // make shrinkable if no shrink priority with lowest priority so it is moved + // last overflow_partition.shrinkable.push((w.0, -1, ClientShrinkSize::AppletUnit(1))); } } @@ -1065,8 +1066,8 @@ impl PanelSpace { } if overflow > 0 && !force_smaller { tracing::info!( - "Overflow not resolved {sum:.1} {overflow}. Forcing lowest priority shrinkable applets to be \ - smaller than configured...", + "Overflow not resolved {sum:.1} {overflow}. Forcing lowest priority shrinkable \ + applets to be smaller than configured...", ); return self.shrink_clients(overflow, clients, section, true); } @@ -1404,6 +1405,7 @@ impl PanelSpace { suggested_size, ); } + fn relax_overflow_right( &mut self, extra_space: u32, diff --git a/cosmic-panel-bin/src/space/panel_space.rs b/cosmic-panel-bin/src/space/panel_space.rs index c1bcb2ae..7bf09229 100644 --- a/cosmic-panel-bin/src/space/panel_space.rs +++ b/cosmic-panel-bin/src/space/panel_space.rs @@ -1217,8 +1217,8 @@ impl PanelSpace { // return early if config.anchor() != self.config.anchor() { panic!( - "Can't apply anchor changes when orientation changes. Requires re-creation of \ - the panel." + "Can't apply anchor changes when orientation changes. Requires re-creation of the \ + panel." ); } diff --git a/cosmic-panel-bin/src/space/render.rs b/cosmic-panel-bin/src/space/render.rs index 021d7b9b..52be542e 100644 --- a/cosmic-panel-bin/src/space/render.rs +++ b/cosmic-panel-bin/src/space/render.rs @@ -141,10 +141,9 @@ impl PanelSpace { // TODO check to make sure this is not going to cause damage issues if not_visible { if let Ok(mut frame) = renderer.render(dim, smithay::utils::Transform::Normal) { - _ = frame.clear( - Color32F::new(0.0, 0.0, 0.0, 0.0), - &[Rectangle::from_loc_and_size((0, 0), dim)], - ); + _ = frame.clear(Color32F::new(0.0, 0.0, 0.0, 0.0), &[ + Rectangle::from_loc_and_size((0, 0), dim), + ]); if let Ok(sync_point) = frame.finish() { if let Err(err) = sync_point.wait() { tracing::error!("Error waiting for sync point: {:?}", err); diff --git a/cosmic-panel-bin/src/space/wrapper_space.rs b/cosmic-panel-bin/src/space/wrapper_space.rs index ee7239e4..8e3d6429 100644 --- a/cosmic-panel-bin/src/space/wrapper_space.rs +++ b/cosmic-panel-bin/src/space/wrapper_space.rs @@ -650,13 +650,10 @@ impl WrapperSpace for PanelSpace { return; }; if let Err(err) = pman - .update_process_env( - &key, - vec![( - "COSMIC_NOTIFICATIONS".to_string(), - fd.as_raw_fd().to_string(), - )], - ) + .update_process_env(&key, vec![( + "COSMIC_NOTIFICATIONS".to_string(), + fd.as_raw_fd().to_string(), + )]) .await { error!("Failed to update process env: {}", err); diff --git a/cosmic-panel-bin/src/space_container/space_container.rs b/cosmic-panel-bin/src/space_container/space_container.rs index d3e05b4e..98b9c43e 100644 --- a/cosmic-panel-bin/src/space_container/space_container.rs +++ b/cosmic-panel-bin/src/space_container/space_container.rs @@ -1,9 +1,4 @@ -use std::{ - cell::RefCell, - collections::{HashMap, HashSet}, - rc::Rc, - sync::Arc, -}; +use std::{cell::RefCell, collections::HashMap, rc::Rc, sync::Arc}; use crate::{ minimize::MinimizeApplet, @@ -22,8 +17,7 @@ use crate::{ }; use cctk::{ cosmic_protocols::toplevel_info::v1::client::zcosmic_toplevel_handle_v1::ZcosmicToplevelHandleV1, - toplevel_info::ToplevelInfo, - wayland_client::{self, protocol::wl_seat::WlSeat}, + toplevel_info::ToplevelInfo, wayland_client::protocol::wl_seat::WlSeat, workspace::WorkspaceGroup, }; use cosmic::{cosmic_config::CosmicConfigEntry, iced::id, theme}; @@ -224,7 +218,7 @@ impl SpaceContainer { layer_state: &mut LayerShell, qh: &QueueHandle, force_output: Option, - overlap_notify: Option, + _overlap_notify: Option, ) { // if the output is set to "all", we need to check if the config is the same for // all outputs if the output is set to a specific output, we need to diff --git a/cosmic-panel-bin/src/space_container/wrapper_space.rs b/cosmic-panel-bin/src/space_container/wrapper_space.rs index 47cf8970..eb23dbc9 100644 --- a/cosmic-panel-bin/src/space_container/wrapper_space.rs +++ b/cosmic-panel-bin/src/space_container/wrapper_space.rs @@ -17,7 +17,7 @@ use crate::{ wp_viewporter::ViewporterState, }, }; -use cctk::cosmic_protocols::overlap_notify; + use cosmic_panel_config::{CosmicPanelBackground, CosmicPanelContainerConfig, CosmicPanelOuput}; use itertools::Itertools; use sctk::{ diff --git a/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/compositor.rs b/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/compositor.rs index ea5ffad7..837e668c 100644 --- a/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/compositor.rs +++ b/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/compositor.rs @@ -3,9 +3,7 @@ use sctk::{ compositor::CompositorHandler, reexports::client::{protocol::wl_surface, Connection, QueueHandle}, - shell::WaylandSurface, }; -use smithay::reexports::wayland_server::protocol::wl_output::Transform; use crate::xdg_shell_wrapper::{shared_state::GlobalState, space::WrapperSpace}; @@ -48,41 +46,6 @@ impl CompositorHandler for GlobalState { surface: &wl_surface::WlSurface, new_transform: sctk::reexports::client::protocol::wl_output::Transform, ) { - for tracked_surface in &mut self.client_state.proxied_layer_surfaces { - if tracked_surface.3.wl_surface() == surface { - let transform = match new_transform { - sctk::reexports::client::protocol::wl_output::Transform::Normal => { - Transform::Normal - }, - sctk::reexports::client::protocol::wl_output::Transform::_90 => Transform::_90, - sctk::reexports::client::protocol::wl_output::Transform::_180 => { - Transform::_180 - }, - sctk::reexports::client::protocol::wl_output::Transform::_270 => { - Transform::_270 - }, - sctk::reexports::client::protocol::wl_output::Transform::Flipped => { - Transform::Flipped - }, - sctk::reexports::client::protocol::wl_output::Transform::Flipped90 => { - Transform::Flipped90 - }, - sctk::reexports::client::protocol::wl_output::Transform::Flipped180 => { - Transform::Flipped180 - }, - sctk::reexports::client::protocol::wl_output::Transform::Flipped270 => { - Transform::Flipped270 - }, - _ => { - tracing::warn!("Received unknown transform."); - return; - }, - }; - tracked_surface.2.wl_surface().preferred_buffer_transform(transform); - return; - } - } - self.space.transform_changed(conn, surface, new_transform); } diff --git a/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/keyboard.rs b/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/keyboard.rs index 6a5e3dbd..5964e01c 100644 --- a/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/keyboard.rs +++ b/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/keyboard.rs @@ -7,7 +7,6 @@ use crate::xdg_shell_wrapper::{ use sctk::{ delegate_keyboard, seat::keyboard::{KeyCode, KeyboardHandler, Keysym, RawModifiers, RepeatInfo}, - shell::WaylandSurface, }; use smithay::{backend::input::KeyState, input::keyboard::FilterResult, utils::SERIAL_COUNTER}; @@ -50,21 +49,9 @@ impl KeyboardHandler for GlobalState { )); } } - let s_surface = - self.client_state.proxied_layer_surfaces.iter_mut().find_map(|(_, _, s, c, ..)| { - if c.wl_surface() == surface { - Some(s.wl_surface().clone()) - } else { - None - } - }); - if let Some(s_surface) = s_surface { - kbd.set_focus(self, Some(s_surface.into()), SERIAL_COUNTER.next_serial()); - } else { - let s = self.space.keyboard_enter(&seat_name, surface.clone()); - kbd.set_focus(self, s.map(|s| s.into()), SERIAL_COUNTER.next_serial()); - } + let s = self.space.keyboard_enter(&seat_name, surface.clone()); + kbd.set_focus(self, s.map(|s| s.into()), SERIAL_COUNTER.next_serial()); } fn leave( @@ -99,13 +86,7 @@ impl KeyboardHandler for GlobalState { } }; - let s_surface = self - .client_state - .proxied_layer_surfaces - .iter_mut() - .any(|(_, _, _, c, ..)| c.wl_surface() == surface); - - if kbd_focus && !s_surface { + if kbd_focus { self.space.keyboard_leave(&name, Some(surface.clone())); } kbd.set_focus(self, None, SERIAL_COUNTER.next_serial()); diff --git a/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/layer_shell.rs b/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/layer_shell.rs index ffb95dec..bbab57d2 100644 --- a/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/layer_shell.rs +++ b/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/layer_shell.rs @@ -2,15 +2,10 @@ use sctk::{ delegate_layer, - shell::{ - wlr_layer::{LayerShellHandler, LayerSurface, LayerSurfaceConfigure}, - WaylandSurface, - }, + shell::wlr_layer::{LayerShellHandler, LayerSurface, LayerSurfaceConfigure}, }; -use crate::xdg_shell_wrapper::{ - client_state::SurfaceState, shared_state::GlobalState, space::WrapperSpace, -}; +use crate::xdg_shell_wrapper::{shared_state::GlobalState, space::WrapperSpace}; impl LayerShellHandler for GlobalState { fn closed( @@ -19,16 +14,7 @@ impl LayerShellHandler for GlobalState { _qh: &sctk::reexports::client::QueueHandle, layer: &LayerSurface, ) { - if let Some(i) = self - .client_state - .proxied_layer_surfaces - .iter() - .position(|(_, _, _, s, ..)| s.wl_surface() == layer.wl_surface()) - { - self.client_state.proxied_layer_surfaces.remove(i); - } else { - self.space.close_layer(layer); - } + self.space.close_layer(layer); } fn configure( @@ -39,39 +25,7 @@ impl LayerShellHandler for GlobalState { configure: LayerSurfaceConfigure, _serial: u32, ) { - if let Some((_, _, s_layer_surface, _, mut state, ..)) = self - .client_state - .proxied_layer_surfaces - .iter_mut() - .find(|(_, _, _, s, ..)| s.wl_surface() == layer.wl_surface()) - { - let mut requested_size = configure.new_size; - let generation = match state { - SurfaceState::Waiting(generation, size) => { - requested_size.0 = size.w as u32; - requested_size.1 = size.h as u32; - state = SurfaceState::Dirty(generation); - generation - }, - SurfaceState::Dirty(generation) => generation, - SurfaceState::WaitingFirst(generation, size) => { - requested_size.0 = size.w as u32; - requested_size.1 = size.h as u32; - state = SurfaceState::Dirty(generation); - generation - }, - }; - tracing::trace!("Layer surface configure: {configure:?}, generation: {generation}"); - if requested_size != configure.new_size { - s_layer_surface.layer_surface().with_pending_state(|pending_state| { - pending_state.size = - Some((configure.new_size.0 as i32, configure.new_size.1 as i32).into()); - }); - s_layer_surface.layer_surface().send_configure(); - } - } else { - self.space.configure_layer(layer, configure); - } + self.space.configure_layer(layer, configure); } } diff --git a/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/overlap.rs b/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/overlap.rs index b16ec7e8..61f1e734 100644 --- a/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/overlap.rs +++ b/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/overlap.rs @@ -50,6 +50,10 @@ pub struct OverlapNotificationV1 { impl Dispatch for OverlapNotificationV1 { + event_created_child!(GlobalState, ZcosmicOverlapNotifyV1, [ + 0 => (ExtForeignToplevelHandleV1, Default::default()) + ]); + fn event( state: &mut GlobalState, _n: &ZcosmicOverlapNotificationV1, @@ -74,10 +78,6 @@ impl Dispatch } } } - - event_created_child!(GlobalState, ZcosmicOverlapNotifyV1, [ - 0 => (ExtForeignToplevelHandleV1, Default::default()) - ]); } wayland_client::delegate_dispatch!(GlobalState: [ZcosmicOverlapNotifyV1: GlobalData] => OverlapNotifyV1); diff --git a/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/pointer.rs b/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/pointer.rs index a7d512e0..c1f995d2 100644 --- a/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/pointer.rs +++ b/cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/pointer.rs @@ -9,7 +9,6 @@ use crate::xdg_shell_wrapper::{ use sctk::{ delegate_pointer, seat::pointer::{PointerEvent, PointerHandler}, - shell::WaylandSurface, }; use smithay::{ backend::input::{self, Axis, ButtonState}, @@ -83,26 +82,13 @@ impl GlobalState { let seat = &mut self.server_state.seats[seat_index]; match e.kind { sctk::seat::pointer::PointerEventKind::Leave { .. } => { - ptr.motion( - self, - None, - &MotionEvent { - location: (0.0, 0.0).into(), - serial: SERIAL_COUNTER.next_serial(), - time: time.try_into().unwrap(), - }, - ); + ptr.motion(self, None, &MotionEvent { + location: (0.0, 0.0).into(), + serial: SERIAL_COUNTER.next_serial(), + time: time.try_into().unwrap(), + }); ptr.frame(self); - if let Some((..)) = self - .client_state - .proxied_layer_surfaces - .iter_mut() - .find(|(_, _, _, s, ..)| s.wl_surface() == &e.surface) - { - continue; - } - let mut c_hovered_surface = self.client_state.hovered_surface.borrow_mut(); for f in c_hovered_surface.iter_mut().filter(|f| f.0 == e.surface) { f.2 = FocusStatus::LastFocused(Instant::now()); @@ -127,31 +113,6 @@ impl GlobalState { )); } - // check tracked layer shell surface - let s_surface = self.client_state.proxied_layer_surfaces.iter_mut().find_map( - |(_, _, s, c, ..)| { - if c.wl_surface() == &e.surface { - Some(s.wl_surface().clone()) - } else { - None - } - }, - ); - if let Some(s_surface) = s_surface { - ptr.motion( - self, - Some((s_surface.into(), Point::default())), - &MotionEvent { - location: Point::from((surface_x, surface_y)), - serial: SERIAL_COUNTER.next_serial(), - time: time.try_into().unwrap(), - }, - ); - ptr.frame(self); - - continue; - } - if let Some(( ServerPointerFocus { surface, c_pos, s_pos, .. }, mut generated_events, @@ -166,16 +127,11 @@ impl GlobalState { }) { *ev = (e.clone(), pointer.clone(), ev.2); } else { - ptr.motion( - self, - Some((surface, s_pos)), - &MotionEvent { - location: c_pos.to_f64() - + Point::from((surface_x, surface_y)), - serial: SERIAL_COUNTER.next_serial(), - time: time.try_into().unwrap(), - }, - ); + ptr.motion(self, Some((surface, s_pos)), &MotionEvent { + location: c_pos.to_f64() + Point::from((surface_x, surface_y)), + serial: SERIAL_COUNTER.next_serial(), + time: time.try_into().unwrap(), + }); ptr.frame(self); } } else { @@ -189,15 +145,11 @@ impl GlobalState { } } } else { - ptr.motion( - self, - None, - &MotionEvent { - location: Point::from((surface_x, surface_y)), - serial: SERIAL_COUNTER.next_serial(), - time: time.try_into().unwrap(), - }, - ); + ptr.motion(self, None, &MotionEvent { + location: Point::from((surface_x, surface_y)), + serial: SERIAL_COUNTER.next_serial(), + time: time.try_into().unwrap(), + }); ptr.frame(self); } }, @@ -215,31 +167,6 @@ impl GlobalState { None => continue, }; - // check tracked layer shell surface - let s_surface = self.client_state.proxied_layer_surfaces.iter_mut().find_map( - |(_, _, s, c, ..)| { - if c.wl_surface() == &e.surface { - Some(s.wl_surface().clone()) - } else { - None - } - }, - ); - - if let Some(s_surface) = s_surface { - ptr.motion( - self, - Some((s_surface.into(), Point::default())), - &MotionEvent { - location: Point::from((surface_x, surface_y)), - serial: SERIAL_COUNTER.next_serial(), - time: time.try_into().unwrap(), - }, - ); - ptr.frame(self); - continue; - } - if let Some(( ServerPointerFocus { surface, c_pos, s_pos, .. }, mut generated_events, @@ -254,16 +181,11 @@ impl GlobalState { }) { *ev = (e.clone(), pointer.clone(), ev.2); } else { - ptr.motion( - self, - Some((surface, s_pos)), - &MotionEvent { - location: c_pos.to_f64() - + Point::from((surface_x, surface_y)), - serial: SERIAL_COUNTER.next_serial(), - time, - }, - ); + ptr.motion(self, Some((surface, s_pos)), &MotionEvent { + location: c_pos.to_f64() + Point::from((surface_x, surface_y)), + serial: SERIAL_COUNTER.next_serial(), + time, + }); ptr.frame(self); } } else { @@ -277,15 +199,11 @@ impl GlobalState { } } } else { - ptr.motion( - self, - None, - &MotionEvent { - location: Point::from((surface_x, surface_y)), - serial: SERIAL_COUNTER.next_serial(), - time, - }, - ); + ptr.motion(self, None, &MotionEvent { + location: Point::from((surface_x, surface_y)), + serial: SERIAL_COUNTER.next_serial(), + time, + }); ptr.frame(self); if let Some(themed_pointer) = &self.server_state.seats[seat_index].client.ptr @@ -298,89 +216,30 @@ impl GlobalState { sctk::seat::pointer::PointerEventKind::Press { time, button, serial, .. } => { self.server_state.last_button.replace(button); seat.client.last_pointer_press = (serial, time); - // check tracked layer shell surface - let s_surface = self.client_state.proxied_layer_surfaces.iter_mut().find_map( - |(_, _, s, c, ..)| { - if c.wl_surface() == &e.surface { - Some(s.wl_surface().clone()) - } else { - None - } - }, - ); - if let Some(s_surface) = s_surface { - kbd.set_focus(self, Some(s_surface.into()), SERIAL_COUNTER.next_serial()); - - ptr.button( - self, - &ButtonEvent { - serial: SERIAL_COUNTER.next_serial(), - time, - button, - state: ButtonState::Pressed, - }, - ); - ptr.frame(self); - - continue; - } let s = self.space.handle_button(&seat_name, true); kbd.set_focus(self, s, SERIAL_COUNTER.next_serial()); - ptr.button( - self, - &ButtonEvent { - serial: SERIAL_COUNTER.next_serial(), - time, - button, - state: ButtonState::Pressed, - }, - ); + ptr.button(self, &ButtonEvent { + serial: SERIAL_COUNTER.next_serial(), + time, + button, + state: ButtonState::Pressed, + }); ptr.frame(self); }, sctk::seat::pointer::PointerEventKind::Release { time, button, .. } => { self.server_state.last_button.replace(button); - // check tracked layer shell surface - let s_surface = self.client_state.proxied_layer_surfaces.iter_mut().find_map( - |(_, _, s, c, ..)| { - if c.wl_surface() == &e.surface { - Some(s.wl_surface().clone()) - } else { - None - } - }, - ); - if let Some(s_surface) = s_surface { - kbd.set_focus(self, Some(s_surface.into()), SERIAL_COUNTER.next_serial()); - - ptr.button( - self, - &ButtonEvent { - serial: SERIAL_COUNTER.next_serial(), - time, - button, - state: ButtonState::Released, - }, - ); - ptr.frame(self); - - continue; - } - let s = self.space.handle_button(&seat_name, false); kbd.set_focus(self, s, SERIAL_COUNTER.next_serial()); - ptr.button( - self, - &ButtonEvent { - serial: SERIAL_COUNTER.next_serial(), - time, - button, - state: ButtonState::Released, - }, - ); + ptr.button(self, &ButtonEvent { + serial: SERIAL_COUNTER.next_serial(), + time, + button, + state: ButtonState::Released, + }); ptr.frame(self); }, sctk::seat::pointer::PointerEventKind::Axis { diff --git a/cosmic-panel-bin/src/xdg_shell_wrapper/client/state.rs b/cosmic-panel-bin/src/xdg_shell_wrapper/client/state.rs index f46e1b6f..b2443d88 100644 --- a/cosmic-panel-bin/src/xdg_shell_wrapper/client/state.rs +++ b/cosmic-panel-bin/src/xdg_shell_wrapper/client/state.rs @@ -5,9 +5,8 @@ use crate::{ }, }; use cctk::{ - cosmic_protocols::overlap_notify, toplevel_info::ToplevelInfoState, - toplevel_management::ToplevelManagerState, wayland_client::protocol::wl_pointer::WlPointer, - workspace::WorkspaceState, + toplevel_info::ToplevelInfoState, toplevel_management::ToplevelManagerState, + wayland_client::protocol::wl_pointer::WlPointer, workspace::WorkspaceState, }; use sctk::{ compositor::CompositorState, @@ -36,46 +35,24 @@ use sctk::{ pointer::{PointerEvent, ThemedPointer}, SeatState, }, - shell::{ - wlr_layer::{LayerShell, LayerSurface}, - xdg::XdgShell, - }, + shell::{wlr_layer::LayerShell, xdg::XdgShell}, shm::{multi::MultiPool, Shm}, }; use smithay::{ - backend::{ - egl::EGLSurface, - renderer::{ - damage::OutputDamageTracker, - element::{surface::WaylandSurfaceRenderElement, AsRenderElements}, - gles::GlesRenderer, - Bind, Unbind, - }, - }, - desktop::LayerSurface as SmithayLayerSurface, + backend::{egl::EGLSurface, renderer::damage::OutputDamageTracker}, output::Output, reexports::{ calloop, wayland_server::{ backend::{ClientData, ClientId, DisconnectReason, GlobalId}, - protocol::{wl_output, wl_surface::WlSurface as SmithayWlSurface}, + protocol::wl_surface::WlSurface as SmithayWlSurface, }, }, utils::{Logical, Size}, wayland::compositor::CompositorClientState, }; -use std::{ - cell::RefCell, - collections::HashMap, - fmt::Debug, - rc::Rc, - time::{Duration, Instant}, -}; +use std::{cell::RefCell, collections::HashMap, fmt::Debug, rc::Rc, time::Instant}; use tracing::error; -use wayland_protocols::wp::{ - fractional_scale::v1::client::wp_fractional_scale_v1::WpFractionalScaleV1, - viewporter::client::wp_viewport::WpViewport, -}; use super::handlers::{ overlap::OverlapNotifyV1, wp_fractional_scaling::FractionalScalingManager, @@ -172,22 +149,6 @@ pub struct ClientState { pub(crate) outputs: Vec<(WlOutput, Output, GlobalId)>, pub delayed_surface_motion: HashMap, - - pub(crate) pending_layer_surfaces: Vec<( - smithay::wayland::shell::wlr_layer::LayerSurface, - Option, - String, - )>, - pub(crate) proxied_layer_surfaces: Vec<( - Rc, - OutputDamageTracker, - SmithayLayerSurface, - LayerSurface, - SurfaceState, - f64, - Option, - Option, - )>, } impl Debug for ClientState { @@ -214,8 +175,6 @@ impl Debug for ClientState { .field("multipool_ctr", &self.multipool_ctr) .field("last_key_pressed", &self.last_key_pressed) .field("outputs", &self.outputs) - .field("pending_layer_surfaces", &self.pending_layer_surfaces) - .field("proxied_layer_surfaces", &self.proxied_layer_surfaces) .finish() } } @@ -287,8 +246,6 @@ impl ClientState { let client_state = ClientState { focused_surface: space.get_client_focused_surface(), hovered_surface: space.get_client_hovered_surface(), - proxied_layer_surfaces: Vec::new(), - pending_layer_surfaces: Vec::new(), queue_handle: qh.clone(), connection: connection.clone(), @@ -323,48 +280,6 @@ impl ClientState { Ok(client_state) } - /// draw the proxied layer shell surfaces - pub fn draw_layer_surfaces(&mut self, renderer: &mut GlesRenderer, time: u32) { - let clear_color = &[0.0, 0.0, 0.0, 0.0]; - for (egl_surface, dmg_tracked_renderer, s_layer, c_layer, state, scale, ..) in - &mut self.proxied_layer_surfaces - { - let gen = match state { - SurfaceState::WaitingFirst(_, _) => continue, - SurfaceState::Waiting(_, _) => continue, - SurfaceState::Dirty(gen) => gen, - }; - let _ = renderer.unbind(); - let _ = renderer.bind(egl_surface.clone()); - let elements: Vec> = - s_layer.render_elements(renderer, (0, 0).into(), (*scale).into(), 1.0); - dmg_tracked_renderer - .render_output( - renderer, - egl_surface.buffer_age().unwrap_or_default() as usize, - &elements, - *clear_color, - ) - .unwrap(); - egl_surface.swap_buffers(None).unwrap(); - // FIXME: damage tracking issues on integrated graphics but not nvidia - // self.egl_surface - // .as_ref() - // .unwrap() - // .swap_buffers(res.0.as_deref_mut())?; - - renderer.unbind().unwrap(); - // TODO what if there is "no output"? - for o in &self.outputs { - let output = &o.1; - s_layer.send_frame(&o.1, Duration::from_millis(time as u64), None, move |_, _| { - Some(output.clone()) - }) - } - *state = SurfaceState::Waiting(*gen, s_layer.bbox().size); - } - } - /// initialize the toplevel info state pub fn init_toplevel_info_state(&mut self) { self.toplevel_info_state = diff --git a/cosmic-panel-bin/src/xdg_shell_wrapper/mod.rs b/cosmic-panel-bin/src/xdg_shell_wrapper/mod.rs index 241bb30d..7bcc0858 100644 --- a/cosmic-panel-bin/src/xdg_shell_wrapper/mod.rs +++ b/cosmic-panel-bin/src/xdg_shell_wrapper/mod.rs @@ -6,13 +6,8 @@ use std::time::{Duration, Instant}; use anyhow::Result; -use sctk::{reexports::client::Proxy, shm::multi::MultiPool}; -use smithay::{ - backend::input::KeyState, - input::keyboard::FilterResult, - reexports::{calloop, wayland_server::Display}, - utils::SERIAL_COUNTER, -}; +use sctk::shm::multi::MultiPool; +use smithay::reexports::{calloop, wayland_server::Display}; use client::state::ClientState; pub use client::{ @@ -90,12 +85,6 @@ pub fn run( .expect("Failed to insert cleanup timer."); global_state.bind_display(&s_dh); - let mut last_cleanup = Instant::now(); - let five_min = Duration::from_secs(300); - - // TODO find better place for this - // let set_clipboard_once = Rc::new(Cell::new(false)); - let mut prev_dur = Duration::from_millis(16); loop { let iter_start = Instant::now(); @@ -125,13 +114,6 @@ pub fn run( } global_state.draw_dnd_icon(); - if let Some(renderer) = global_state.space.renderer() { - global_state.client_state.draw_layer_surfaces( - renderer, - global_state.start_time.elapsed().as_millis().try_into()?, - ); - } - // dispatch server events { server_display.dispatch_clients(&mut global_state)?; diff --git a/cosmic-panel-bin/src/xdg_shell_wrapper/server/handlers/compositor.rs b/cosmic-panel-bin/src/xdg_shell_wrapper/server/handlers/compositor.rs index 86b6813d..41c0ec8e 100644 --- a/cosmic-panel-bin/src/xdg_shell_wrapper/server/handlers/compositor.rs +++ b/cosmic-panel-bin/src/xdg_shell_wrapper/server/handlers/compositor.rs @@ -1,25 +1,18 @@ use std::rc::Rc; -use sctk::{ - reexports::client::Proxy, - shell::{ - wlr_layer::{self, Anchor, KeyboardInteractivity}, - WaylandSurface, - }, -}; +use sctk::reexports::client::Proxy; use smithay::{ backend::{ egl::EGLSurface, renderer::{damage::OutputDamageTracker, utils::on_commit_buffer_handler, Bind, Unbind}, }, delegate_compositor, delegate_shm, - desktop::{utils::bbox_from_surface_tree, LayerSurface as SmithayLayerSurface}, + desktop::utils::bbox_from_surface_tree, reexports::wayland_server::protocol::{wl_buffer, wl_surface::WlSurface}, - utils::{Logical, Size, Transform}, + utils::Transform, wayland::{ buffer::BufferHandler, compositor::{get_role, CompositorHandler, CompositorState}, - shell::wlr_layer::{ExclusiveZone, Layer}, shm::{ShmHandler, ShmState}, }, }; @@ -27,7 +20,7 @@ use tracing::{error, info, trace}; use wayland_egl::WlEglSurface; use crate::xdg_shell_wrapper::{ - client_state::{SurfaceState, WrapperClientCompositorState}, + client_state::WrapperClientCompositorState, shared_state::GlobalState, space::{ClientEglSurface, WrapperSpace}, }; @@ -62,189 +55,6 @@ impl CompositorHandler for GlobalState { on_commit_buffer_handler::(surface); self.server_state.popup_manager.commit(surface); self.space.dirty_popup(&dh, surface); - } else if role == "zwlr_layer_surface_v1".into() { - if let Some(pos) = self - .client_state - .pending_layer_surfaces - .iter() - .position(|s| s.0.wl_surface() == surface) - { - let (surface, output, namespace) = - self.client_state.pending_layer_surfaces.swap_remove(pos); - // layer created by client - // request received here - // layer created in compositor & tracked by xdg-shell-wrapper in its own space - // that spans all outputs get renderer from wrapper space and - // draw to it - let renderer = match self.space.renderer() { - Some(r) => r, - None => return, - }; - let mut size = surface.with_pending_state(|s| s.size).unwrap_or_default(); - let server_surface = SmithayLayerSurface::new(surface, namespace.clone()); - let state = server_surface.cached_state(); - let anchor = Anchor::from_bits(state.anchor.bits()); - - if !state.anchor.anchored_horizontally() { - size.w = 1.max(size.w); - } - if !state.anchor.anchored_vertically() { - size.h = 1.max(size.h); - } - - let output = - self.client_state.outputs.iter().find(|o| { - output.as_ref().map(|output| o.1.owns(output)).unwrap_or_default() - }); - let surface = self - .client_state - .compositor_state - .create_surface(&self.client_state.queue_handle); - - let exclusive_zone = match state.exclusive_zone { - ExclusiveZone::Exclusive(area) => area as i32, - ExclusiveZone::Neutral => 0, - ExclusiveZone::DontCare => -1, - }; - let layer = match server_surface.layer() { - Layer::Background => wlr_layer::Layer::Background, - Layer::Bottom => wlr_layer::Layer::Bottom, - Layer::Top => wlr_layer::Layer::Top, - Layer::Overlay => wlr_layer::Layer::Overlay, - }; - let interactivity = match state.keyboard_interactivity { - smithay::wayland::shell::wlr_layer::KeyboardInteractivity::None => { - KeyboardInteractivity::None - }, - smithay::wayland::shell::wlr_layer::KeyboardInteractivity::Exclusive => { - KeyboardInteractivity::Exclusive - }, - smithay::wayland::shell::wlr_layer::KeyboardInteractivity::OnDemand => { - KeyboardInteractivity::OnDemand - }, - }; - let client_surface = self.client_state.layer_state.create_layer_surface( - &self.client_state.queue_handle, - surface, - layer, - Some(namespace), - output.as_ref().map(|o| &o.0), - ); - client_surface.set_margin( - state.margin.top, - state.margin.right, - state.margin.bottom, - state.margin.left, - ); - client_surface.set_keyboard_interactivity(interactivity); - client_surface.set_size(size.w as u32, size.h as u32); - client_surface.set_exclusive_zone(exclusive_zone); - if let Some(anchor) = anchor { - client_surface.set_anchor(anchor); - } - - client_surface.commit(); - let client_egl_surface = unsafe { - ClientEglSurface::new( - WlEglSurface::new( - client_surface.wl_surface().id(), - size.w.max(1), - size.h.max(1), - ) - .unwrap(), // TODO remove unwrap - client_surface.wl_surface().clone(), - ) - }; - - let egl_surface = Rc::new(unsafe { - EGLSurface::new( - renderer.egl_context().display(), - renderer - .egl_context() - .pixel_format() - .expect("Failed to get pixel format from EGL context "), - renderer.egl_context().config_id(), - client_egl_surface, - ) - .expect("Failed to create EGL Surface") - }); - - let surface = client_surface.wl_surface(); - let scale = self - .client_state - .fractional_scaling_manager - .as_ref() - .map(|f| f.fractional_scaling(surface, &self.client_state.queue_handle)); - let viewport = self.client_state.viewporter_state.as_ref().map(|v| { - let v = v.get_viewport(surface, &self.client_state.queue_handle); - if size.w > 0 && size.h > 0 { - v.set_destination(size.w, size.h); - } - v - }); - self.client_state.proxied_layer_surfaces.push(( - egl_surface, - OutputDamageTracker::new( - (size.w.max(1), size.h.max(1)), - 1., - Transform::Flipped180, - ), - server_surface, - client_surface, - SurfaceState::Waiting(0, size), - 1.0, - scale, - viewport, - )); - } - if let Some(( - egl_surface, - renderer, - s_layer_surface, - c_layer_surface, - state, - scale, - _, - viewport, - )) = self - .client_state - .proxied_layer_surfaces - .iter_mut() - .find(|s| s.2.wl_surface() == surface) - { - let old_size = s_layer_surface.bbox().size; - on_commit_buffer_handler::(surface); - let size = s_layer_surface.bbox().size; - let scaled_size = size.to_f64().to_physical_precise_round(*scale); - - if size.w <= 0 || size.h <= 0 { - return; - } - if let Some(viewport) = viewport { - viewport.set_destination(size.w, size.h); - } - let generation = match state { - SurfaceState::WaitingFirst(..) => return, - SurfaceState::Waiting(gen, _) => *gen, - SurfaceState::Dirty(gen) => *gen, - }; - - if old_size != size { - tracing::trace!("Layer surface update. old: {old_size:?}, new: {size:?}, generation: {generation}"); - egl_surface.resize(scaled_size.w, scaled_size.h, 0, 0); - c_layer_surface.set_size(size.w as u32, size.h as u32); - *renderer = - OutputDamageTracker::new(scaled_size, *scale, Transform::Flipped180); - c_layer_surface.wl_surface().commit(); - *state = if old_size.w == 0 || old_size.h == 0 { - SurfaceState::Dirty(generation) - } else { - SurfaceState::Waiting(generation.wrapping_add(1), size) - }; - } else { - *state = SurfaceState::Dirty(generation); - } - } } else if role == "dnd_icon".into() { info!("dnd_icon commit"); // render dnd icon to the active dnd icon surface @@ -279,7 +89,7 @@ impl CompositorHandler for GlobalState { let client_egl_surface = unsafe { ClientEglSurface::new( WlEglSurface::new(c_surface.id(), size.w.max(1), size.h.max(1)) - .unwrap(), /* TODO remove unwrap */ + .unwrap(), // TODO remove unwrap c_surface.clone(), ) }; diff --git a/cosmic-panel-bin/src/xdg_shell_wrapper/server/handlers/fractional.rs b/cosmic-panel-bin/src/xdg_shell_wrapper/server/handlers/fractional.rs index e8c579a3..78496dcd 100644 --- a/cosmic-panel-bin/src/xdg_shell_wrapper/server/handlers/fractional.rs +++ b/cosmic-panel-bin/src/xdg_shell_wrapper/server/handlers/fractional.rs @@ -16,18 +16,6 @@ impl FractionalScaleHandler for GlobalState { // We find the space that the surface is in, and set the fractional scale // to the fractional scale of the surface in the space - for tracked_surface in &self.client_state.proxied_layer_surfaces { - if tracked_surface.2.wl_surface() == &surface { - with_states(&surface, |states| { - with_fractional_scale(states, |fractional_scale| { - fractional_scale.set_preferred_scale(tracked_surface.5); - }); - }); - - return; - } - } - with_states(&surface, |states| { with_fractional_scale(states, |fractional_scale| { let scale_factor = self.space.get_scale_factor(&surface).unwrap_or(1.0); diff --git a/cosmic-panel-bin/src/xdg_shell_wrapper/server/handlers/layer.rs b/cosmic-panel-bin/src/xdg_shell_wrapper/server/handlers/layer.rs deleted file mode 100644 index 67e45fba..00000000 --- a/cosmic-panel-bin/src/xdg_shell_wrapper/server/handlers/layer.rs +++ /dev/null @@ -1,30 +0,0 @@ -use smithay::{ - delegate_layer_shell, - wayland::shell::wlr_layer::{Layer, WlrLayerShellHandler}, -}; - -use crate::xdg_shell_wrapper::shared_state::GlobalState; - -delegate_layer_shell!(GlobalState); -impl WlrLayerShellHandler for GlobalState { - fn shell_state(&mut self) -> &mut smithay::wayland::shell::wlr_layer::WlrLayerShellState { - &mut self.server_state.layer_shell_state - } - - fn new_layer_surface( - &mut self, - surface: smithay::wayland::shell::wlr_layer::LayerSurface, - output: Option, - _layer: Layer, - namespace: String, - ) { - self.client_state.pending_layer_surfaces.push((surface, output, namespace)); - } - - fn layer_destroyed(&mut self, surface: smithay::wayland::shell::wlr_layer::LayerSurface) { - // cleanup proxied surfaces - self.client_state - .proxied_layer_surfaces - .retain(|s| s.2.wl_surface() != surface.wl_surface()); - } -} diff --git a/cosmic-panel-bin/src/xdg_shell_wrapper/server/handlers/mod.rs b/cosmic-panel-bin/src/xdg_shell_wrapper/server/handlers/mod.rs index d5be8b0b..812f12f4 100644 --- a/cosmic-panel-bin/src/xdg_shell_wrapper/server/handlers/mod.rs +++ b/cosmic-panel-bin/src/xdg_shell_wrapper/server/handlers/mod.rs @@ -45,7 +45,6 @@ use crate::{ pub(crate) mod compositor; pub(crate) mod fractional; -pub(crate) mod layer; pub(crate) mod viewporter; pub(crate) mod xdg_shell; diff --git a/cosmic-panel-bin/src/xdg_shell_wrapper/server/state.rs b/cosmic-panel-bin/src/xdg_shell_wrapper/server/state.rs index ce39f034..01138912 100644 --- a/cosmic-panel-bin/src/xdg_shell_wrapper/server/state.rs +++ b/cosmic-panel-bin/src/xdg_shell_wrapper/server/state.rs @@ -14,7 +14,7 @@ use smithay::{ selection::{ data_device::DataDeviceState, primary_selection::PrimarySelectionState, SelectionSource, }, - shell::{wlr_layer::WlrLayerShellState, xdg::XdgShellState}, + shell::xdg::XdgShellState, shm::ShmState, viewporter::ViewporterState, }, @@ -64,7 +64,6 @@ pub struct ServerState { pub(crate) data_device_state: DataDeviceState, pub(crate) dmabuf_state: Option<(DmabufState, DmabufGlobal)>, pub(crate) primary_selection_state: PrimarySelectionState, - pub(crate) layer_shell_state: WlrLayerShellState, pub(crate) _fractional_scale_state: FractionalScaleManagerState, pub(crate) _viewporter_state: ViewporterState, } @@ -84,7 +83,6 @@ impl ServerState { seat_state: SeatState::new(), data_device_state: DataDeviceState::new::(&dh), primary_selection_state: PrimarySelectionState::new::(&dh), - layer_shell_state: WlrLayerShellState::new::(&dh), _fractional_scale_state: FractionalScaleManagerState::new::(&dh), _viewporter_state: ViewporterState::new::(&dh), diff --git a/cosmic-panel-bin/src/xdg_shell_wrapper/shared_state.rs b/cosmic-panel-bin/src/xdg_shell_wrapper/shared_state.rs index 43bed7b0..2b9de06b 100644 --- a/cosmic-panel-bin/src/xdg_shell_wrapper/shared_state.rs +++ b/cosmic-panel-bin/src/xdg_shell_wrapper/shared_state.rs @@ -4,12 +4,11 @@ use std::time::Duration; use cctk::wayland_client::Proxy; use itertools::Itertools; -use sctk::{reexports::client::protocol::wl_surface::WlSurface, shell::WaylandSurface}; +use sctk::reexports::client::protocol::wl_surface::WlSurface; use smithay::{ backend::{ input::KeyState, renderer::{ - damage::OutputDamageTracker, element::surface::{render_elements_from_surface_tree, WaylandSurfaceRenderElement}, gles::GlesRenderer, Bind, ImportDma, ImportEgl, Unbind, @@ -19,9 +18,7 @@ use smithay::{ input::keyboard::FilterResult, reexports::wayland_server::DisplayHandle, utils::SERIAL_COUNTER, - wayland::{ - compositor::with_states, dmabuf::DmabufState, fractional_scale::with_fractional_scale, - }, + wayland::dmabuf::DmabufState, }; use tracing::{error, info}; @@ -104,35 +101,6 @@ impl GlobalState { if legacy && self.client_state.fractional_scaling_manager.is_some() { return; } - for tracked_surface in &mut self.client_state.proxied_layer_surfaces { - if tracked_surface.3.wl_surface() == surface { - if legacy { - surface.set_buffer_scale(scale_factor as i32); - } - tracked_surface.5 = scale_factor; - let mut size = tracked_surface.2.bbox().size; - size.w = size.w.max(1); - size.h = size.h.max(1); - let scaled_size = size.to_f64().to_physical_precise_round(scale_factor); - - tracked_surface.1 = OutputDamageTracker::new( - scaled_size, - scale_factor, - smithay::utils::Transform::Flipped180, - ); - if let Some(viewport) = tracked_surface.7.as_ref() { - viewport.set_destination(size.w, size.h); - } - tracked_surface.0.resize(scaled_size.w.max(1), scaled_size.h.max(1), 0, 0); - - with_states(tracked_surface.2.wl_surface(), |states| { - with_fractional_scale(states, |fractional_scale| { - fractional_scale.set_preferred_scale(scale_factor); - }); - }); - return; - } - } self.space.scale_factor_changed(surface, scale_factor, legacy); } diff --git a/cosmic-panel-config/src/panel_config.rs b/cosmic-panel-config/src/panel_config.rs index b2edea39..3c656dbc 100644 --- a/cosmic-panel-config/src/panel_config.rs +++ b/cosmic-panel-config/src/panel_config.rs @@ -435,6 +435,7 @@ impl CosmicPanelConfig { }, } } + /// get applet icon dimensions pub fn get_applet_icon_size(&self, is_symbolic: bool) -> u32 { self.size.get_applet_icon_size(is_symbolic)