1use rmux_proto::{HookName, PaneTarget, ScopeSelector, SessionName, Target, WindowTarget};
2
3#[derive(Debug, Clone, PartialEq, Eq)]
5pub enum LifecycleEvent {
6 ClientAttached {
8 session_name: SessionName,
10 client_name: Option<String>,
12 },
13 ClientDetached {
15 session_name: SessionName,
17 client_name: Option<String>,
19 },
20 ClientSessionChanged {
22 session_name: SessionName,
24 client_name: Option<String>,
26 },
27 ClientResized {
29 session_name: SessionName,
31 client_name: Option<String>,
33 },
34 SessionCreated {
36 session_name: SessionName,
38 },
39 SessionClosed {
41 session_name: SessionName,
43 session_id: Option<u32>,
45 },
46 SessionRenamed {
48 session_name: SessionName,
50 },
51 SessionWindowChanged {
53 session_name: SessionName,
55 },
56 WindowLinked {
58 session_name: SessionName,
60 target: Option<WindowTarget>,
62 },
63 WindowUnlinked {
65 session_name: SessionName,
67 target: Option<WindowTarget>,
69 window_id: Option<u32>,
71 window_name: Option<String>,
73 },
74 WindowRenamed {
76 target: WindowTarget,
78 },
79 WindowLayoutChanged {
81 target: WindowTarget,
83 },
84 WindowResized {
86 target: WindowTarget,
88 },
89 WindowPaneChanged {
91 target: WindowTarget,
93 },
94 AlertBell {
96 target: WindowTarget,
98 },
99 AlertActivity {
101 target: WindowTarget,
103 },
104 AlertSilence {
106 target: WindowTarget,
108 },
109 PaneExited {
111 target: PaneTarget,
113 pane_id: Option<u32>,
115 window_id: Option<u32>,
117 window_name: Option<String>,
119 },
120 PaneDied {
122 target: PaneTarget,
124 pane_id: Option<u32>,
126 window_id: Option<u32>,
128 window_name: Option<String>,
130 },
131 PaneModeChanged {
133 target: PaneTarget,
135 },
136 PaneFocusIn {
138 target: PaneTarget,
140 },
141 PaneFocusOut {
143 target: PaneTarget,
145 },
146 PaneTitleChanged {
148 target: PaneTarget,
150 },
151 PasteBufferChanged {
153 buffer_name: String,
155 },
156 PasteBufferDeleted {
158 buffer_name: String,
160 },
161 AfterSelectWindow {
163 target: WindowTarget,
165 },
166 AfterSelectPane {
168 target: PaneTarget,
170 },
171 AfterSendKeys {
173 target: PaneTarget,
175 },
176 AfterSetOption {
178 session_name: Option<SessionName>,
180 },
181}
182
183impl LifecycleEvent {
184 #[must_use]
186 pub const fn hook_name(&self) -> HookName {
187 match self {
188 Self::ClientAttached { .. } => HookName::ClientAttached,
189 Self::ClientDetached { .. } => HookName::ClientDetached,
190 Self::ClientSessionChanged { .. } => HookName::ClientSessionChanged,
191 Self::ClientResized { .. } => HookName::ClientResized,
192 Self::SessionCreated { .. } => HookName::SessionCreated,
193 Self::SessionClosed { .. } => HookName::SessionClosed,
194 Self::SessionRenamed { .. } => HookName::SessionRenamed,
195 Self::SessionWindowChanged { .. } => HookName::SessionWindowChanged,
196 Self::WindowLinked { .. } => HookName::WindowLinked,
197 Self::WindowUnlinked { .. } => HookName::WindowUnlinked,
198 Self::WindowRenamed { .. } => HookName::WindowRenamed,
199 Self::WindowLayoutChanged { .. } => HookName::WindowLayoutChanged,
200 Self::WindowResized { .. } => HookName::WindowResized,
201 Self::WindowPaneChanged { .. } => HookName::WindowPaneChanged,
202 Self::AlertBell { .. } => HookName::AlertBell,
203 Self::AlertActivity { .. } => HookName::AlertActivity,
204 Self::AlertSilence { .. } => HookName::AlertSilence,
205 Self::PaneExited { .. } => HookName::PaneExited,
206 Self::PaneDied { .. } => HookName::PaneDied,
207 Self::PaneModeChanged { .. } => HookName::PaneModeChanged,
208 Self::PaneFocusIn { .. } => HookName::PaneFocusIn,
209 Self::PaneFocusOut { .. } => HookName::PaneFocusOut,
210 Self::PaneTitleChanged { .. } => HookName::PaneTitleChanged,
211 Self::PasteBufferChanged { .. } => HookName::PasteBufferChanged,
212 Self::PasteBufferDeleted { .. } => HookName::PasteBufferDeleted,
213 Self::AfterSelectWindow { .. } => HookName::AfterSelectWindow,
214 Self::AfterSelectPane { .. } => HookName::AfterSelectPane,
215 Self::AfterSendKeys { .. } => HookName::AfterSendKeys,
216 Self::AfterSetOption { .. } => HookName::AfterSetOption,
217 }
218 }
219
220 #[must_use]
222 pub fn scope(&self) -> ScopeSelector {
223 match self {
224 Self::ClientAttached { session_name, .. }
225 | Self::ClientDetached { session_name, .. }
226 | Self::ClientSessionChanged { session_name, .. }
227 | Self::ClientResized { session_name, .. }
228 | Self::SessionCreated { session_name }
229 | Self::SessionClosed { session_name, .. }
230 | Self::SessionRenamed { session_name }
231 | Self::SessionWindowChanged { session_name }
232 | Self::WindowLinked { session_name, .. }
233 | Self::WindowUnlinked { session_name, .. } => {
234 ScopeSelector::Session(session_name.clone())
235 }
236 Self::WindowRenamed { target }
237 | Self::WindowLayoutChanged { target }
238 | Self::WindowResized { target }
239 | Self::WindowPaneChanged { target }
240 | Self::AlertBell { target }
241 | Self::AlertActivity { target }
242 | Self::AlertSilence { target }
243 | Self::AfterSelectWindow { target } => ScopeSelector::Window(target.clone()),
244 Self::PaneExited { target, .. }
245 | Self::PaneDied { target, .. }
246 | Self::PaneModeChanged { target }
247 | Self::PaneFocusIn { target }
248 | Self::PaneFocusOut { target }
249 | Self::PaneTitleChanged { target }
250 | Self::AfterSelectPane { target }
251 | Self::AfterSendKeys { target } => ScopeSelector::Pane(target.clone()),
252 Self::PasteBufferChanged { .. } | Self::PasteBufferDeleted { .. } => {
253 ScopeSelector::Global
254 }
255 Self::AfterSetOption {
256 session_name: Some(session_name),
257 } => ScopeSelector::Session(session_name.clone()),
258 Self::AfterSetOption { session_name: None } => ScopeSelector::Global,
259 }
260 }
261
262 #[must_use]
264 pub fn session_name(&self) -> Option<&SessionName> {
265 match self {
266 Self::ClientAttached { session_name, .. }
267 | Self::ClientDetached { session_name, .. }
268 | Self::ClientSessionChanged { session_name, .. }
269 | Self::ClientResized { session_name, .. }
270 | Self::SessionCreated { session_name }
271 | Self::SessionClosed { session_name, .. }
272 | Self::SessionRenamed { session_name }
273 | Self::SessionWindowChanged { session_name }
274 | Self::WindowLinked { session_name, .. }
275 | Self::WindowUnlinked { session_name, .. } => Some(session_name),
276 Self::WindowRenamed { target }
277 | Self::WindowLayoutChanged { target }
278 | Self::WindowResized { target }
279 | Self::WindowPaneChanged { target }
280 | Self::AlertBell { target }
281 | Self::AlertActivity { target }
282 | Self::AlertSilence { target }
283 | Self::AfterSelectWindow { target } => Some(target.session_name()),
284 Self::PaneExited { target, .. }
285 | Self::PaneDied { target, .. }
286 | Self::PaneModeChanged { target }
287 | Self::PaneFocusIn { target }
288 | Self::PaneFocusOut { target }
289 | Self::PaneTitleChanged { target }
290 | Self::AfterSelectPane { target }
291 | Self::AfterSendKeys { target } => Some(target.session_name()),
292 Self::AfterSetOption { session_name } => session_name.as_ref(),
293 Self::PasteBufferChanged { .. } | Self::PasteBufferDeleted { .. } => None,
294 }
295 }
296
297 #[must_use]
299 pub fn client_name(&self) -> Option<&str> {
300 match self {
301 Self::ClientAttached { client_name, .. }
302 | Self::ClientDetached { client_name, .. }
303 | Self::ClientSessionChanged { client_name, .. }
304 | Self::ClientResized { client_name, .. } => client_name.as_deref(),
305 _ => None,
306 }
307 }
308
309 #[must_use]
311 pub fn window_target(&self) -> Option<WindowTarget> {
312 match self {
313 Self::WindowLinked { target, .. } | Self::WindowUnlinked { target, .. } => {
314 target.clone()
315 }
316 Self::WindowRenamed { target }
317 | Self::WindowLayoutChanged { target }
318 | Self::WindowResized { target }
319 | Self::WindowPaneChanged { target }
320 | Self::AlertBell { target }
321 | Self::AlertActivity { target }
322 | Self::AlertSilence { target }
323 | Self::AfterSelectWindow { target } => Some(target.clone()),
324 Self::PaneExited { target, .. }
325 | Self::PaneDied { target, .. }
326 | Self::PaneModeChanged { target }
327 | Self::PaneFocusIn { target }
328 | Self::PaneFocusOut { target }
329 | Self::PaneTitleChanged { target }
330 | Self::AfterSelectPane { target }
331 | Self::AfterSendKeys { target } => Some(WindowTarget::with_window(
332 target.session_name().clone(),
333 target.window_index(),
334 )),
335 _ => None,
336 }
337 }
338
339 #[must_use]
341 pub fn pane_target(&self) -> Option<&PaneTarget> {
342 match self {
343 Self::PaneExited { target, .. }
344 | Self::PaneDied { target, .. }
345 | Self::PaneModeChanged { target }
346 | Self::PaneFocusIn { target }
347 | Self::PaneFocusOut { target }
348 | Self::PaneTitleChanged { target }
349 | Self::AfterSelectPane { target }
350 | Self::AfterSendKeys { target } => Some(target),
351 _ => None,
352 }
353 }
354
355 #[must_use]
357 pub const fn session_id(&self) -> Option<u32> {
358 match self {
359 Self::SessionClosed { session_id, .. } => *session_id,
360 _ => None,
361 }
362 }
363
364 #[must_use]
366 pub const fn window_id(&self) -> Option<u32> {
367 match self {
368 Self::WindowUnlinked { window_id, .. }
369 | Self::PaneExited { window_id, .. }
370 | Self::PaneDied { window_id, .. } => *window_id,
371 _ => None,
372 }
373 }
374
375 #[must_use]
377 pub fn window_name_snapshot(&self) -> Option<&str> {
378 match self {
379 Self::WindowUnlinked { window_name, .. }
380 | Self::PaneExited { window_name, .. }
381 | Self::PaneDied { window_name, .. } => window_name.as_deref(),
382 _ => None,
383 }
384 }
385
386 #[must_use]
388 pub const fn pane_id(&self) -> Option<u32> {
389 match self {
390 Self::PaneExited { pane_id, .. } | Self::PaneDied { pane_id, .. } => *pane_id,
391 _ => None,
392 }
393 }
394
395 #[must_use]
397 pub fn buffer_name(&self) -> Option<&str> {
398 match self {
399 Self::PasteBufferChanged { buffer_name } | Self::PasteBufferDeleted { buffer_name } => {
400 Some(buffer_name)
401 }
402 _ => None,
403 }
404 }
405
406 #[must_use]
408 pub fn current_target(&self) -> Option<Target> {
409 match self {
410 Self::WindowLinked {
411 session_name,
412 target: Some(target),
413 }
414 | Self::WindowUnlinked {
415 session_name,
416 target: Some(target),
417 ..
418 } => Some(Target::Window(WindowTarget::with_window(
419 session_name.clone(),
420 target.window_index(),
421 ))),
422 Self::WindowLinked { session_name, .. }
423 | Self::WindowUnlinked { session_name, .. }
424 | Self::ClientAttached { session_name, .. }
425 | Self::ClientDetached { session_name, .. }
426 | Self::ClientSessionChanged { session_name, .. }
427 | Self::ClientResized { session_name, .. }
428 | Self::SessionCreated { session_name }
429 | Self::SessionClosed { session_name, .. }
430 | Self::SessionRenamed { session_name }
431 | Self::SessionWindowChanged { session_name } => {
432 Some(Target::Session(session_name.clone()))
433 }
434 Self::WindowRenamed { target }
435 | Self::WindowLayoutChanged { target }
436 | Self::WindowResized { target }
437 | Self::WindowPaneChanged { target }
438 | Self::AlertBell { target }
439 | Self::AlertActivity { target }
440 | Self::AlertSilence { target }
441 | Self::AfterSelectWindow { target } => Some(Target::Window(target.clone())),
442 Self::PaneExited { target, .. }
443 | Self::PaneDied { target, .. }
444 | Self::PaneModeChanged { target }
445 | Self::PaneFocusIn { target }
446 | Self::PaneFocusOut { target }
447 | Self::PaneTitleChanged { target }
448 | Self::AfterSelectPane { target }
449 | Self::AfterSendKeys { target } => Some(Target::Pane(target.clone())),
450 Self::AfterSetOption {
451 session_name: Some(session_name),
452 } => Some(Target::Session(session_name.clone())),
453 Self::AfterSetOption { session_name: None }
454 | Self::PasteBufferChanged { .. }
455 | Self::PasteBufferDeleted { .. } => None,
456 }
457 }
458}