From 1d3f023dc80f56fa56579b4695490a05164003ae Mon Sep 17 00:00:00 2001 From: gouvinb Date: Sun, 5 Nov 2023 23:36:18 +0100 Subject: [PATCH 1/5] add support to hyprlandctl BREAKING CHANGE: '-swaymsg' removed, use '-wm sway' instead --- main.go | 23 +++++++++++++++-------- tools.go | 6 +++++- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/main.go b/main.go index be17702..32e0a94 100644 --- a/main.go +++ b/main.go @@ -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,14 +114,19 @@ func defaultStringIfBlank(s, fallback string) string { return s } -func defaultBoolIfBlank(s string, fallback bool) bool { +func defaultStringIfBlank(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. - if s != "sway" { + if s == "" { return fallback } - return true + return s +} + +func validateWm() { + if !(*wm == "sway" || *wm == "hyprland") && *wm != "" { + *wm = "" + log.Warn("nwg-drawer support only `swaymsg` or `hyprland`.") + } } // Flags @@ -143,8 +148,8 @@ 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 swaymsg = flag.Bool("swaymsg", defaultBoolIfBlank(os.Getenv("XDG_CURRENT_DESKTOP"), false), "Use swaymsg (sway only)") +var term = flag.String("term", defaultTermIfBlank(os.Getenv("TERM"), "foot"), "Terminal emulator") +var wm = flag.String("wm", defaultStringIfBlank(os.Getenv("XDG_CURRENT_DESKTOP"), ""), "Use swaymsg or hyprlandctl") 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") @@ -164,6 +169,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) diff --git a/tools.go b/tools.go index 8d1a48c..9bbe7b8 100644 --- a/tools.go +++ b/tools.go @@ -602,10 +602,14 @@ func launch(command string, terminal bool) { args = []string{elements[cmdIdx]} } cmd = exec.Command(prefixCommand, args...) - } else if *swaymsg { + } else if *wm == "sway" { prefixCommand = "swaymsg" args = []string{"exec", elements[cmdIdx]} cmd = exec.Command(prefixCommand, args...) + } else if *wm == "hyprland" { + prefixCommand = "hyprlandctl" + args = []string{"dispatch", "exec", elements[cmdIdx]} + cmd = exec.Command(prefixCommand, args...) } // set env variables From 808fd032a0ffd675b4cf20b221f3f8c9702fe56c Mon Sep 17 00:00:00 2001 From: gouvinb Date: Mon, 6 Nov 2023 00:05:16 +0100 Subject: [PATCH 2/5] fix prefix command with hypr or hyprland and update `-wm` description --- main.go | 2 +- tools.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index 32e0a94..fe1eb00 100644 --- a/main.go +++ b/main.go @@ -149,7 +149,7 @@ 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", defaultTermIfBlank(os.Getenv("TERM"), "foot"), "Terminal emulator") -var wm = flag.String("wm", defaultStringIfBlank(os.Getenv("XDG_CURRENT_DESKTOP"), ""), "Use swaymsg or hyprlandctl") +var wm = flag.String("wm", defaultStringIfBlank(os.Getenv("XDG_CURRENT_DESKTOP"), ""), "Use swaymsg (with `sway` argument) or hyprctl (with `hypr` or `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") diff --git a/tools.go b/tools.go index 9bbe7b8..a3215bf 100644 --- a/tools.go +++ b/tools.go @@ -607,7 +607,7 @@ func launch(command string, terminal bool) { args = []string{"exec", elements[cmdIdx]} cmd = exec.Command(prefixCommand, args...) } else if *wm == "hyprland" { - prefixCommand = "hyprlandctl" + prefixCommand = "hyprctl" args = []string{"dispatch", "exec", elements[cmdIdx]} cmd = exec.Command(prefixCommand, args...) } From 87ee23afe2be011f56ae3c07d3cad1efeaf4ba3d Mon Sep 17 00:00:00 2001 From: gouvinb Date: Mon, 6 Nov 2023 12:40:10 +0100 Subject: [PATCH 3/5] print the correct executed command (prefix supported) --- tools.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools.go b/tools.go index a3215bf..a0db363 100644 --- a/tools.go +++ b/tools.go @@ -618,7 +618,7 @@ func launch(command string, terminal bool) { 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("env vars: %s; command: '%s'; args: %s\n", envVars, cmd.Args[cmdIdx], cmd.Args[1+cmdIdx:]) log.Info(msg) cmd.SysProcAttr = &syscall.SysProcAttr{ From 1c1132958154473162f9ef1f4a7496a2c30ac532 Mon Sep 17 00:00:00 2001 From: gouvinb Date: Mon, 6 Nov 2023 15:35:42 +0100 Subject: [PATCH 4/5] Reworked command building. Typical shell-supported command sets: - `cmd` - `cmd --arg` - `cmd --arg=value` - `ENV_VAR="value" cmd` - `ENV_VAR="value" cmd --arg` - `ENV_VAR="value" cmd --arg=value` The listed commands above are now better managed. Initially, the command types `cmd --arg=value` or `ENV_VAR="value" cmd --arg=value` were not correctly parsed. After finding a solution to this problem, I conducted further tests and discovered cases that were not currently handled. These cases are as follows: - `cmd "arg with space"` - `ENV_VAR="value with space" cmd` --- tools.go | 52 +++++++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/tools.go b/tools.go index a0db363..3df43c3 100644 --- a/tools.go +++ b/tools.go @@ -567,49 +567,51 @@ 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 + envVarsNum := 0 + if strings.Contains(elements[0], "=") { + for _, element := range elements { + if strings.Contains(element, "=") { + envVarsNum++ + } else { + break } } } - if cmdIdx == -1 { - cmdIdx = 0 - } + + // find prepended env variables, if any + var envVars []string if themeToPrepend != "" { envVars = append(envVars, fmt.Sprintf("GTK_THEME=%s", themeToPrepend)) } - cmd := exec.Command(elements[cmdIdx], elements[1+cmdIdx:]...) + cmdIdx := envVarsNum + firstArgIdx := envVarsNum + 1 + + if envVarsNum > 0 { + for idx, item := range elements { + if envVarsNum > idx && strings.Contains(item, "=") { + envVars = append(envVars, item) + } + } + } + + cmd := exec.Command(elements[cmdIdx], elements[firstArgIdx:]...) var prefixCommand string var args []string if terminal { prefixCommand = *term if *term != "foot" { - args = []string{"-e", elements[cmdIdx]} + args = []string{"-e", strings.Join(elements, " ")} } else { - args = []string{elements[cmdIdx]} + args = elements[cmdIdx:] } cmd = exec.Command(prefixCommand, args...) } else if *wm == "sway" { - prefixCommand = "swaymsg" - args = []string{"exec", elements[cmdIdx]} - cmd = exec.Command(prefixCommand, args...) + cmd = exec.Command("swaymsg", "exec", strings.Join(elements, " ")) } else if *wm == "hyprland" { - prefixCommand = "hyprctl" - args = []string{"dispatch", "exec", elements[cmdIdx]} - cmd = exec.Command(prefixCommand, args...) + cmd = exec.Command("hyprctl", "dispatch", "exec", strings.Join(elements, " ")) } // set env variables @@ -618,7 +620,7 @@ func launch(command string, terminal bool) { cmd.Env = append(cmd.Env, envVars...) } - msg := fmt.Sprintf("env vars: %s; command: '%s'; args: %s\n", envVars, cmd.Args[cmdIdx], cmd.Args[1+cmdIdx:]) + msg := fmt.Sprintf("env vars: %s; command: '%s'; args: %s\n", envVars, cmd.Args[0], cmd.Args[1:]) log.Info(msg) cmd.SysProcAttr = &syscall.SysProcAttr{ From e3de9cc67be5e8a6a9e77cdebcc8c24e62dd5be8 Mon Sep 17 00:00:00 2001 From: gouvinb Date: Tue, 7 Nov 2023 10:32:23 +0100 Subject: [PATCH 5/5] make better log with -wm flag --- main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index fe1eb00..8be74ae 100644 --- a/main.go +++ b/main.go @@ -125,7 +125,7 @@ func defaultStringIfBlank(s, fallback string) string { func validateWm() { if !(*wm == "sway" || *wm == "hyprland") && *wm != "" { *wm = "" - log.Warn("nwg-drawer support only `swaymsg` or `hyprland`.") + log.Warn("-wm argument supports only sway or hyprland string.") } } @@ -149,7 +149,7 @@ 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", defaultTermIfBlank(os.Getenv("TERM"), "foot"), "Terminal emulator") -var wm = flag.String("wm", defaultStringIfBlank(os.Getenv("XDG_CURRENT_DESKTOP"), ""), "Use swaymsg (with `sway` argument) or hyprctl (with `hypr` or `hyprland`)") +var wm = flag.String("wm", defaultStringIfBlank(os.Getenv("XDG_CURRENT_DESKTOP"), ""), "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")