mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-10-15 07:44:01 -04:00
* 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>
42 lines
946 B
Go
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
|
|
}
|