Compare commits

...

2 commits

Author SHA1 Message Date
1cb9672b48
Reorder config fields. 2023-10-15 15:14:10 +02:00
d0ad88af6a
Add readme. 2023-10-15 15:13:52 +02:00
2 changed files with 130 additions and 2 deletions

128
README.md Normal file
View file

@ -0,0 +1,128 @@
# i3toolwait
Launch a program and move it to the correct workspace.
## Usage
`i3toolwait -c FILE`
Optionally start multiple programs and wait for their windows to appear.
Once these windows appeared a custom i3 command can be specified.
## Example
```yaml
---
timeout: 10000
init: |
(begin
(define i3_path ".container.window_properties.class")
(define sway_path ".container.app_id")
(defun idmatch (name) (== (if (has-key sway_path) (load sway_path) (load i3_path)) name))
(defun match (name) (and (== (load ".change") "new") (idmatch name)))
(defun match-load (name) (if (match name) (load ".container.id") F))
)
cmd: 'workspace 1'
programs:
- run: 'exec gtk-launch librewolf'
cmd: 'for_window [con_id="{result}"] focus; move container to workspace 1'
match: '(match-load "LibreWolf")'
- run: 'exec gtk-launch nheko || gtk-launch io.element.Element'
cmd: 'for_window [con_id="{result}"] focus; move container to workspace 2'
match: '(if (or (match "Electron") (match "nheko")) (load ".container.id") F)'
- run: 'exec gtk-launch thunderbird'
cmd: 'for_window [con_id="{result}"] focus; move container to workspace 3'
match: '(match-load "thunderbird")'
- run: 'exec nm-applet --indicator'
- run: 'exec blueman-applet'
- run: 'exec gtk-launch org.kde.kdeconnect.nonplasma'
- run: 'exec gtk-launch syncthing-gtk'
```
## Configuration
The configuration file is in YAML format.
### Configuration
#### timeout: int
_Optional_ _Default_ `3000`
Total program timeout in ms.
#### init: String
_Optional_ _Default_ `""`
Initialization program; Used to initialize the environment, useful
to define custom functions which should be available everywhere.
#### cmd: String
_Optional_ _Default_ `""`
A final i3 command to be executed before exiting.
#### programs: List[Union[[Program](#program), [Signal](#signal)]]
_Optional_ _Default_ `[]`
A list of programs to execute.
### Program
Launch all programs using [`run`](#run-string) and execute
[`cmd`](#cmd-string-1) once [`match`](#match-string) matches
a window.
#### match: String
_Required_
A lisp program which analyzes the i3 window event and returns a value.
If the return value is `false` the window does not match and no
further processing occurs. Otherwise the i3 command
[`cmd`](#cmd-string-1).
will be executed.
#### cmd: String
_Required_
A i3 command. Can contain a format `{result}` which gets replaced
by the output of the match command.
**Example:**
`for_window [con_id="{result}"] focus; move container to window 1`
#### run: String
_Optional_ _Default_ `null`
A i3 command which is run at program startup, can be used to launch
programs.
**Example:**
`exec gtk-launch firefox`
### Signal
Programs are launched in order and only advance after
[`timeout`](#timeout-int-1) or after receiving signal
`SIGUSR1`.
#### run: String
_Optional_ _Default_ `null`
A i3 command.
#### timeout: int
_Optional_ _Default_ `500`
How long to wait for the signal in ms.

View file

@ -84,10 +84,10 @@ pub struct Config {
pub timeout: u64,
#[serde(default = "Config::default_init")]
pub init: Value,
#[serde(default = "Config::default_programs")]
pub programs: Vec<ProgramEntry>,
#[serde(default)]
pub cmd: Option<String>,
#[serde(default = "Config::default_programs")]
pub programs: Vec<ProgramEntry>,
}
// Config is only unsafe because Value has dyn Any in it (via Foreign).
// if we don't use !Send in Foreign everything is fine.