use rmux_proto::{HookName, PaneTarget, ScopeSelector, SessionName, Target, WindowTarget};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum LifecycleEvent {
ClientActive {
session_name: SessionName,
client_name: Option<String>,
},
ClientAttached {
session_name: SessionName,
client_name: Option<String>,
},
ClientDetached {
session_name: SessionName,
client_name: Option<String>,
},
ClientFocusIn {
session_name: SessionName,
client_name: Option<String>,
},
ClientFocusOut {
session_name: SessionName,
client_name: Option<String>,
},
ClientSessionChanged {
session_name: SessionName,
client_name: Option<String>,
},
ClientResized {
session_name: SessionName,
client_name: Option<String>,
},
ClientLightTheme {
session_name: SessionName,
client_name: Option<String>,
},
ClientDarkTheme {
session_name: SessionName,
client_name: Option<String>,
},
SessionCreated {
session_name: SessionName,
},
SessionClosed {
session_name: SessionName,
session_id: Option<u32>,
},
SessionRenamed {
session_name: SessionName,
},
SessionWindowChanged {
session_name: SessionName,
},
WindowLinked {
session_name: SessionName,
target: Option<WindowTarget>,
},
WindowUnlinked {
session_name: SessionName,
target: Option<WindowTarget>,
window_id: Option<u32>,
window_name: Option<String>,
},
WindowRenamed {
target: WindowTarget,
},
WindowLayoutChanged {
target: WindowTarget,
},
WindowResized {
target: WindowTarget,
},
WindowPaneChanged {
target: WindowTarget,
},
AlertBell {
target: WindowTarget,
},
AlertActivity {
target: WindowTarget,
},
AlertSilence {
target: WindowTarget,
},
PaneExited {
target: PaneTarget,
pane_id: Option<u32>,
window_id: Option<u32>,
window_name: Option<String>,
},
PaneDied {
target: PaneTarget,
pane_id: Option<u32>,
window_id: Option<u32>,
window_name: Option<String>,
},
PaneModeChanged {
target: PaneTarget,
},
PaneFocusIn {
target: PaneTarget,
},
PaneFocusOut {
target: PaneTarget,
},
PaneSetClipboard {
target: PaneTarget,
},
PaneTitleChanged {
target: PaneTarget,
},
PasteBufferChanged {
buffer_name: String,
},
PasteBufferDeleted {
buffer_name: String,
},
AfterSelectWindow {
target: WindowTarget,
},
AfterSelectPane {
target: PaneTarget,
},
AfterSendKeys {
target: PaneTarget,
},
AfterSetOption {
session_name: Option<SessionName>,
},
}
impl LifecycleEvent {
#[must_use]
pub const fn hook_name(&self) -> HookName {
match self {
Self::ClientActive { .. } => HookName::ClientActive,
Self::ClientAttached { .. } => HookName::ClientAttached,
Self::ClientDetached { .. } => HookName::ClientDetached,
Self::ClientFocusIn { .. } => HookName::ClientFocusIn,
Self::ClientFocusOut { .. } => HookName::ClientFocusOut,
Self::ClientSessionChanged { .. } => HookName::ClientSessionChanged,
Self::ClientResized { .. } => HookName::ClientResized,
Self::ClientLightTheme { .. } => HookName::ClientLightTheme,
Self::ClientDarkTheme { .. } => HookName::ClientDarkTheme,
Self::SessionCreated { .. } => HookName::SessionCreated,
Self::SessionClosed { .. } => HookName::SessionClosed,
Self::SessionRenamed { .. } => HookName::SessionRenamed,
Self::SessionWindowChanged { .. } => HookName::SessionWindowChanged,
Self::WindowLinked { .. } => HookName::WindowLinked,
Self::WindowUnlinked { .. } => HookName::WindowUnlinked,
Self::WindowRenamed { .. } => HookName::WindowRenamed,
Self::WindowLayoutChanged { .. } => HookName::WindowLayoutChanged,
Self::WindowResized { .. } => HookName::WindowResized,
Self::WindowPaneChanged { .. } => HookName::WindowPaneChanged,
Self::AlertBell { .. } => HookName::AlertBell,
Self::AlertActivity { .. } => HookName::AlertActivity,
Self::AlertSilence { .. } => HookName::AlertSilence,
Self::PaneExited { .. } => HookName::PaneExited,
Self::PaneDied { .. } => HookName::PaneDied,
Self::PaneModeChanged { .. } => HookName::PaneModeChanged,
Self::PaneFocusIn { .. } => HookName::PaneFocusIn,
Self::PaneFocusOut { .. } => HookName::PaneFocusOut,
Self::PaneSetClipboard { .. } => HookName::PaneSetClipboard,
Self::PaneTitleChanged { .. } => HookName::PaneTitleChanged,
Self::PasteBufferChanged { .. } => HookName::PasteBufferChanged,
Self::PasteBufferDeleted { .. } => HookName::PasteBufferDeleted,
Self::AfterSelectWindow { .. } => HookName::AfterSelectWindow,
Self::AfterSelectPane { .. } => HookName::AfterSelectPane,
Self::AfterSendKeys { .. } => HookName::AfterSendKeys,
Self::AfterSetOption { .. } => HookName::AfterSetOption,
}
}
#[must_use]
pub fn scope(&self) -> ScopeSelector {
match self {
Self::ClientActive { session_name, .. }
| Self::ClientAttached { session_name, .. }
| Self::ClientDetached { session_name, .. }
| Self::ClientFocusIn { session_name, .. }
| Self::ClientFocusOut { session_name, .. }
| Self::ClientSessionChanged { session_name, .. }
| Self::ClientResized { session_name, .. }
| Self::ClientLightTheme { session_name, .. }
| Self::ClientDarkTheme { session_name, .. }
| Self::SessionCreated { session_name }
| Self::SessionClosed { session_name, .. }
| Self::SessionRenamed { session_name }
| Self::SessionWindowChanged { session_name }
| Self::WindowLinked { session_name, .. }
| Self::WindowUnlinked { session_name, .. } => {
ScopeSelector::Session(session_name.clone())
}
Self::WindowRenamed { target }
| Self::WindowLayoutChanged { target }
| Self::WindowResized { target }
| Self::WindowPaneChanged { target }
| Self::AlertBell { target }
| Self::AlertActivity { target }
| Self::AlertSilence { target }
| Self::AfterSelectWindow { target } => ScopeSelector::Window(target.clone()),
Self::PaneExited { target, .. }
| Self::PaneDied { target, .. }
| Self::PaneModeChanged { target }
| Self::PaneFocusIn { target }
| Self::PaneFocusOut { target }
| Self::PaneSetClipboard { target }
| Self::PaneTitleChanged { target }
| Self::AfterSelectPane { target }
| Self::AfterSendKeys { target } => ScopeSelector::Pane(target.clone()),
Self::PasteBufferChanged { .. } | Self::PasteBufferDeleted { .. } => {
ScopeSelector::Global
}
Self::AfterSetOption {
session_name: Some(session_name),
} => ScopeSelector::Session(session_name.clone()),
Self::AfterSetOption { session_name: None } => ScopeSelector::Global,
}
}
#[must_use]
pub fn session_name(&self) -> Option<&SessionName> {
match self {
Self::ClientActive { session_name, .. }
| Self::ClientAttached { session_name, .. }
| Self::ClientDetached { session_name, .. }
| Self::ClientFocusIn { session_name, .. }
| Self::ClientFocusOut { session_name, .. }
| Self::ClientSessionChanged { session_name, .. }
| Self::ClientResized { session_name, .. }
| Self::ClientLightTheme { session_name, .. }
| Self::ClientDarkTheme { session_name, .. }
| Self::SessionCreated { session_name }
| Self::SessionClosed { session_name, .. }
| Self::SessionRenamed { session_name }
| Self::SessionWindowChanged { session_name }
| Self::WindowLinked { session_name, .. }
| Self::WindowUnlinked { session_name, .. } => Some(session_name),
Self::WindowRenamed { target }
| Self::WindowLayoutChanged { target }
| Self::WindowResized { target }
| Self::WindowPaneChanged { target }
| Self::AlertBell { target }
| Self::AlertActivity { target }
| Self::AlertSilence { target }
| Self::AfterSelectWindow { target } => Some(target.session_name()),
Self::PaneExited { target, .. }
| Self::PaneDied { target, .. }
| Self::PaneModeChanged { target }
| Self::PaneFocusIn { target }
| Self::PaneFocusOut { target }
| Self::PaneSetClipboard { target }
| Self::PaneTitleChanged { target }
| Self::AfterSelectPane { target }
| Self::AfterSendKeys { target } => Some(target.session_name()),
Self::AfterSetOption { session_name } => session_name.as_ref(),
Self::PasteBufferChanged { .. } | Self::PasteBufferDeleted { .. } => None,
}
}
#[must_use]
pub fn client_name(&self) -> Option<&str> {
match self {
Self::ClientAttached { client_name, .. }
| Self::ClientDetached { client_name, .. }
| Self::ClientActive { client_name, .. }
| Self::ClientFocusIn { client_name, .. }
| Self::ClientFocusOut { client_name, .. }
| Self::ClientSessionChanged { client_name, .. }
| Self::ClientResized { client_name, .. }
| Self::ClientLightTheme { client_name, .. }
| Self::ClientDarkTheme { client_name, .. } => client_name.as_deref(),
_ => None,
}
}
#[must_use]
pub fn window_target(&self) -> Option<WindowTarget> {
match self {
Self::WindowLinked { target, .. } | Self::WindowUnlinked { target, .. } => {
target.clone()
}
Self::WindowRenamed { target }
| Self::WindowLayoutChanged { target }
| Self::WindowResized { target }
| Self::WindowPaneChanged { target }
| Self::AlertBell { target }
| Self::AlertActivity { target }
| Self::AlertSilence { target }
| Self::AfterSelectWindow { target } => Some(target.clone()),
Self::PaneExited { target, .. }
| Self::PaneDied { target, .. }
| Self::PaneModeChanged { target }
| Self::PaneFocusIn { target }
| Self::PaneFocusOut { target }
| Self::PaneSetClipboard { target }
| Self::PaneTitleChanged { target }
| Self::AfterSelectPane { target }
| Self::AfterSendKeys { target } => Some(WindowTarget::with_window(
target.session_name().clone(),
target.window_index(),
)),
_ => None,
}
}
#[must_use]
pub fn pane_target(&self) -> Option<&PaneTarget> {
match self {
Self::PaneExited { target, .. }
| Self::PaneDied { target, .. }
| Self::PaneModeChanged { target }
| Self::PaneFocusIn { target }
| Self::PaneFocusOut { target }
| Self::PaneSetClipboard { target }
| Self::PaneTitleChanged { target }
| Self::AfterSelectPane { target }
| Self::AfterSendKeys { target } => Some(target),
_ => None,
}
}
#[must_use]
pub const fn session_id(&self) -> Option<u32> {
match self {
Self::SessionClosed { session_id, .. } => *session_id,
_ => None,
}
}
#[must_use]
pub const fn window_id(&self) -> Option<u32> {
match self {
Self::WindowUnlinked { window_id, .. }
| Self::PaneExited { window_id, .. }
| Self::PaneDied { window_id, .. } => *window_id,
_ => None,
}
}
#[must_use]
pub fn window_name_snapshot(&self) -> Option<&str> {
match self {
Self::WindowUnlinked { window_name, .. }
| Self::PaneExited { window_name, .. }
| Self::PaneDied { window_name, .. } => window_name.as_deref(),
_ => None,
}
}
#[must_use]
pub const fn pane_id(&self) -> Option<u32> {
match self {
Self::PaneExited { pane_id, .. } | Self::PaneDied { pane_id, .. } => *pane_id,
_ => None,
}
}
#[must_use]
pub fn buffer_name(&self) -> Option<&str> {
match self {
Self::PasteBufferChanged { buffer_name } | Self::PasteBufferDeleted { buffer_name } => {
Some(buffer_name)
}
_ => None,
}
}
#[must_use]
pub fn current_target(&self) -> Option<Target> {
match self {
Self::WindowLinked {
session_name,
target: Some(target),
}
| Self::WindowUnlinked {
session_name,
target: Some(target),
..
} => Some(Target::Window(WindowTarget::with_window(
session_name.clone(),
target.window_index(),
))),
Self::WindowLinked { session_name, .. }
| Self::WindowUnlinked { session_name, .. }
| Self::ClientActive { session_name, .. }
| Self::ClientAttached { session_name, .. }
| Self::ClientDetached { session_name, .. }
| Self::ClientFocusIn { session_name, .. }
| Self::ClientFocusOut { session_name, .. }
| Self::ClientSessionChanged { session_name, .. }
| Self::ClientResized { session_name, .. }
| Self::ClientLightTheme { session_name, .. }
| Self::ClientDarkTheme { session_name, .. }
| Self::SessionCreated { session_name }
| Self::SessionClosed { session_name, .. }
| Self::SessionRenamed { session_name }
| Self::SessionWindowChanged { session_name } => {
Some(Target::Session(session_name.clone()))
}
Self::WindowRenamed { target }
| Self::WindowLayoutChanged { target }
| Self::WindowResized { target }
| Self::WindowPaneChanged { target }
| Self::AlertBell { target }
| Self::AlertActivity { target }
| Self::AlertSilence { target }
| Self::AfterSelectWindow { target } => Some(Target::Window(target.clone())),
Self::PaneExited { target, .. }
| Self::PaneDied { target, .. }
| Self::PaneModeChanged { target }
| Self::PaneFocusIn { target }
| Self::PaneFocusOut { target }
| Self::PaneSetClipboard { target }
| Self::PaneTitleChanged { target }
| Self::AfterSelectPane { target }
| Self::AfterSendKeys { target } => Some(Target::Pane(target.clone())),
Self::AfterSetOption {
session_name: Some(session_name),
} => Some(Target::Session(session_name.clone())),
Self::AfterSetOption { session_name: None }
| Self::PasteBufferChanged { .. }
| Self::PasteBufferDeleted { .. } => None,
}
}
}