Compare commits
55 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b61e665c71 | ||
|
|
8408c669ef | ||
|
|
d66066c3b6 | ||
|
|
dac55cdd0d | ||
|
|
03365d24e5 | ||
|
|
8e58654336 | ||
|
|
33e0032725 | ||
|
|
c05fff189d | ||
|
|
57d130ca51 | ||
|
|
954a6ba9c9 | ||
|
|
67b16ea6a6 | ||
|
|
3a02b16761 | ||
|
|
c67fef6671 | ||
|
|
444617865e | ||
|
|
e3de9cc67b | ||
|
|
1c11329581 | ||
|
|
87ee23afe2 | ||
|
|
808fd032a0 | ||
|
|
1d3f023dc8 | ||
|
|
ccfe7776c6 | ||
|
|
5a7dbefeb0 | ||
|
|
fd26bb39e8 | ||
|
|
bc74ebc927 | ||
|
|
d65d075bdb | ||
|
|
58ea8ea8db | ||
|
|
94b8b8d7f0 | ||
|
|
ebfaba1881 | ||
|
|
6656568c6a | ||
|
|
b3fa492b44 | ||
|
|
c0faecdb8b | ||
|
|
830edefa22 | ||
|
|
aeeb4e4890 | ||
|
|
6bbfbea1a8 | ||
|
|
d88d9795d1 | ||
|
|
f85356bdc7 | ||
|
|
37c9c2d520 | ||
|
|
2903abd831 | ||
|
|
9cc81fa38a | ||
|
|
edf4c81f85 | ||
|
|
9582726cb9 | ||
|
|
7a6ae82a75 | ||
|
|
22ddb71603 | ||
|
|
ea7813761a | ||
|
|
0cafb3c3ad | ||
|
|
89cffad81d | ||
|
|
1e854558cf | ||
|
|
3df7a30533 | ||
|
|
e383f7a470 | ||
|
|
820848d984 | ||
|
|
fa01d5bb32 | ||
|
|
8be1fc1ea2 | ||
|
|
0e5d38907f | ||
|
|
7ba7abd817 | ||
|
|
cedcf8619f | ||
|
|
8ff2d5c89c |
1
.github/FUNDING.yml
vendored
Normal file
1
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1 @@
|
||||
github: nwg-piotr
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -18,4 +18,4 @@ nwg-drawer
|
||||
/.idea
|
||||
|
||||
# Dependency directories (remove the comment below to include it)
|
||||
# vendor/
|
||||
vendor/
|
||||
|
||||
23
README.md
23
README.md
@@ -1,6 +1,8 @@
|
||||
# nwg-drawer
|
||||
|
||||
This application is a part of the [nwg-shell](https://github.com/nwg-piotr/nwg-shell) project.
|
||||
This application is a part of the [nwg-shell](https://nwg-piotr.github.io/nwg-shell) project.
|
||||
|
||||
**Contributing:** please read the [general contributing rules for the nwg-shell project](https://nwg-piotr.github.io/nwg-shell/contribution).
|
||||
|
||||
Nwg-drawer is a golang replacement to the `nwggrid` command
|
||||
(a part of [nwg-launchers](https://github.com/nwg-piotr/nwg-launchers)). It's being developed with
|
||||
@@ -32,7 +34,7 @@ To close the window w/o running a program, you may use `Esc` key, or right-click
|
||||
|
||||
### Dependencies
|
||||
|
||||
- go >=1.16 (just to build)
|
||||
- go >=1.20 (just to build)
|
||||
- gtk3
|
||||
- gtk-layer-shell
|
||||
- xdg-utils
|
||||
@@ -66,12 +68,25 @@ Usage of nwg-drawer:
|
||||
File Search result COLumns (default 2)
|
||||
-fslen int
|
||||
File Search name LENgth Limit (default 80)
|
||||
-ft
|
||||
Force Theme for libadwaita apps, by adding 'GTK_THEME=<default-gtk-theme>' env var
|
||||
-g string
|
||||
GTK theme name, eg. "Adwaita-dark"
|
||||
GTK theme name
|
||||
-i string
|
||||
GTK icon theme name
|
||||
-is int
|
||||
Icon Size (default 64)
|
||||
-k set GTK layer shell Keyboard interactivity to 'on-demand' mode
|
||||
-lang string
|
||||
force lang, e.g. "en", "pl"
|
||||
-mb int
|
||||
Margin Bottom
|
||||
-ml int
|
||||
Margin Left
|
||||
-mr int
|
||||
Margin Right
|
||||
-mt int
|
||||
Margin Top
|
||||
-nocats
|
||||
Disable filtering by category
|
||||
-nofs
|
||||
@@ -86,7 +101,7 @@ Usage of nwg-drawer:
|
||||
-spacing uint
|
||||
icon spacing (default 20)
|
||||
-term string
|
||||
Terminal emulator (default "alacritty")
|
||||
Terminal emulator (default "foot")
|
||||
-v display Version information
|
||||
```
|
||||
|
||||
|
||||
19
go.mod
19
go.mod
@@ -1,20 +1,19 @@
|
||||
module github.com/nwg-piotr/nwg-drawer
|
||||
|
||||
go 1.19
|
||||
go 1.21
|
||||
|
||||
require (
|
||||
github.com/allan-simon/go-singleinstance v0.0.0-20210120080615-d0997106ab37
|
||||
github.com/dlasky/gotk3-layershell v0.0.0-20210827021656-e6ecab2731f7
|
||||
github.com/fsnotify/fsnotify v1.5.1
|
||||
github.com/gotk3/gotk3 v0.6.1
|
||||
github.com/dlasky/gotk3-layershell v0.0.0-20230802002603-b0c42cd8474f
|
||||
github.com/fsnotify/fsnotify v1.7.0
|
||||
github.com/gotk3/gotk3 v0.6.2
|
||||
github.com/joshuarubin/go-sway v1.2.0
|
||||
github.com/sirupsen/logrus v1.9.0
|
||||
github.com/sirupsen/logrus v1.9.3
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/joshuarubin/lifecycle v1.0.0 // indirect
|
||||
go.uber.org/atomic v1.3.2 // indirect
|
||||
go.uber.org/multierr v1.1.0 // indirect
|
||||
golang.org/x/sync v0.0.0-20190412183630-56d357773e84 // indirect
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect
|
||||
github.com/joshuarubin/lifecycle v1.1.4 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
golang.org/x/sync v0.5.0 // indirect
|
||||
golang.org/x/sys v0.14.0 // indirect
|
||||
)
|
||||
|
||||
40
go.sum
40
go.sum
@@ -3,33 +3,45 @@ github.com/allan-simon/go-singleinstance v0.0.0-20210120080615-d0997106ab37/go.m
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/dlasky/gotk3-layershell v0.0.0-20210827021656-e6ecab2731f7 h1:LDo0kwt+oW9a4lWlj2OakIgMW1ySXXVRGFt8GHUdYYA=
|
||||
github.com/dlasky/gotk3-layershell v0.0.0-20210827021656-e6ecab2731f7/go.mod h1:JHLx2Wz4mAPVwn4PFhC69ydwyHP4A3wQvlg7HKVVc1U=
|
||||
github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=
|
||||
github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
|
||||
github.com/gotk3/gotk3 v0.6.1 h1:GJ400a0ecEEWrzjBvzBzH+pB/esEMIGdB9zPSmBdoeo=
|
||||
github.com/dlasky/gotk3-layershell v0.0.0-20221218201547-1f6674a3f872 h1:16qcNl+UgbvudN7wPv+zq4mmDSYJWdLv5jbVhS7+OVI=
|
||||
github.com/dlasky/gotk3-layershell v0.0.0-20221218201547-1f6674a3f872/go.mod h1:JHLx2Wz4mAPVwn4PFhC69ydwyHP4A3wQvlg7HKVVc1U=
|
||||
github.com/dlasky/gotk3-layershell v0.0.0-20230802002603-b0c42cd8474f h1:qDnUQAD7tVX/gnL6uSgouzfGNA4xXH+B/fd6Ko19GgM=
|
||||
github.com/dlasky/gotk3-layershell v0.0.0-20230802002603-b0c42cd8474f/go.mod h1:JHLx2Wz4mAPVwn4PFhC69ydwyHP4A3wQvlg7HKVVc1U=
|
||||
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
|
||||
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
|
||||
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
|
||||
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
|
||||
github.com/gotk3/gotk3 v0.6.1/go.mod h1:/hqFpkNa9T3JgNAE2fLvCdov7c5bw//FHNZrZ3Uv9/Q=
|
||||
github.com/gotk3/gotk3 v0.6.2 h1:sx/PjaKfKULJPTPq8p2kn2ZbcNFxpOJqi4VLzMbEOO8=
|
||||
github.com/gotk3/gotk3 v0.6.2/go.mod h1:/hqFpkNa9T3JgNAE2fLvCdov7c5bw//FHNZrZ3Uv9/Q=
|
||||
github.com/joshuarubin/go-sway v1.2.0 h1:t3eqW504//uj9PDwFf0+IVfkD+WoOGaDX5gYIe0BHyM=
|
||||
github.com/joshuarubin/go-sway v1.2.0/go.mod h1:qcDd6f25vJ0++wICwA1BainIcRC67p2Mb4lsrZ0k3/k=
|
||||
github.com/joshuarubin/lifecycle v1.0.0 h1:N/lPEC8f+dBZ1Tn99vShqp36LwB+LI7XNAiNadZeLUQ=
|
||||
github.com/joshuarubin/lifecycle v1.0.0/go.mod h1:sRy++ATvR9Ee21tkRdFkQeywAWvDsue66V70K0Dnl54=
|
||||
github.com/joshuarubin/lifecycle v1.1.4 h1:9ZjvYSsWax9DC3Jpz6vGf/0KnU8FNMjh0/vJ3SpSBRQ=
|
||||
github.com/joshuarubin/lifecycle v1.1.4/go.mod h1:QqHrqwMPMA9dbJY3XgIyVLhzHMSGOFrcCAQ59bke1mo=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
|
||||
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4=
|
||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
|
||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||
golang.org/x/sync v0.0.0-20190412183630-56d357773e84 h1:IqXQ59gzdXv58Jmm2xn0tSOR9i6HqroaOFRQ3wR/dJQ=
|
||||
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
||||
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
||||
golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ=
|
||||
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
|
||||
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
||||
golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
|
||||
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
|
||||
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
|
||||
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
|
||||
47
main.go
47
main.go
@@ -21,7 +21,7 @@ import (
|
||||
"github.com/gotk3/gotk3/gtk"
|
||||
)
|
||||
|
||||
const version = "0.3.6"
|
||||
const version = "0.4.2"
|
||||
|
||||
var (
|
||||
appDirs []string
|
||||
@@ -104,7 +104,7 @@ var (
|
||||
pinnedItemsChanged chan interface{} = make(chan interface{}, 1)
|
||||
)
|
||||
|
||||
func defaultStringIfBlank(s, fallback string) string {
|
||||
func defaultTermIfBlank(s, fallback string) string {
|
||||
s = strings.TrimSpace(s)
|
||||
// os.Getenv("TERM") returns "linux" instead of empty string, if program has been started
|
||||
// from a key binding defined in the config file. See #23.
|
||||
@@ -114,23 +114,34 @@ func defaultStringIfBlank(s, fallback string) string {
|
||||
return s
|
||||
}
|
||||
|
||||
func validateWm() {
|
||||
if !(*wm == "sway" || *wm == "hyprland" || *wm == "Hyprland") && *wm != "" {
|
||||
*wm = ""
|
||||
log.Warn("-wm argument supports only 'sway' or 'hyprland' string.")
|
||||
}
|
||||
}
|
||||
|
||||
// Flags
|
||||
var cssFileName = flag.String("s", "drawer.css", "Styling: css file name")
|
||||
var targetOutput = flag.String("o", "", "name of the Output to display the drawer on (sway only)")
|
||||
var displayVersion = flag.Bool("v", false, "display Version information")
|
||||
var keyboard = flag.Bool("k", false, "set GTK layer shell Keyboard interactivity to 'on-demand' mode")
|
||||
var overlay = flag.Bool("ovl", false, "use OVerLay layer")
|
||||
var gtkTheme = flag.String("g", "", "GTK theme name")
|
||||
var gtkIconTheme = flag.String("i", "", "GTK icon theme name")
|
||||
var iconSize = flag.Int("is", 64, "Icon Size")
|
||||
var marginTop = flag.Int("mt", 0, "Margin Top")
|
||||
var marginLeft = flag.Int("ml", 0, "Margin Left")
|
||||
var marginRight = flag.Int("mr", 0, "Margin Right")
|
||||
var marginBottom = flag.Int("mb", 0, "Margin Bottom")
|
||||
var fsColumns = flag.Uint("fscol", 2, "File Search result COLumns")
|
||||
var forceTheme = flag.Bool("ft", false, "Force Theme for libadwaita apps, by adding 'GTK_THEME=<default-gtk-theme>' env var")
|
||||
var columnsNumber = flag.Uint("c", 6, "number of Columns")
|
||||
var itemSpacing = flag.Uint("spacing", 20, "icon spacing")
|
||||
var lang = flag.String("lang", "", "force lang, e.g. \"en\", \"pl\"")
|
||||
var fileManager = flag.String("fm", "thunar", "File Manager")
|
||||
var term = flag.String("term", defaultStringIfBlank(os.Getenv("TERM"), "foot"), "Terminal emulator")
|
||||
var term = flag.String("term", defaultTermIfBlank(os.Getenv("TERM"), "foot"), "Terminal emulator")
|
||||
var wm = flag.String("wm", "", "Use swaymsg (with 'sway' argument) or hyprctl (with 'hyprland')")
|
||||
var nameLimit = flag.Int("fslen", 80, "File Search name LENgth Limit")
|
||||
var noCats = flag.Bool("nocats", false, "Disable filtering by category")
|
||||
var noFS = flag.Bool("nofs", false, "Disable file search")
|
||||
@@ -150,6 +161,8 @@ func main() {
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
validateWm()
|
||||
|
||||
// Gentle SIGTERM handler thanks to reiki4040 https://gist.github.com/reiki4040/be3705f307d3cd136e85
|
||||
// v0.2: we also need to support SIGUSR from now on
|
||||
showWindowChannel := make(chan interface{}, 1)
|
||||
@@ -179,7 +192,7 @@ func main() {
|
||||
gtk.MainQuit()
|
||||
}
|
||||
default:
|
||||
log.Info("Unknown signal")
|
||||
log.Infof("Unknown signal: %s", s.String())
|
||||
}
|
||||
}
|
||||
}()
|
||||
@@ -326,6 +339,15 @@ func main() {
|
||||
log.Info("Preferring dark theme variants")
|
||||
}
|
||||
|
||||
if *gtkIconTheme != "" {
|
||||
err = settings.SetProperty("gtk-icon-theme-name", *gtkIconTheme)
|
||||
if err != nil {
|
||||
log.Error("Unable to set icon theme:", err)
|
||||
} else {
|
||||
log.Infof("User demanded icon theme: %s", *gtkIconTheme)
|
||||
}
|
||||
}
|
||||
|
||||
cssProvider, _ := gtk.CssProviderNew()
|
||||
|
||||
err = cssProvider.LoadFromPath(*cssFileName)
|
||||
@@ -376,14 +398,21 @@ func main() {
|
||||
layershell.SetMargin(win, layershell.LAYER_SHELL_EDGE_RIGHT, *marginRight)
|
||||
layershell.SetMargin(win, layershell.LAYER_SHELL_EDGE_BOTTOM, *marginBottom)
|
||||
|
||||
if *keyboard {
|
||||
log.Info("Setting GTK layer shell keyboard mode to: on-demand")
|
||||
layershell.SetKeyboardMode(win, layershell.LAYER_SHELL_KEYBOARD_MODE_ON_DEMAND)
|
||||
} else {
|
||||
log.Info("Setting GTK layer shell keyboard mode to default: exclusive")
|
||||
layershell.SetKeyboardMode(win, layershell.LAYER_SHELL_KEYBOARD_MODE_EXCLUSIVE)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
win.Connect("destroy", func() {
|
||||
gtk.MainQuit()
|
||||
})
|
||||
|
||||
win.Connect("key-release-event", func(window *gtk.Window, event *gdk.Event) bool {
|
||||
win.Connect("key-release-event", func(_ *gtk.Window, event *gdk.Event) bool {
|
||||
key := &gdk.EventKey{Event: event}
|
||||
if key.KeyVal() == gdk.KEY_Escape {
|
||||
s, _ := searchEntry.GetText()
|
||||
@@ -402,7 +431,7 @@ func main() {
|
||||
return false
|
||||
})
|
||||
|
||||
win.Connect("key-press-event", func(window *gtk.Window, event *gdk.Event) bool {
|
||||
win.Connect("key-press-event", func(_ *gtk.Window, event *gdk.Event) bool {
|
||||
key := &gdk.EventKey{Event: event}
|
||||
switch key.KeyVal() {
|
||||
case gdk.KEY_downarrow, gdk.KEY_Up, gdk.KEY_Down, gdk.KEY_Left, gdk.KEY_Right, gdk.KEY_Tab,
|
||||
@@ -457,8 +486,8 @@ func main() {
|
||||
resultWindow.SetEvents(int(gdk.ALL_EVENTS_MASK))
|
||||
resultWindow.SetPolicy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
|
||||
|
||||
resultWindow.Connect("button-release-event", func(sw *gtk.ScrolledWindow, e *gdk.Event) bool {
|
||||
btnEvent := gdk.EventButtonNewFromEvent(e)
|
||||
resultWindow.Connect("button-release-event", func(_ *gtk.ScrolledWindow, event *gdk.Event) bool {
|
||||
btnEvent := gdk.EventButtonNewFromEvent(event)
|
||||
if btnEvent.Button() == 3 {
|
||||
if !*resident {
|
||||
gtk.MainQuit()
|
||||
@@ -505,8 +534,10 @@ func main() {
|
||||
}
|
||||
|
||||
statusLineWrapper, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 0)
|
||||
statusLineWrapper.SetProperty("name", "status-line-wrapper")
|
||||
outerVBox.PackStart(statusLineWrapper, false, false, 10)
|
||||
statusLabel, _ = gtk.LabelNew(status)
|
||||
statusLabel.SetProperty("name", "status-label")
|
||||
statusLineWrapper.PackStart(statusLabel, true, false, 0)
|
||||
|
||||
win.ShowAll()
|
||||
|
||||
109
tools.go
109
tools.go
@@ -121,11 +121,11 @@ func getUserDir(home, line string) string {
|
||||
}
|
||||
|
||||
func cacheDir() string {
|
||||
if os.Getenv("XDG_CACHE_HOME") != "" {
|
||||
return os.Getenv("XDG_CONFIG_HOME")
|
||||
if xdgCache := os.Getenv("XDG_CACHE_HOME"); xdgCache != "" {
|
||||
return xdgCache
|
||||
}
|
||||
if os.Getenv("HOME") != "" && pathExists(filepath.Join(os.Getenv("HOME"), ".cache")) {
|
||||
p := filepath.Join(os.Getenv("HOME"), ".cache")
|
||||
if home := os.Getenv("HOME"); home != "" && pathExists(filepath.Join(home, ".cache")) {
|
||||
p := filepath.Join(home, ".cache")
|
||||
return p
|
||||
}
|
||||
return ""
|
||||
@@ -141,11 +141,11 @@ func readTextFile(path string) (string, error) {
|
||||
}
|
||||
|
||||
func oldConfigDir() (string, error) {
|
||||
if os.Getenv("XDG_CONFIG_HOME") != "" {
|
||||
dir := path.Join(os.Getenv("XDG_CONFIG_HOME"), "nwg-panel")
|
||||
if xdgConfig := os.Getenv("XDG_CONFIG_HOME"); xdgConfig != "" {
|
||||
dir := path.Join(xdgConfig, "nwg-panel")
|
||||
return dir, nil
|
||||
} else if os.Getenv("HOME") != "" {
|
||||
dir := path.Join(os.Getenv("HOME"), ".config/nwg-panel")
|
||||
} else if home := os.Getenv("HOME"); home != "" {
|
||||
dir := path.Join(home, ".config/nwg-panel")
|
||||
return dir, nil
|
||||
}
|
||||
|
||||
@@ -154,10 +154,10 @@ func oldConfigDir() (string, error) {
|
||||
|
||||
func configDir() string {
|
||||
var dir string
|
||||
if os.Getenv("XDG_CONFIG_HOME") != "" {
|
||||
dir = path.Join(os.Getenv("XDG_CONFIG_HOME"), "nwg-drawer")
|
||||
} else if os.Getenv("HOME") != "" {
|
||||
dir = path.Join(os.Getenv("HOME"), ".config/nwg-drawer")
|
||||
if xdgConfig := os.Getenv("XDG_CONFIG_HOME"); xdgConfig != "" {
|
||||
dir = path.Join(xdgConfig, "nwg-drawer")
|
||||
} else if home := os.Getenv("HOME"); home != "" {
|
||||
dir = path.Join(home, ".config/nwg-drawer")
|
||||
}
|
||||
|
||||
log.Infof("Config dir: %s", dir)
|
||||
@@ -168,10 +168,10 @@ func configDir() string {
|
||||
|
||||
func dataDir() string {
|
||||
var dir string
|
||||
if os.Getenv("XDG_DATA_HOME") != "" {
|
||||
dir = path.Join(os.Getenv("XDG_DATA_HOME"), "nwg-drawer")
|
||||
} else if os.Getenv("HOME") != "" {
|
||||
dir = path.Join(os.Getenv("HOME"), ".local/share/nwg-drawer")
|
||||
if xdgData := os.Getenv("XDG_DATA_HOME"); xdgData != "" {
|
||||
dir = path.Join(xdgData, "nwg-drawer")
|
||||
} else if home := os.Getenv("HOME"); home != "" {
|
||||
dir = path.Join(home, ".local/share/nwg-drawer")
|
||||
}
|
||||
|
||||
log.Infof("Data dir: %s", dir)
|
||||
@@ -228,13 +228,11 @@ func copyFile(src, dst string) error {
|
||||
|
||||
func getAppDirs() []string {
|
||||
var dirs []string
|
||||
xdgDataDirs := ""
|
||||
|
||||
home := os.Getenv("HOME")
|
||||
xdgDataHome := os.Getenv("XDG_DATA_HOME")
|
||||
if os.Getenv("XDG_DATA_DIRS") != "" {
|
||||
xdgDataDirs = os.Getenv("XDG_DATA_DIRS")
|
||||
} else {
|
||||
xdgDataDirs := os.Getenv("XDG_DATA_DIRS")
|
||||
if xdgDataDirs == "" {
|
||||
xdgDataDirs = "/usr/local/share/:/usr/share/"
|
||||
}
|
||||
if xdgDataHome != "" {
|
||||
@@ -558,47 +556,40 @@ func launch(command string, terminal bool) {
|
||||
}
|
||||
}
|
||||
|
||||
elements := strings.Split(command, " ")
|
||||
|
||||
// find prepended env variables, if any
|
||||
envVarsNum := strings.Count(command, "=")
|
||||
var envVars []string
|
||||
|
||||
cmdIdx := -1
|
||||
|
||||
if envVarsNum > 0 {
|
||||
for idx, item := range elements {
|
||||
if strings.Contains(item, "=") {
|
||||
envVars = append(envVars, item)
|
||||
} else if !strings.HasPrefix(item, "-") && cmdIdx == -1 {
|
||||
cmdIdx = idx
|
||||
themeToPrepend := ""
|
||||
// add "GTK_THEME=<default_gtk_theme>" environment variable
|
||||
if *forceTheme {
|
||||
settings, _ := gtk.SettingsGetDefault()
|
||||
th, err := settings.GetProperty("gtk-theme-name")
|
||||
if err == nil {
|
||||
themeToPrepend = th.(string)
|
||||
}
|
||||
}
|
||||
}
|
||||
if cmdIdx == -1 {
|
||||
cmdIdx = 0
|
||||
|
||||
if themeToPrepend != "" {
|
||||
command = fmt.Sprintf("GTK_THEME=%q %s", themeToPrepend, command)
|
||||
}
|
||||
|
||||
cmd := exec.Command(elements[cmdIdx], elements[1+cmdIdx:]...)
|
||||
var elements = []string{"/usr/bin/env", "-S", command}
|
||||
|
||||
cmd := exec.Command(elements[0], elements[1:]...)
|
||||
|
||||
if terminal {
|
||||
var prefixCommand = *term
|
||||
var args []string
|
||||
if *term != "foot" {
|
||||
args = []string{"-e", elements[cmdIdx]}
|
||||
if prefixCommand != "foot" {
|
||||
args = []string{"-e", command}
|
||||
} else {
|
||||
args = []string{elements[cmdIdx]}
|
||||
args = elements
|
||||
}
|
||||
cmd = exec.Command(prefixCommand, args...)
|
||||
} else if *wm == "sway" {
|
||||
cmd = exec.Command("swaymsg", "exec", strings.Join(elements, " "))
|
||||
} else if *wm == "hyprland" || *wm == "Hyprland" {
|
||||
cmd = exec.Command("hyprctl", "dispatch", "exec", strings.Join(elements, " "))
|
||||
}
|
||||
|
||||
cmd = exec.Command(*term, args...)
|
||||
}
|
||||
|
||||
// set env variables
|
||||
if len(envVars) > 0 {
|
||||
cmd.Env = os.Environ()
|
||||
cmd.Env = append(cmd.Env, envVars...)
|
||||
}
|
||||
|
||||
msg := fmt.Sprintf("env vars: %s; command: '%s'; args: %s\n", envVars, elements[cmdIdx], elements[1+cmdIdx:])
|
||||
msg := fmt.Sprintf("command: %q; args: %q\n", cmd.Args[0], cmd.Args[1:])
|
||||
log.Info(msg)
|
||||
|
||||
cmd.SysProcAttr = &syscall.SysProcAttr{
|
||||
@@ -691,3 +682,19 @@ func mapOutputs() (map[string]*gdk.Monitor, error) {
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// KAdot / https://stackoverflow.com/a/38537764/4040598 - thanks!
|
||||
func substring(s string, start int, end int) string {
|
||||
startStrIdx := 0
|
||||
i := 0
|
||||
for j := range s {
|
||||
if i == start {
|
||||
startStrIdx = j
|
||||
}
|
||||
if i == end {
|
||||
return s[startStrIdx:j]
|
||||
}
|
||||
i++
|
||||
}
|
||||
return s[startStrIdx:]
|
||||
}
|
||||
|
||||
@@ -58,9 +58,8 @@ func setUpPinnedFlowBox() *gtk.FlowBox {
|
||||
name = entry.Name
|
||||
}
|
||||
if len(name) > 20 {
|
||||
r := []rune(name)
|
||||
name = string(r[:17])
|
||||
name = fmt.Sprintf("%s…", name)
|
||||
r := substring(name, 0, 17)
|
||||
name = fmt.Sprintf("%s…", string(r))
|
||||
}
|
||||
btn.SetLabel(name)
|
||||
|
||||
@@ -252,9 +251,8 @@ func flowBoxButton(entry desktopEntry) *gtk.Button {
|
||||
button.SetImagePosition(gtk.POS_TOP)
|
||||
name := entry.NameLoc
|
||||
if len(name) > 20 {
|
||||
r := []rune(name[:17])
|
||||
name = string(r)
|
||||
name = fmt.Sprintf("%s…", name)
|
||||
r := substring(name, 0, 17)
|
||||
name = fmt.Sprintf("%s…", string(r))
|
||||
}
|
||||
button.SetLabel(name)
|
||||
|
||||
@@ -263,9 +261,8 @@ func flowBoxButton(entry desktopEntry) *gtk.Button {
|
||||
terminal := entry.Terminal
|
||||
desc := entry.CommentLoc
|
||||
if len(desc) > 120 {
|
||||
r := []rune(desc[:117])
|
||||
desc = string(r)
|
||||
desc = fmt.Sprintf("%s…", desc)
|
||||
r := substring(desc, 0, 117)
|
||||
desc = fmt.Sprintf("%s…", string(r))
|
||||
}
|
||||
button.Connect("button-release-event", func(btn *gtk.Button, e *gdk.Event) bool {
|
||||
btnEvent := gdk.EventButtonNewFromEvent(e)
|
||||
|
||||
@@ -20,12 +20,12 @@ func watchFiles() {
|
||||
defer watcher.Close()
|
||||
|
||||
if err := watcher.Add(pinnedFile); err != nil {
|
||||
log.Errorf("ERROR", err)
|
||||
log.Errorf("ERROR: %s", err)
|
||||
}
|
||||
|
||||
for _, fp := range appDirs {
|
||||
if err := filepath.Walk(fp, watchDir); err != nil {
|
||||
log.Errorf("ERROR", err)
|
||||
log.Errorf("ERROR: %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ func watchFiles() {
|
||||
}
|
||||
|
||||
case err := <-watcher.Errors:
|
||||
log.Errorf("ERROR", err)
|
||||
log.Errorf("ERROR: %s", err)
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
Reference in New Issue
Block a user