diff --git a/deploy-notes.md b/deploy-notes.md index 7850c7a6..af079d9e 100644 --- a/deploy-notes.md +++ b/deploy-notes.md @@ -1,5 +1,9 @@ # Unreleased +- Needs jay-config release. +- Needs jay-toml-config release. +- Needs jay-compositor release. + # 1.10.0 - Needs jay-algorithms release. diff --git a/jay-config/src/_private/client.rs b/jay-config/src/_private/client.rs index 00e0358e..ea99c40e 100644 --- a/jay-config/src/_private/client.rs +++ b/jay-config/src/_private/client.rs @@ -768,6 +768,16 @@ impl Client { self.send(&ClientMessage::SetColorManagementEnabled { enabled }); } + pub fn set_float_above_fullscreen(&self, above: bool) { + self.send(&ClientMessage::SetFloatAboveFullscreen { above }); + } + + pub fn get_float_above_fullscreen(&self) -> bool { + let res = self.send_with_response(&ClientMessage::GetFloatAboveFullscreen); + get_response!(res, false, GetFloatAboveFullscreen { above }); + above + } + pub fn connector_connected(&self, connector: Connector) -> bool { let res = self.send_with_response(&ClientMessage::ConnectorConnected { connector }); get_response!(res, false, ConnectorConnected { connected }); diff --git a/jay-config/src/_private/ipc.rs b/jay-config/src/_private/ipc.rs index b1bc0de3..2f7ddbb8 100644 --- a/jay-config/src/_private/ipc.rs +++ b/jay-config/src/_private/ipc.rs @@ -542,6 +542,10 @@ pub enum ClientMessage<'a> { connector: Connector, brightness: Option, }, + SetFloatAboveFullscreen { + above: bool, + }, + GetFloatAboveFullscreen, } #[derive(Serialize, Deserialize, Debug)] @@ -690,6 +694,9 @@ pub enum Response { GetSocketPath { path: String, }, + GetFloatAboveFullscreen { + above: bool, + }, } #[derive(Serialize, Deserialize, Debug)] diff --git a/jay-config/src/lib.rs b/jay-config/src/lib.rs index 164551d3..688c4df3 100644 --- a/jay-config/src/lib.rs +++ b/jay-config/src/lib.rs @@ -273,3 +273,22 @@ pub fn set_ui_drag_threshold(threshold: i32) { pub fn set_color_management_enabled(enabled: bool) { get!().set_color_management_enabled(enabled); } + +/// Sets whether floating windows are shown above fullscreen windows. +/// +/// The default is `false`. +pub fn set_float_above_fullscreen(above: bool) { + get!().set_float_above_fullscreen(above); +} + +/// Gets whether floating windows are shown above fullscreen windows. +pub fn get_float_above_fullscreen() -> bool { + get!().get_float_above_fullscreen() +} + +/// Toggles whether floating windows are shown above fullscreen windows. +/// +/// The default is `false`. +pub fn toggle_float_above_fullscreen() { + set_float_above_fullscreen(!get_float_above_fullscreen()) +} diff --git a/release-notes.md b/release-notes.md index 9fb60eef..26f0d194 100644 --- a/release-notes.md +++ b/release-notes.md @@ -1,5 +1,8 @@ # Unreleased +- Floating windows can now be configured to be shown above fullscreen windows + by using the `enable-float-above-fullscreen` action. + # 1.10.0 (2025-04-22) - Various bugfixes. diff --git a/src/compositor.rs b/src/compositor.rs index 12cfd166..82b5f8bb 100644 --- a/src/compositor.rs +++ b/src/compositor.rs @@ -287,6 +287,7 @@ fn start_compositor2( workspace_managers: Default::default(), color_management_enabled: Cell::new(false), color_manager, + float_above_fullscreen: Cell::new(false), }); state.tracker.register(ClientId::from_raw(0)); create_dummy_output(&state); diff --git a/src/config/handler.rs b/src/config/handler.rs index c0053d37..847a9fdc 100644 --- a/src/config/handler.rs +++ b/src/config/handler.rs @@ -1136,6 +1136,21 @@ impl ConfigProxyHandler { Ok(()) } + fn handle_set_float_above_fullscreen(&self, above: bool) { + self.state.float_above_fullscreen.set(above); + for seat in self.state.globals.seats.lock().values() { + seat.emulate_cursor_moved(); + seat.trigger_tree_changed(false); + } + self.state.root.update_visible(&self.state); + } + + fn handle_get_float_above_fullscreen(&self) { + self.respond(Response::GetFloatAboveFullscreen { + above: self.state.float_above_fullscreen.get(), + }); + } + fn handle_set_vrr_mode( &self, connector: Option, @@ -2039,6 +2054,10 @@ impl ConfigProxyHandler { } => self .handle_connector_set_brightness(connector, brightness) .wrn("connector_set_brightness")?, + ClientMessage::SetFloatAboveFullscreen { above } => { + self.handle_set_float_above_fullscreen(above) + } + ClientMessage::GetFloatAboveFullscreen => self.handle_get_float_above_fullscreen(), } Ok(()) } diff --git a/src/ifs/wl_seat/event_handling.rs b/src/ifs/wl_seat/event_handling.rs index 9bddd746..726b4415 100644 --- a/src/ifs/wl_seat/event_handling.rs +++ b/src/ifs/wl_seat/event_handling.rs @@ -1093,6 +1093,10 @@ impl WlSeatGlobal { self.apply_changes(); } + pub fn emulate_cursor_moved(&self) { + self.changes.or_assign(CHANGE_CURSOR_MOVED); + } + pub fn clear_shortcuts(&self) { self.shortcuts.borrow_mut().clear(); } diff --git a/src/state.rs b/src/state.rs index 66c74e5d..b488ac28 100644 --- a/src/state.rs +++ b/src/state.rs @@ -236,6 +236,7 @@ pub struct State { pub workspace_managers: WorkspaceManagerState, pub color_management_enabled: Cell, pub color_manager: Rc, + pub float_above_fullscreen: Cell, } // impl Drop for State { diff --git a/src/tree/float.rs b/src/tree/float.rs index 5c61fe69..adab1bba 100644 --- a/src/tree/float.rs +++ b/src/tree/float.rs @@ -115,7 +115,7 @@ impl FloatNode { let floater = Rc::new(FloatNode { id: state.node_ids.next(), state: state.clone(), - visible: Cell::new(ws.container_visible()), + visible: Cell::new(ws.float_visible()), position: Cell::new(position), display_link: RefCell::new(None), workspace_link: Cell::new(None), @@ -408,7 +408,7 @@ impl FloatNode { self.workspace_link .set(Some(ws.stacked.add_last(self.clone()))); self.workspace.set(ws.clone()); - self.stacked_set_visible(ws.container_visible()); + self.stacked_set_visible(ws.float_visible()); } fn update_child_title(self: &Rc, title: &str) { diff --git a/src/tree/workspace.rs b/src/tree/workspace.rs index fd98dc93..63d5b0d4 100644 --- a/src/tree/workspace.rs +++ b/src/tree/workspace.rs @@ -165,6 +165,10 @@ impl WorkspaceNode { self.visible.get() && self.fullscreen.is_none() } + pub fn float_visible(&self) -> bool { + self.visible.get() && (self.fullscreen.is_none() || self.state.float_above_fullscreen.get()) + } + pub fn change_extents(&self, rect: &Rect) { self.position.set(*rect); if let Some(c) = self.container.get() { @@ -197,7 +201,7 @@ impl WorkspaceNode { } for stacked in self.stacked.iter() { if stacked.stacked_needs_set_visible() { - stacked.stacked_set_visible(self.container_visible()); + stacked.stacked_set_visible(self.float_visible()); } } self.seat_state.set_visible(self, visible); diff --git a/toml-config/src/config.rs b/toml-config/src/config.rs index b3924c49..24b492b6 100644 --- a/toml-config/src/config.rs +++ b/toml-config/src/config.rs @@ -56,6 +56,8 @@ pub enum SimpleCommand { ToggleSplit, Forward(bool), EnableWindowManagement(bool), + SetFloatAboveFullscreen(bool), + ToggleFloatAboveFullscreen, } #[derive(Debug, Clone)] diff --git a/toml-config/src/config/parsers/action.rs b/toml-config/src/config/parsers/action.rs index 4fbddb36..34a2160e 100644 --- a/toml-config/src/config/parsers/action.rs +++ b/toml-config/src/config/parsers/action.rs @@ -113,6 +113,9 @@ impl ActionParser<'_> { "consume" => Forward(false), "enable-window-management" => EnableWindowManagement(true), "disable-window-management" => EnableWindowManagement(false), + "enable-float-above-fullscreen" => SetFloatAboveFullscreen(true), + "disable-float-above-fullscreen" => SetFloatAboveFullscreen(false), + "toggle-float-above-fullscreen" => ToggleFloatAboveFullscreen, _ => { return Err( ActionParserError::UnknownSimpleAction(string.to_string()).spanned(span) diff --git a/toml-config/src/lib.rs b/toml-config/src/lib.rs index b4bf7998..9e4e503c 100644 --- a/toml-config/src/lib.rs +++ b/toml-config/src/lib.rs @@ -24,11 +24,12 @@ use { keyboard::{Keymap, ModifiedKeySym}, logging::set_log_level, on_devices_enumerated, on_idle, quit, reload, set_color_management_enabled, - set_default_workspace_capture, set_explicit_sync_enabled, set_idle, set_idle_grace_period, - set_ui_drag_enabled, set_ui_drag_threshold, + set_default_workspace_capture, set_explicit_sync_enabled, set_float_above_fullscreen, + set_idle, set_idle_grace_period, set_ui_drag_enabled, set_ui_drag_threshold, status::{set_i3bar_separator, set_status, set_status_command, unset_status_command}, switch_to_vt, theme::{reset_colors, reset_font, reset_sizes, set_font}, + toggle_float_above_fullscreen, video::{ ColorSpace, Connector, DrmDevice, TransferFunction, connectors, drm_devices, on_connector_connected, on_connector_disconnected, on_graphics_initialized, @@ -96,6 +97,12 @@ impl Action { SimpleCommand::EnableWindowManagement(bool) => { B::new(move || s.set_window_management_enabled(bool)) } + SimpleCommand::SetFloatAboveFullscreen(bool) => { + B::new(move || set_float_above_fullscreen(bool)) + } + SimpleCommand::ToggleFloatAboveFullscreen => { + B::new(|| toggle_float_above_fullscreen()) + } }, Action::Multi { actions } => { let actions: Vec<_> = actions.into_iter().map(|a| a.into_fn(state)).collect(); diff --git a/toml-spec/spec/spec.generated.json b/toml-spec/spec/spec.generated.json index b9fb6ac2..a712c28d 100644 --- a/toml-spec/spec/spec.generated.json +++ b/toml-spec/spec/spec.generated.json @@ -1281,7 +1281,10 @@ "forward", "none", "enable-window-management", - "disable-window-management" + "disable-window-management", + "enable-float-above-fullscreen", + "disable-float-above-fullscreen", + "toggle-float-above-fullscreen" ] }, "Status": { diff --git a/toml-spec/spec/spec.generated.md b/toml-spec/spec/spec.generated.md index 94c4bd67..3d19e38c 100644 --- a/toml-spec/spec/spec.generated.md +++ b/toml-spec/spec/spec.generated.md @@ -2891,6 +2891,20 @@ The string should have one of the following values: Disables window management mode. +- `enable-float-above-fullscreen`: + + Enables floating windows showing above fullscreen windows. + + By default, floating windows are hidden below fullscreen windows. + +- `disable-float-above-fullscreen`: + + Disables floating windows showing above fullscreen windows. + +- `toggle-float-above-fullscreen`: + + Toggles floating windows showing above fullscreen windows. + diff --git a/toml-spec/spec/spec.yaml b/toml-spec/spec/spec.yaml index 99d52cf2..a11fe4f4 100644 --- a/toml-spec/spec/spec.yaml +++ b/toml-spec/spec/spec.yaml @@ -701,6 +701,17 @@ SimpleActionName: - value: disable-window-management description: | Disables window management mode. + - value: enable-float-above-fullscreen + description: | + Enables floating windows showing above fullscreen windows. + + By default, floating windows are hidden below fullscreen windows. + - value: disable-float-above-fullscreen + description: | + Disables floating windows showing above fullscreen windows. + - value: toggle-float-above-fullscreen + description: | + Toggles floating windows showing above fullscreen windows. Color: