# layaway Hey, so, imagine you'd use [Sway] on a laptop and travel around a lot. Often times when traveling, one can temporarily connect external outputs/screens to the laptop! But oh no, what dread is waiting upon ye? Using only [Sway]'s mechanisms, one would need to calculate the exact pixel position of each output oneself! Worry not, as for this overengineered project aims to ease one's pain: Instead of specifying *absolute* pixel positions, one specifies *relative* logical positions, like "the output on eDP-1 is centered below DP-3" via a DSL. In fact, this very situation would look like this in the DSL: ``` dp3 + edp/bottom ``` And boom, that's all what's needed for this project to calculate and apply the output positions, since it fetches all details it needs from [Sway]. As shell command, this suffices: ```sh layaway 'dp3 + edp/bottom' ``` ## Installation ### From the latest release Check out https://github.com/MultisampledNight/layaway/releases/latest, it lists the shell command to run! ### From source 1. [Install Rust](https://doc.rust-lang.org/stable/book/ch01-01-installation.html) 2. Run `cargo install layaway` 3. Use `layaway` as you please! > [!WARNING] > Only [Sway] on Unixalikes is supported. > Feel free to take a peek inside the [`comms`] module > and open an issue or even PR > if you want to change that! ## Usage details See the [`parse::dsl`] module for a detailed description (including an ABNF formalization!) of how the DSL works. You can specify the layout to use over 2 ways: Imperatively over the command line (CLI), which takes precedence if both are specified, or declaratively over the config file, which allows machine-specific configuration. ### Config file Since it's rarely desirable to type the layout each time again on startup one can define a layout to use on each machine via a config file. In that case, all what one needs to do for applying the layout is to run `layaway`, and it'll look up the layout for this hostname and apply it! The config file location is determined via [directories-next], but essentially boils down to `~/.config/layaway/config.toml` (XDG compliant, respecting appropriate env variables if they're set). It's written in TOML with a single table named `[machines]`. Each key-value pair is for one machine. The key specifies the hostname for which to use it for, and the value the actual layout in the aforementioned DSL to use in that case. For example, this is the config file I'm using for two of my machines: ```toml [machines] destined = "dp + edp/bottom" overloaded = "dp3 + hdmia/right,bottom" ``` This'd use `dp + edp/bottom` if the machine hostname is `destined`, or `dp3 + hdmia/right,bottom` if the machine hostname is `overloaded`. If the machine hostname is not in the config file, one either needs to add it there or specify the layout description via the CLI. ### No apply In case you'd rather not have the layout directly applied, but just take a look over it or include it in your [Sway] config file, you can also decide to pass the `--no-apply` flag to the CLI to instead have the commands that would be ran printed to stdout. ## License Licensed under either of * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) at your option. ## Contribution Feel free to open issues or PRs for whatever you'd like to see or want! However: unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. [Sway]: https://swaywm.org [directories-next]: https://docs.rs/directories-next/2.0.0/directories_next/struct.ProjectDirs.html#method.config_dir [`parse::dsl`]: https://docs.rs/layaway/latest/layaway/parse/dsl/index.html [`comms`]: ./src/comms/mod.rs