feat(subscriptions): add and remove subscribers

This commit adds two new commands to add and remove subscribers to
WindowManagerEvent and SocketMessage notifications after they have been
handled by komorebi.

Interprocess communication is achieved using Named Pipes; the
subscribing process must first create the Named Pipe, and then run the
'add-subscriber' command, specifying the pipe name as the argument
(without the pipe filesystem path prepended).

Whenever a pipe is closing or has been closed, komorebi will flag this
as a stale subscription and remove it automatically.

resolve #54
This commit is contained in:
LGUG2Z
2021-10-25 09:31:56 -07:00
parent f17bfe267e
commit 6ae59671a2
12 changed files with 146 additions and 8 deletions

View File

@@ -314,6 +314,18 @@ struct LoadCustomLayout {
path: String,
}
#[derive(Clap, AhkFunction)]
struct AddSubscriber {
/// Name of the pipe to send notifications to (without "\\.\pipe\" prepended)
named_pipe: String,
}
#[derive(Clap, AhkFunction)]
struct RemoveSubscriber {
/// Name of the pipe to stop sending notifications to (without "\\.\pipe\" prepended)
named_pipe: String,
}
#[derive(Clap)]
#[clap(author, about, version, setting = AppSettings::DeriveDisplayOrder)]
struct Opts {
@@ -332,6 +344,12 @@ enum SubCommand {
/// Query the current window manager state
#[clap(setting = AppSettings::ArgRequiredElseHelp)]
Query(Query),
/// Subscribe to all komorebi events on a named pipe
#[clap(setting = AppSettings::ArgRequiredElseHelp)]
AddSubscriber(AddSubscriber),
/// Subscribe to all komorebi events on a named pipe
#[clap(setting = AppSettings::ArgRequiredElseHelp)]
RemoveSubscriber(RemoveSubscriber),
/// Tail komorebi.exe's process logs (cancel with Ctrl-C)
Log,
/// Quicksave the current resize layout dimensions
@@ -895,6 +913,12 @@ fn main() -> Result<()> {
SubCommand::Load(arg) => {
send_message(&*SocketMessage::Load(resolve_windows_path(&arg.path)?).as_bytes()?)?;
}
SubCommand::AddSubscriber(arg) => {
send_message(&*SocketMessage::AddSubscriber(arg.named_pipe).as_bytes()?)?;
}
SubCommand::RemoveSubscriber(arg) => {
send_message(&*SocketMessage::RemoveSubscriber(arg.named_pipe).as_bytes()?)?;
}
}
Ok(())