Merge pull request #102 from gouvinb/main

add support to hyprlandctl
This commit is contained in:
Piotr Miller
2023-11-08 01:01:10 +01:00
committed by GitHub
2 changed files with 44 additions and 31 deletions

23
main.go
View File

@@ -104,7 +104,7 @@ var (
pinnedItemsChanged chan interface{} = make(chan interface{}, 1) pinnedItemsChanged chan interface{} = make(chan interface{}, 1)
) )
func defaultStringIfBlank(s, fallback string) string { func defaultTermIfBlank(s, fallback string) string {
s = strings.TrimSpace(s) s = strings.TrimSpace(s)
// os.Getenv("TERM") returns "linux" instead of empty string, if program has been started // 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. // from a key binding defined in the config file. See #23.
@@ -114,14 +114,19 @@ func defaultStringIfBlank(s, fallback string) string {
return s return s
} }
func defaultBoolIfBlank(s string, fallback bool) bool { func defaultStringIfBlank(s, fallback string) string {
s = strings.TrimSpace(s) s = strings.TrimSpace(s)
// os.Getenv("TERM") returns "linux" instead of empty string, if program has been started if s == "" {
// from a key binding defined in the config file. See #23.
if s != "sway" {
return fallback return fallback
} }
return true return s
}
func validateWm() {
if !(*wm == "sway" || *wm == "hyprland") && *wm != "" {
*wm = ""
log.Warn("-wm argument supports only sway or hyprland string.")
}
} }
// Flags // Flags
@@ -143,8 +148,8 @@ var columnsNumber = flag.Uint("c", 6, "number of Columns")
var itemSpacing = flag.Uint("spacing", 20, "icon spacing") var itemSpacing = flag.Uint("spacing", 20, "icon spacing")
var lang = flag.String("lang", "", "force lang, e.g. \"en\", \"pl\"") var lang = flag.String("lang", "", "force lang, e.g. \"en\", \"pl\"")
var fileManager = flag.String("fm", "thunar", "File Manager") 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 swaymsg = flag.Bool("swaymsg", defaultBoolIfBlank(os.Getenv("XDG_CURRENT_DESKTOP"), false), "Use swaymsg (sway only)") 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 nameLimit = flag.Int("fslen", 80, "File Search name LENgth Limit")
var noCats = flag.Bool("nocats", false, "Disable filtering by category") var noCats = flag.Bool("nocats", false, "Disable filtering by category")
var noFS = flag.Bool("nofs", false, "Disable file search") var noFS = flag.Bool("nofs", false, "Disable file search")
@@ -164,6 +169,8 @@ func main() {
os.Exit(0) os.Exit(0)
} }
validateWm()
// Gentle SIGTERM handler thanks to reiki4040 https://gist.github.com/reiki4040/be3705f307d3cd136e85 // Gentle SIGTERM handler thanks to reiki4040 https://gist.github.com/reiki4040/be3705f307d3cd136e85
// v0.2: we also need to support SIGUSR from now on // v0.2: we also need to support SIGUSR from now on
showWindowChannel := make(chan interface{}, 1) showWindowChannel := make(chan interface{}, 1)

View File

@@ -567,45 +567,51 @@ func launch(command string, terminal bool) {
elements := strings.Split(command, " ") elements := strings.Split(command, " ")
// find prepended env variables, if any envVarsNum := 0
envVarsNum := strings.Count(command, "=") if strings.Contains(elements[0], "=") {
var envVars []string for _, element := range elements {
if strings.Contains(element, "=") {
cmdIdx := -1 envVarsNum++
} else {
if envVarsNum > 0 { break
for idx, item := range elements {
if strings.Contains(item, "=") {
envVars = append(envVars, item)
} else if !strings.HasPrefix(item, "-") && cmdIdx == -1 {
cmdIdx = idx
} }
} }
} }
if cmdIdx == -1 {
cmdIdx = 0 // find prepended env variables, if any
} var envVars []string
if themeToPrepend != "" { if themeToPrepend != "" {
envVars = append(envVars, fmt.Sprintf("GTK_THEME=%s", 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 prefixCommand string
var args []string var args []string
if terminal { if terminal {
prefixCommand = *term prefixCommand = *term
if *term != "foot" { if *term != "foot" {
args = []string{"-e", elements[cmdIdx]} args = []string{"-e", strings.Join(elements, " ")}
} else { } else {
args = []string{elements[cmdIdx]} args = elements[cmdIdx:]
} }
cmd = exec.Command(prefixCommand, args...) cmd = exec.Command(prefixCommand, args...)
} else if *swaymsg { } else if *wm == "sway" {
prefixCommand = "swaymsg" cmd = exec.Command("swaymsg", "exec", strings.Join(elements, " "))
args = []string{"exec", elements[cmdIdx]} } else if *wm == "hyprland" {
cmd = exec.Command(prefixCommand, args...) cmd = exec.Command("hyprctl", "dispatch", "exec", strings.Join(elements, " "))
} }
// set env variables // set env variables
@@ -614,7 +620,7 @@ func launch(command string, terminal bool) {
cmd.Env = append(cmd.Env, envVars...) 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[0], cmd.Args[1:])
log.Info(msg) log.Info(msg)
cmd.SysProcAttr = &syscall.SysProcAttr{ cmd.SysProcAttr = &syscall.SysProcAttr{