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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
},
|
||||
{
|
||||
|
||||
@@ -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"));
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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: ({
|
||||
|
||||
Reference in New Issue
Block a user