aboutsummaryrefslogtreecommitdiff
path: root/src/app/state.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/state.rs')
-rw-r--r--src/app/state.rs28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/app/state.rs b/src/app/state.rs
index c0f2c8bb..d821407b 100644
--- a/src/app/state.rs
+++ b/src/app/state.rs
@@ -53,6 +53,14 @@ fn pane_graphics_data_fingerprint(data: &[u8]) -> u64 {
hasher.finish()
}
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub(crate) struct PopupPaneState {
+ pub pane_id: PaneId,
+ pub terminal_id: crate::terminal::TerminalId,
+ pub width: Option<crate::popup_size::PopupSize>,
+ pub height: Option<crate::popup_size::PopupSize>,
+}
+
// ---------------------------------------------------------------------------
// Selection autoscroll types
// ---------------------------------------------------------------------------
@@ -1515,6 +1523,8 @@ pub struct AppState {
pub(crate) pane_graphics_streams: std::collections::HashMap<PaneId, String>,
/// Monotonic marker for accepted pane graphics mutations.
pub(crate) pane_graphics_revision: u64,
+ /// Session-modal terminal popup. This is intentionally outside workspace layouts.
+ pub(crate) popup_pane: Option<PopupPaneState>,
/// Recent plugin action/event command executions.
pub(crate) plugin_command_logs: Vec<crate::api::schema::PluginCommandLogInfo>,
pub(crate) next_plugin_command_log_id: u64,
@@ -1608,7 +1618,9 @@ impl AppState {
&self,
terminal_runtimes: &crate::terminal::TerminalRuntimeRegistry,
) -> bool {
- self.mouse_capture || self.focused_pane_requests_mouse_capture_from(terminal_runtimes)
+ self.mouse_capture
+ || self.popup_pane.is_some()
+ || self.focused_pane_requests_mouse_capture_from(terminal_runtimes)
}
pub fn is_prefix_key(&self, key: crate::input::TerminalKey) -> bool {
@@ -1874,6 +1886,7 @@ impl AppState {
pane_graphics_layers: std::collections::HashMap::new(),
pane_graphics_streams: std::collections::HashMap::new(),
pane_graphics_revision: 0,
+ popup_pane: None,
plugin_command_logs: Vec::new(),
next_plugin_command_log_id: 1,
plugin_commands_in_flight: 0,
@@ -2104,6 +2117,19 @@ impl AppState {
"pending agent notification",
);
}
+ if let Some(popup) = &self.popup_pane {
+ assert!(
+ self.terminals.contains_key(&popup.terminal_id),
+ "popup {:?} references missing terminal {}",
+ popup.pane_id,
+ popup.terminal_id
+ );
+ assert!(
+ !attached_terminal_ids.contains(&popup.terminal_id),
+ "popup terminal {} must not be attached to a tiled pane",
+ popup.terminal_id
+ );
+ }
for &pane_id in self.plugin_panes.keys() {
assert_live_pane(pane_id, "plugin pane record");
}