Files
Nat Fletcherandclaude[bot] 30dc1122c5 added launcher dmenu mode (#3639)
* added launcher dmenu mode

* fixed prechecker issues

* added unit tests for dms dmenu command

* added workaround for matugen printing error message to stdout

* correct help message: matching is case-*in*sensitive

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* no longer save dmenu selections to history; now properly close dmenu sockets

* increased parity with rofi -dmenu flags; added -i as an ignored flag to match dmenu

* go mod tidied

---------

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
2026-10-04 22:16:40 -04:00

42 lines
946 B
Go

package dmenuipc
import (
"fmt"
"os"
"path/filepath"
"syscall"
"github.com/AvengeMedia/DankMaterialShell/core/internal/utils"
)
func AcquireQueueSlot(onWait func()) (release func(), err error) {
dir := filepath.Join(utils.RuntimeDir(), "dms")
if err := os.MkdirAll(dir, 0o700); err != nil {
return nil, fmt.Errorf("create dmenu queue dir: %w", err)
}
path := filepath.Join(dir, "dmenu.lock")
f, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, 0o600)
if err != nil {
return nil, fmt.Errorf("open dmenu queue lock: %w", err)
}
release = func() {
_ = syscall.Flock(int(f.Fd()), syscall.LOCK_UN)
f.Close()
}
if err := syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB); err == nil {
return release, nil
}
if onWait != nil {
onWait()
}
if err := syscall.Flock(int(f.Fd()), syscall.LOCK_EX); err != nil {
f.Close()
return nil, fmt.Errorf("acquire dmenu queue lock: %w", err)
}
return release, nil
}