# wallswitch
## Random Wallpaper for Multiple Monitors
```
#-----------#-----------# ... ... #-----------#
| | | | |
#-----------#-----------# ... ... #-----------#
```
**Description:**
`wallswitch` randomly selects wallpapers for multiple monitors.
**Features:**
* **Random Wallpaper Selection:** Dynamically chooses different wallpapers from designated directories for every monitor.
* **Configurable Filtering:**
* **Dimension Control:** Refine your wallpaper choices by setting minimum and maximum dimensions (height and width) to include only images within a specific size range.
* **File Size Management:** Specify minimum and maximum file sizes for searching, allowing you to exclude very large or small images.
* **Flexible Configuration:** Customize `wallswitch` with options for:
* **Directory Specification:** Define custom directories containing your wallpaper images using the `directories` option.
* **Image File Types:** Select specific image extensions (e.g., JPG, PNG, SVG) through the `extensions` option.
* **Resolution Matching:** Optimize display by matching wallpapers to monitor resolutions defined in the `resolutions` array.
* **Wallpaper Cycling Interval:** Set the time interval between wallpaper changes using the `interval` option.
* **Image Sorting:** Optionally sort selected images based on filename using the `sort` option.
**Usage:**
Run the command:
```bash
wallswitch
```
The default number of monitors is set to `m = 2`.
Wallpapers will be recursively searched in the specified directories (`"directories": [...]`) for files with compatible extensions (`"extensions": [...]`).
## Configuration
The configuration file, located at `~/.config/wallswitch/wallswitch.json`, is key to customizing wallswitch behavior:
* **Displaying the Configuration:**
- Direct Display:
```bash
wallswitch -c
```
- Parsing with [jq](https://jqlang.github.io/jq/):
```bash
cat ~/.config/wallswitch/wallswitch.json | jq
```
The default configuration file has the following structure:
```json
{
"desktop": "gnome-xorg", // Desktop environment (e.g., gnome, xfce4)
"directories": [
"/home/user_name/Figures",
"/home/user_name/Images",
"/home/user_name/Pictures",
"/home/user_name/Wallpapers",
"/home/user_name/Imagens",
"/usr/share/wallpapers",
"/usr/share/backgrounds",
"/tmp/teste"
],
"extensions": [
"avif",
"jpg",
"jpeg",
"png",
"svg",
"tif",
"webp"
],
"interval": 1800, // Time interval (in seconds) between wallpaper changes
"min_dimension": 600, // Minimum dimension (width or height)
"max_dimension": 128000, // Maximum dimension (width or height)
"min_size": 1024, // Minimum file size (in bytes)
"max_size": 1073741824, // Maximum file size (in bytes)
"monitor": 2, // Number of monitors to display wallpapers on
"monitor_orientation": "Horizontal", // Horizontal (side-by-side) or Vertical (stacked)
"picture": 1, // Set number of picture per monitor.
"picture_orientation": [
"Vertical",
"Horizontal"
],
"resolutions": [
{
"width": 3840,
"height": 2160
},
{
"width": 3840,
"height": 2160
}
],
"sort": false, // Sort the images found.
"verbose": false, // Show intermediate runtime messages
}
```
**Set number of wallpaper per monitor (Gnome desktop only)**
You can display `N` different wallpapers on each monitor by using the `-p` flag followed by the desired number (`N`).
```bash
wallswitch -p N
```
The orientation of constructed images can be changed on each monitor between `Horizontal` and `Vertical`.
## Wallpaper suggestions
* Get all gnome [backgrounds](https://github.com/zebreus/all-gnome-backgrounds/tree/master/data/images).
Dowload wallpapers with:
```
git clone https://github.com/zebreus/all-gnome-backgrounds.git
```
## Help messages
To get help messages, run the command:
```
wallswitch -h
```
The output:
```
randomly sets different wallpapers for each of your desktop monitors.
Usage: wallswitch [OPTIONS]
Options:
-b, --min_size <MIN_SIZE>
Set a minimum file size (in bytes) for searching image files
-B, --max_size <MAX_SIZE>
Set a maximum file size (in bytes) for searching image files
-c, --config
Read the configuration file and exit the program
-d, --min_dimension <MIN_DIMENSION>
Set the minimum dimension that the height and width must satisfy
-D, --max_dimension <MAX_DIMENSION>
Set the maximum dimension that the height and width must satisfy
-i, --interval <INTERVAL>
Set the interval (in seconds) between each wallpaper displayed
-m, --monitor <MONITOR>
Set the number of monitors [default: 2]
-o, --orientation <ORIENTATION>
Inform monitor orientation: Horizontal (side-by-side) or Vertical (stacked)
-p, --picture <PICTURE>
Set number of picture per monitor [default: 1]
-s, --sort
Sort the images found
-v, --verbose
Show intermediate runtime messages
-h, --help
Print help (see more with '--help')
-V, --version
Print version
```
`min_dimension` is the minimum value obtained from the width and height of an image file:
`min_dimension = min(width, height)`.
`max_dimension` is the maximum value obtained from the width and height of an image file:
`max_dimension = max(width, height)`.
## Desktops
Make changes to the source code.
```
git clone https://github.com/claudiofsr/wallswitch.git
cd wallswitch
```
Edit the file: 'src/desktops.rs'.
To build and install from source, run the following command:
```
cargo b -r && cargo install --path=.
```
### gnome
Create a wallpaper file and set it as your desktop background image.
See the function:
```
fn set_gnome_wallpaper()
```
### xfce
See the function:
```
fn set_xfce_wallpaper()
```
Monitor 1: "/backdrop/screen0/monitorDP-0/workspace0/last-image"
Monitor 2: "/backdrop/screen0/monitorDP-2/workspace0/last-image"
Monitor N: ...
### openbox
See the function:
```
fn set_openbox_wallpaper()
```
## Mutually exclusive features
To use the [clap](https://crates.io/crates/clap) (default):
```
cargo b -r && cargo install --path=. --features args_v1
```
To reduce binary size, alternatively use my Command Line Argument Parser (args_v2.rs):
```
cargo b -r && cargo install --path=. --features args_v2
```
## Dependencies
* [imagemagick](https://imagemagick.org/) (image viewing/manipulation program).
* [feh](https://feh.finalrewind.org/) (fast and light image viewer).