session: parse DesktopNames for XDG_CURRENT_DESKTOP, wire utmpx, fix shell
- .desktop files now parse DesktopNames: first ;-entry → XDG_SESSION_DESKTOP, full list with : separators → XDG_CURRENT_DESKTOP - AddUtmpx/Close wired into spawnSession (logins appear in who/w/last) - Credentials.Shell reads from /etc/passwd instead of hardcoded /bin/sh - Added SetDesktopVars to env.go
This commit is contained in:
@@ -13,10 +13,11 @@ import (
|
||||
)
|
||||
|
||||
type DesktopEntry struct {
|
||||
Name string
|
||||
Exec string
|
||||
Hidden bool
|
||||
NoDisplay bool
|
||||
Name string
|
||||
Exec string
|
||||
DesktopNames string
|
||||
Hidden bool
|
||||
NoDisplay bool
|
||||
}
|
||||
|
||||
func parseDesktopEntry(path string) (*DesktopEntry, error) {
|
||||
@@ -51,6 +52,8 @@ func parseDesktopEntry(path string) (*DesktopEntry, error) {
|
||||
e.Name = v
|
||||
case "Exec":
|
||||
e.Exec = v
|
||||
case "DesktopNames":
|
||||
e.DesktopNames = v
|
||||
case "Hidden":
|
||||
e.Hidden = strings.EqualFold(v, "true")
|
||||
case "NoDisplay":
|
||||
@@ -97,15 +100,28 @@ func scanDesktopDir(dir, kind string, envs *[]PostLoginEnv) {
|
||||
if err != nil || de.Hidden || de.NoDisplay {
|
||||
continue
|
||||
}
|
||||
desktopNames, sessionDesktop := splitDesktopNames(de.DesktopNames, e.Name())
|
||||
*envs = append(*envs, PostLoginEnv{
|
||||
Kind: kind,
|
||||
Title: de.Name,
|
||||
XinitrcPath: de.Exec,
|
||||
ScriptPath: de.Exec,
|
||||
Kind: kind,
|
||||
Title: de.Name,
|
||||
XinitrcPath: de.Exec,
|
||||
ScriptPath: de.Exec,
|
||||
DesktopNames: desktopNames,
|
||||
SessionDesktop: sessionDesktop,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func splitDesktopNames(raw, fallback string) (currentDesktop, sessionDesktop string) {
|
||||
if raw == "" {
|
||||
return fallback, fallback
|
||||
}
|
||||
parts := strings.SplitN(raw, ";", 2)
|
||||
sessionDesktop = strings.TrimSpace(parts[0])
|
||||
currentDesktop = strings.ReplaceAll(raw, ";", ":")
|
||||
return
|
||||
}
|
||||
|
||||
func scanScriptDir(dir, kind string, envs *[]PostLoginEnv) {
|
||||
entries, err := os.ReadDir(dir)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user