Compare commits

..

No commits in common. "main" and "v1.0.0" have entirely different histories.

13 changed files with 57 additions and 337 deletions

1
.fpm
View file

@ -3,5 +3,4 @@
--license agpl3
--description "Wallpaper manager for i3"
--url "https://gitnet.fr/deblan/i3-wallpaper-manager"
--deb-recommends "feh"
--maintainer "Simon Vieille <contact+i3wallpapermanager@deblan.fr>"

View file

@ -1,34 +0,0 @@
name: New feature
about: Use this template if you want to request a feature
title: "[FEATURE] "
labels:
- Kind/Enhancement
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this feature request!
- type: textarea
id: description
attributes:
label: Description
description: Describe the feature.
validations:
required: true
- type: textarea
id: benefits
attributes:
label: Benefits
description: Describe the benefits of this feature.
validations:
required: true
- type: textarea
id: extra
attributes:
label: More informations
description: If you want to share more things, this is here!
validations:
required: false

View file

@ -1,63 +0,0 @@
name: New issue
about: Use this template if you have a bug
title: "[Bug] "
labels:
- Kind/Bug
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
- type: textarea
id: environment
attributes:
label: Environment
value: |
* i3 wallpaper manager version:
* i3-wm version:
* Operating system and version:
validations:
required: true
- type: textarea
id: configuration
attributes:
label: Configuration
value: |
```
```
validations:
required: false
- type: textarea
id: steps
attributes:
label: Steps to reproduce
description: How reproduce the bug?
validations:
required: false
- type: textarea
id: resuts
attributes:
label: Observed Results
description: What happened?
validations:
required: false
- type: textarea
id: expected
attributes:
label: Expected Results
description: What should happen?
validations:
required: false
- type: textarea
id: extra
attributes:
label: More informations
description: If you want to share more things, this is here!
validations:
required: false

View file

@ -1,26 +0,0 @@
name: New question
about: Use this template when you don't know how to do something
title: "[Question] "
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill information.
- type: textarea
id: environment
attributes:
label: Environment
value: |
* i3 wallpaper manager version:
* i3-wm version:
* Operating system and version:
validations:
required: true
- type: textarea
id: question
attributes:
label: Question
validations:
required: true

View file

@ -1,8 +0,0 @@
blank_issues_enabled: true
contact_links:
- name: Documentation
url: https://gitnet.fr/deblan/i3-wallpaper-manager
about: Official documentation web site
- name: Ask a question in our Matrix room
about: If you prefer a chat-like conversation or in need for quick help, this might be an alternative to opening an issue.
url: https://matrix.to/#/!QDcaVhvLZlhptPkGVi:neutralnetwork.org?via=neutralnetwork.org

View file

@ -1,23 +1,5 @@
[Unreleased]
## v1.2.1
### Added
- Add debian packaging deb-recommends
### Fixed
- Fix #1: add cache of latest command to not run wallpaper update when it's already up to date
## v1.2.0
### Added
- Add `callback` option
## v1.1.1
### Fixed
- Update wallpapers on start
## v1.1.0
### Changed
- Refactoring
## v1.0.0
### Added
- First release!

View file

@ -1,23 +1,11 @@
# 🖥️ i3 Wallpaper Manager
# 🖥️ i3 wallpaper manager
**i3 Wallpaper Manager** is a command-line tool designed to change the wallpaper depending of active workspaces on [i3](https://i3wm.org/). This tool works on one or multiple screens.
<video controls src="https://deblan.gitnet.page/i3-wallpaper-manager/demo.webm" type="video/webm" width="50%"></video>
_Thanks [AZProductions](https://github.com/AZProductions/AbstractCollection/)!_
**i3 wallpaper manager** is a command-line tool designed to change the wallpaper depending of active workspaces on [i3](https://i3wm.org/).
## 📗 How to install the project
### Dependencies
- [Feh](https://feh.finalrewind.org/) (by default)
### Pre-compiled versions
Pre-compiled versions are available in the [Releases](https://gitnet.fr/deblan/i3-wallpaper-manager/releases). For Debian users, a package is also provided.
### From source
If you want to compile the project from source, you will need at least the GO compiler version 1.22. Clone the project and run the make command. The compiled output will be located in the `build` directory.
```
@ -29,7 +17,7 @@ $ make
To start, you need to create a configuration file in YAML format. This file consists of two keys: `default` to define the path of the default wallpaper, and `workspaces` which allows you to associate each workspace with its corresponding wallpaper.
```yaml
```
default: /home/alice/wallpapers/default.jpg
workspaces:
"Name of the workspace 1": /home/alice/wallpapers/1.jpg
@ -37,34 +25,14 @@ workspaces:
"Name of the workspace 3": /home/alice/wallpapers/3.jpg
```
Next, you simply need to run `i3-wallpaper-manager` and specify the path to the configuration file.
Next, you simply need to run `i3-wallpaper-manager` while specify the path to the configuration file.
```bash
DISPLAY=:0 i3-wallpaper-manager /path/to/config.yaml
```
i3-wallpaper-manager /path/to/config.yaml
```
To run it when i3 starts, add this to your i3 configuration:
```bash
exec --no-startup-id DISPLAY=:0 i3-wallpaper-manager /path/to/config.yaml
```
If you wish to use a program other than `feh`, set the `callback` parameter by specifying the path to your script.
```yaml
callback: /path/to/custom.sh
```
```bash
#!/bin/sh
# /path/to/custom.sh
SCREEN_1="$1"
WALLPAPER_1="$2"
SCREEN_2="$3"
WALLPAPER_2="$4"
# etc.
# Do stuff...
exec_always i3-wallpaper-manager /path/to/config.yaml
```

View file

@ -1,19 +0,0 @@
package main
import (
"os"
"os/exec"
)
func CallbackUpdateWallpapers(callback string, files, screens []string) *exec.Cmd {
args := []string{}
for key, file := range files {
args = append(args, screens[key], file)
}
cmd := exec.Command(callback, args...)
cmd.Env = os.Environ()
return cmd
}

View file

@ -1,30 +0,0 @@
package main
import (
"os"
"gopkg.in/yaml.v3"
)
type Config struct {
Default string `yaml:"default"`
Callback string `yaml:"callback"`
Workspaces map[string]string `yaml:"workspaces"`
}
func LoadConfiguration(file string) (Config, error) {
data, err := os.ReadFile(os.Args[1])
config := Config{}
if err != nil {
return config, err
}
err = yaml.Unmarshal(data, &config)
if err != nil {
return config, err
}
return config, nil
}

View file

@ -3,4 +3,3 @@ workspaces:
"Name of the workspace 1": /home/alice/wallpapers/1.jpg
"Name of the workspace 2": /home/alice/wallpapers/2.jpg
"Name of the workspace 3": /home/alice/wallpapers/3.jpg
# callback: /path/to/custom.sh

19
feh.go
View file

@ -1,19 +0,0 @@
package main
import (
"os"
"os/exec"
)
func FehUpdateWallpapers(files []string) *exec.Cmd {
args := []string{}
for _, file := range files {
args = append(args, "--bg-fill", file)
}
cmd := exec.Command("feh", args...)
cmd.Env = os.Environ()
return cmd
}

58
main.go
View file

@ -1,36 +1,78 @@
package main
import (
"fmt"
"log"
"os"
"os/exec"
"go.i3wm.org/i3"
"gopkg.in/yaml.v3"
)
type Config struct {
Default string `yaml:"default"`
Workspaces map[string]string `yaml:"workspaces"`
}
func getWallpaper(workspace string, config Config) string {
file := config.Default
workspaceFile := config.Workspaces[workspace]
if workspaceFile != "" {
file = workspaceFile
}
return file
}
func main() {
recv := i3.Subscribe(i3.WorkspaceEventType)
if len(os.Args) != 2 {
log.Printf("[ERROR] Configuration required!")
fmt.Errorf("Configuration required!")
os.Exit(1)
}
config, err := LoadConfiguration(os.Args[1])
data, err := os.ReadFile(os.Args[1])
config := Config{}
if err != nil {
log.Printf("[ERROR] %s", err.Error())
os.Exit(1)
log.Printf("[error] %s", err.Error())
}
var lastCommand string
err = yaml.Unmarshal(data, &config)
UpdateWallapers(config, &lastCommand)
if err != nil {
log.Printf("[error] %s", err.Error())
}
for recv.Next() {
event := recv.Event().(*i3.WorkspaceEvent)
if event.Change == "focus" {
UpdateWallapers(config, &lastCommand)
if event.Change != "focus" {
continue
}
outputs, err := i3.GetOutputs()
args := []string{}
if err == nil {
for _, output := range outputs {
if output.CurrentWorkspace != "" {
args = append(args, "--bg-fill", getWallpaper(output.CurrentWorkspace, config))
}
}
cmd := exec.Command("feh", args...)
cmd.Env = os.Environ()
log.Printf("[UPDATE] %s", cmd.String())
if err := cmd.Run(); err != nil {
log.Printf("[ERROR] %s", err.Error())
}
} else {
log.Printf("[ERROR] %s", err.Error())
}
}
}

View file

@ -1,71 +0,0 @@
package main
import (
"log"
"os/exec"
"go.i3wm.org/i3"
)
func GetWorkspaceWallpaper(workspace string, config Config) string {
file := config.Default
workspaceFile := config.Workspaces[workspace]
if workspaceFile != "" {
file = workspaceFile
}
return file
}
func GetOutputsWallpapers(config Config) ([]string, []string, error) {
files := []string{}
screens := []string{}
outputs, err := i3.GetOutputs()
if err != nil {
return files, screens, err
}
for _, output := range outputs {
if output.CurrentWorkspace != "" {
file := GetWorkspaceWallpaper(output.CurrentWorkspace, config)
if file != "" {
files = append(files, file)
screens = append(screens, output.Name)
}
}
}
return files, screens, nil
}
func UpdateWallapers(config Config, lastCommand *string) {
files, screens, err := GetOutputsWallpapers(config)
if err != nil {
log.Printf("[ERROR] %s", err.Error())
return
}
var cmd *exec.Cmd
if config.Callback == "" {
cmd = FehUpdateWallpapers(files)
} else {
cmd = CallbackUpdateWallpapers(config.Callback, files, screens)
}
if cmd.String() == *lastCommand {
log.Printf("[INFO] wallapaper(s) already up to date")
return
}
err = cmd.Run()
if err != nil {
log.Printf("[ERROR] cmd=%s error=%s", cmd.String(), err.Error())
} else {
log.Printf("[SUCCESS] cmd=%s", cmd.String())
*lastCommand = cmd.String()
}
}