1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-08-02 03:28:28 -04:00

freebsd: add initial support for running on FreeBSD, excluding Bluez,

ppd, and some things. Add a simple wpa_supplicant backend
This commit is contained in:
bbedward
2026-07-19 10:31:48 -04:00
parent 069df80b22
commit 90291bd627
46 changed files with 3168 additions and 209 deletions
@@ -184,6 +184,8 @@ done
}
Row {
// charge_control_* live in Linux sysfs; no BSD equivalent
visible: Qt.platform.os === "linux"
width: parent.width
height: applyButton.height
layoutDirection: I18n.isRtl ? Qt.LeftToRight : Qt.RightToLeft
+10
View File
@@ -361,6 +361,16 @@ EOFCONFIG
wireplumberReloading = true;
wireplumberReloadStarted();
if (!SessionService.systemctlCommandAvailable) {
Proc.runCommand("restartWireplumber", ["sh", "-c", "pkill -x wireplumber; sleep 1"], () => {
Quickshell.execDetached(["wireplumber"]);
wireplumberReloading = false;
ToastService.showInfo(I18n.tr("Audio system restarted"), I18n.tr("Device names updated"));
wireplumberReloadCompleted(true);
}, 5000);
return;
}
Proc.runCommand("restartWireplumber", ["systemctl", "--user", "restart", "wireplumber"], (output, exitCode) => {
wireplumberReloading = false;
+6 -2
View File
@@ -948,8 +948,12 @@ Singleton {
// systemd user environment from previous sessions and lie. Unset
// WAYLAND_DISPLAY falls back to "wayland-0", mirroring wl_display_connect.
// /proc/net/unix: field 6 is state (01 = listening), 7 inode, 8 bound path.
// The BSDs have no /proc/net; sockstat(1) -l -u lists listening unix
// sockets as USER COMMAND PID FD PROTO LOCAL-ADDRESS.
function detectCompositor() {
const script = 'sock="${WAYLAND_DISPLAY:-wayland-0}"; case "$sock" in /*) ;; *) sock="${XDG_RUNTIME_DIR:-/run/user/$(id -u)}/$sock" ;; esac; inode=$(awk -v p="$sock" \'$8 == p && $6 == 1 {print $7; exit}\' /proc/net/unix); [ -n "$inode" ] || exit 1; fd=$(find /proc/[0-9]*/fd/ -mindepth 1 -maxdepth 1 -lname "socket:\\[$inode\\]" 2>/dev/null | head -n1); [ -n "$fd" ] || exit 1; pid="${fd#/proc/}"; cat "/proc/${pid%%/*}/comm"';
const procScript = 'sock="${WAYLAND_DISPLAY:-wayland-0}"; case "$sock" in /*) ;; *) sock="${XDG_RUNTIME_DIR:-/run/user/$(id -u)}/$sock" ;; esac; inode=$(awk -v p="$sock" \'$8 == p && $6 == 1 {print $7; exit}\' /proc/net/unix); [ -n "$inode" ] || exit 1; fd=$(find /proc/[0-9]*/fd/ -mindepth 1 -maxdepth 1 -lname "socket:\\[$inode\\]" 2>/dev/null | head -n1); [ -n "$fd" ] || exit 1; pid="${fd#/proc/}"; cat "/proc/${pid%%/*}/comm"';
const sockstatScript = 'sock="${WAYLAND_DISPLAY:-wayland-0}"; case "$sock" in /*) ;; *) sock="${XDG_RUNTIME_DIR:-/var/run/user/$(id -u)}/$sock" ;; esac; sockstat -l -u | awk -v p="$sock" \'$6 == p {print $2; exit}\'';
const script = Qt.platform.os === "unix" ? sockstatScript : procScript;
Proc.runCommand("waylandSocketOwner", ["sh", "-c", script], (output, exitCode) => {
const comm = (exitCode === 0 && output) ? output.trim().toLowerCase() : "";
const name = _compositorNameFromComm(comm);
@@ -1037,7 +1041,7 @@ Singleton {
{
name: "labwc",
present: !!labwcPid,
test: ["sh", "-c", "[ \"$(cat /proc/\"$LABWC_PID\"/comm 2>/dev/null)\" = labwc ]"],
test: ["sh", "-c", "[ \"$(ps -p \"$LABWC_PID\" -o comm= 2>/dev/null)\" = labwc ]"],
detail: "LABWC_PID " + labwcPid
},
{
+18
View File
@@ -12,6 +12,8 @@ Singleton {
id: root
readonly property var log: Log.scoped("SessionService")
// Qt.platform.os is "unix" on the BSDs (qtdeclarative qqmlplatform.cpp)
readonly property bool isBSD: Qt.platform.os === "unix"
property bool hasUwsm: false
property bool isElogind: false
property bool loginctlCommandAvailable: false
@@ -351,10 +353,26 @@ Singleton {
}
function powerManagerCommand(action) {
if (isBSD)
return bsdPowerCommand(action);
const useLoginctl = isElogind || (loginctlCommandAvailable && !systemctlCommandAvailable);
return [useLoginctl ? "loginctl" : "systemctl", action];
}
function bsdPowerCommand(action) {
switch (action) {
case "suspend":
case "suspend-then-hibernate":
return ["acpiconf", "-s", "3"];
case "hibernate":
return ["acpiconf", "-s", "4"];
case "reboot":
return ["shutdown", "-r", "now"];
default:
return ["shutdown", "-p", "now"];
}
}
function suspend() {
if (SettingsData.customPowerActionSuspend.length === 0) {
Quickshell.execDetached(powerManagerCommand("suspend"));
+18 -6
View File
@@ -10,6 +10,9 @@ Singleton {
readonly property var log: Log.scoped("UsersService")
// Qt.platform.os is "unix" on the BSDs; user management goes through pw(8)
readonly property bool isBSD: Qt.platform.os === "unix"
property var users: []
property string adminGroup: "wheel"
property string greeterGroup: "greeter"
@@ -286,7 +289,7 @@ Singleton {
property string op: "passwd"
property var cb: null
property string capturedErr: ""
command: ["pkexec", "sh", "-c", "head -n1 | chpasswd"]
command: root.isBSD ? ["pkexec", "pw", "usermod", "-n", targetUser, "-h", "0"] : ["pkexec", "sh", "-c", "head -n1 | chpasswd"]
stdinEnabled: true
running: false
stdout: StdioCollector {}
@@ -294,7 +297,10 @@ Singleton {
onStreamFinished: chpasswdProc.capturedErr = text || ""
}
onStarted: {
chpasswdProc.write(chpasswdProc.targetUser + ":" + chpasswdProc.targetPassword + "\n");
if (root.isBSD)
chpasswdProc.write(chpasswdProc.targetPassword + "\n");
else
chpasswdProc.write(chpasswdProc.targetUser + ":" + chpasswdProc.targetPassword + "\n");
}
onExited: exitCode => {
const op = chpasswdProc.op;
@@ -414,7 +420,7 @@ Singleton {
function _runUseradd(username, password, addToAdmin, addToGreeter, callback) {
const proc = useraddComp.createObject(root, {
command: ["pkexec", "useradd", "-m", "-s", "/bin/bash", username],
command: root.isBSD ? ["pkexec", "pw", "useradd", "-n", username, "-m", "-s", "/bin/sh"] : ["pkexec", "useradd", "-m", "-s", "/bin/bash", username],
targetUser: username,
targetPassword: password,
addAdmin: addToAdmin,
@@ -436,15 +442,21 @@ Singleton {
function _runUserdel(username, callback) {
const proc = userdelComp.createObject(root, {
command: ["pkexec", "userdel", "-r", username],
command: root.isBSD ? ["pkexec", "pw", "userdel", "-n", username, "-r"] : ["pkexec", "userdel", "-r", username],
targetUser: username,
cb: callback
});
proc.running = true;
}
function _groupMemberCmd(group, username, add) {
if (root.isBSD)
return ["pkexec", "pw", "groupmod", group, add ? "-m" : "-d", username];
return add ? ["pkexec", "usermod", "-aG", group, username] : ["pkexec", "gpasswd", "-d", username, group];
}
function _runAdminToggle(username, makeAdmin, callback) {
const cmd = makeAdmin ? ["pkexec", "usermod", "-aG", root.adminGroup, username] : ["pkexec", "gpasswd", "-d", username, root.adminGroup];
const cmd = _groupMemberCmd(root.adminGroup, username, makeAdmin);
const proc = adminToggleComp.createObject(root, {
command: cmd,
targetUser: username,
@@ -455,7 +467,7 @@ Singleton {
}
function _runGreeterToggle(username, enableGreeter, callback) {
const cmd = enableGreeter ? ["pkexec", "usermod", "-aG", root.greeterGroup, username] : ["pkexec", "gpasswd", "-d", username, root.greeterGroup];
const cmd = _groupMemberCmd(root.greeterGroup, username, enableGreeter);
const proc = greeterToggleComp.createObject(root, {
command: cmd,
targetUser: username,
+2 -1
View File
@@ -46,7 +46,8 @@ Singleton {
property int _geocodeReqId: 0
property var _pendingCoords: null
readonly property var lowPriorityCmd: ["nice", "-n", "19", "ionice", "-c3"]
// ionice is util-linux only; the BSDs get plain nice
readonly property var lowPriorityCmd: Qt.platform.os === "linux" ? ["nice", "-n", "19", "ionice", "-c3"] : ["nice", "-n", "19"]
readonly property var curlBaseCmd: ["curl", "-sS", "--fail", "--connect-timeout", "3", "--max-time", "6", "--limit-rate", "100k", "--compressed"]
property var weatherIcons: ({