This commit is contained in:
2026-08-31 15:44:33 +02:00
parent 2be7267c41
commit 7855a01e54
8 changed files with 139 additions and 94 deletions
+3 -3
View File
@@ -1,4 +1,4 @@
# Omarchy Citizen 0.6.1 – Plug-&-Play-Installation
# Omarchy Citizen 0.6.2 – Plug-&-Play-Installation
## Ziel
@@ -275,9 +275,9 @@ Damit brauchst du im ersten Supportkontakt normalerweise keine Terminalbefehle
vom Nutzer anzufordern.
## Hotfix 0.6.1 – Setup-Button
## Hotfix 0.6.2 – Setup-Button
Version 0.6.1 ändert die Ausführung der Panel-Aktionen grundlegend.
Version 0.6.2 ändert die Ausführung der Panel-Aktionen grundlegend.
Beim Klick auf **EINRICHTEN & STARTKLAR MACHEN** wird die Aktion nun direkt als
Quickshell-Prozess gestartet. Das Panel zeigt sofort **WIRD GESTARTET**.
+68 -60
View File
@@ -12,7 +12,7 @@ Panel {
property var anchorItem: null
property var hostWidget: null
property string pluginVersion: "0.6.1"
property string pluginVersion: "0.6.2"
property string health: "checking"
property string depsState: "checking"
property string depsMissing: ""
@@ -47,6 +47,7 @@ Panel {
readonly property color warning: "#ffd276"
readonly property color danger: "#ff8fa1"
readonly property color muted: "#a8bbc9"
readonly property string uiFont: "sans-serif"
readonly property string controlScript: decodeURIComponent(
Qt.resolvedUrl("citizenctl").toString().replace(/^file:\/\//, "")
@@ -95,7 +96,7 @@ Panel {
values[lines[i].slice(0, p)] = lines[i].slice(p + 1)
}
pluginVersion = values.plugin_version || "0.6.1"
pluginVersion = values.plugin_version || "0.6.2"
health = values.health || "setup"
depsState = values.deps || "missing"
depsMissing = values.deps_missing || ""
@@ -220,7 +221,9 @@ Panel {
onExited: function(exitCode) {
if (exitCode === 0) {
root.actionError = ""
root.actionStatus = "Gestartet."
root.actionStatus = root.actionKind === "primary" && root.health !== "ready"
? "Setup-Fenster wurde geöffnet. Folge dort einfach den angezeigten Schritten."
: "Aktion wurde gestartet."
root.refreshStatus()
if (root.actionCloseOnSuccess)
@@ -302,7 +305,7 @@ Panel {
anchors.centerIn: parent
text: "✦"
color: root.healthColor()
font.family: root.bar ? root.bar.fontFamily : Style.font.family
font.family: root.uiFont
font.pixelSize: Style.font.title
font.bold: true
}
@@ -314,7 +317,7 @@ Panel {
Text {
text: "OMARCHY CITIZEN"
color: root.barForeground
font.family: root.bar ? root.bar.fontFamily : Style.font.family
font.family: root.uiFont
font.pixelSize: Style.font.title
font.bold: true
}
@@ -322,7 +325,7 @@ Panel {
Text {
text: root.headline()
color: root.healthColor()
font.family: root.bar ? root.bar.fontFamily : Style.font.family
font.family: root.uiFont
font.pixelSize: Style.font.bodySmall
font.bold: true
}
@@ -333,7 +336,7 @@ Panel {
width: parent.width
text: root.subline()
color: root.muted
font.family: root.bar ? root.bar.fontFamily : Style.font.family
font.family: root.uiFont
font.pixelSize: Style.font.bodySmall
wrapMode: Text.WordWrap
}
@@ -344,10 +347,13 @@ Panel {
? "… WIRD GESTARTET"
: root.primaryText()
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
active: root.health === "ready" || actionProc.running
onClicked: root.runAction(root.health === "repair" ? "repair" : "primary")
onClicked: root.runAction(
root.health === "repair" ? "repair" : "primary",
root.health === "ready"
)
}
Text {
@@ -355,7 +361,7 @@ Panel {
width: parent.width
text: root.actionStatus
color: root.accent
font.family: root.bar ? root.bar.fontFamily : Style.font.family
font.family: root.uiFont
font.pixelSize: Style.font.caption
wrapMode: Text.WordWrap
}
@@ -377,7 +383,7 @@ Panel {
anchors.margins: Style.space(8)
text: root.actionError
color: root.danger
font.family: root.bar ? root.bar.fontFamily : Style.font.family
font.family: root.uiFont
font.pixelSize: Style.font.caption
wrapMode: Text.WordWrap
}
@@ -404,7 +410,7 @@ Panel {
Text {
text: "HILFE OHNE LINUX-WISSEN"
color: root.accent
font.family: root.bar ? root.bar.fontFamily : Style.font.family
font.family: root.uiFont
font.pixelSize: Style.font.bodySmall
font.bold: true
}
@@ -421,7 +427,7 @@ Panel {
width: helpGrid.cellWidth
text: "↻ Problem beheben"
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
onClicked: root.runAction("repair")
}
@@ -430,7 +436,7 @@ Panel {
width: helpGrid.cellWidth
text: "▣ Support-Paket erstellen"
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
onClicked: root.runAction("support")
}
@@ -440,7 +446,7 @@ Panel {
width: parent.width
text: "Das Support-Paket sammelt Diagnoseinformationen automatisch und maskiert typische persönliche Daten vor dem Export."
color: root.muted
font.family: root.bar ? root.bar.fontFamily : Style.font.family
font.family: root.uiFont
font.pixelSize: Style.font.caption
wrapMode: Text.WordWrap
}
@@ -469,13 +475,13 @@ Panel {
StatusChip {
label: "LUG"
value: root.helperState === "ready" ? "OK" : "Setup"
value: root.helperState === "ready" ? "bereit" : "fehlt"
chipColor: root.stateColor(root.helperState)
}
StatusChip {
label: "Launcher"
value: root.launcherState === "ready" ? "OK" : "Setup"
value: root.launcherState === "ready" ? "bereit" : "Setup"
chipColor: root.stateColor(root.launcherState)
}
@@ -492,7 +498,7 @@ Panel {
(root.helperVersion !== "" ? root.helperVersion : "nicht eingerichtet") +
" · Plugin: " + (root.pluginManaged === "git" ? (root.pluginAuto === "true" ? "Auto" : "Git") : "ZIP")
color: root.muted
font.family: root.bar ? root.bar.fontFamily : Style.font.family
font.family: root.uiFont
font.pixelSize: Style.font.caption
wrapMode: Text.WordWrap
}
@@ -503,7 +509,7 @@ Panel {
width: parent.width
text: root.advancedVisible ? "▲ Erweiterte Optionen ausblenden" : "▼ Erweiterte Optionen anzeigen"
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
onClicked: root.advancedVisible = !root.advancedVisible
}
@@ -528,7 +534,7 @@ Panel {
Text {
text: "ERWEITERTE OPTIONEN"
color: root.accent
font.family: root.bar ? root.bar.fontFamily : Style.font.family
font.family: root.uiFont
font.pixelSize: Style.font.bodySmall
font.bold: true
}
@@ -565,7 +571,7 @@ Panel {
Text {
text: "PLUGIN-UPDATES"
color: root.accent
font.family: root.bar ? root.bar.fontFamily : Style.font.family
font.family: root.uiFont
font.pixelSize: Style.font.bodySmall
font.bold: true
}
@@ -599,7 +605,7 @@ Panel {
width: pluginUpdateGrid.cellWidth
text: "Plugin-Update prüfen"
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
onClicked: root.runAction("plugin-update-check")
}
@@ -608,7 +614,7 @@ Panel {
width: pluginUpdateGrid.cellWidth
text: "Plugin jetzt aktualisieren"
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
active: root.pluginUpdate === "available"
onClicked: root.runAction("plugin-update-now")
@@ -618,7 +624,7 @@ Panel {
width: pluginUpdateGrid.cellWidth
text: root.pluginAuto === "true" ? "Auto-Updates ausschalten" : "Auto-Updates einschalten"
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
onClicked: root.runAction(root.pluginAuto === "true" ? "plugin-auto-disable" : "plugin-auto-enable")
}
@@ -627,7 +633,7 @@ Panel {
width: pluginUpdateGrid.cellWidth
text: "Updater-Log öffnen"
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
onClicked: root.runAction("updater-log")
}
@@ -639,7 +645,7 @@ Panel {
? "Auto-Updates verwenden Omarchys eigenen Plugin-Updater mit Validierung und Rollback. Das beim Aktivieren vorhandene Git-Remote wird als vertrauenswürdige Quelle gespeichert."
: "Die aktuelle ZIP-Installation bleibt bewusst ohne unbekannte Update-Quelle. Sobald Omarchy Citizen aus einem Git-Repository installiert wird, erkennt das Backend dessen origin automatisch."
color: root.muted
font.family: root.bar ? root.bar.fontFamily : Style.font.family
font.family: root.uiFont
font.pixelSize: Style.font.caption
wrapMode: Text.WordWrap
}
@@ -658,7 +664,7 @@ Panel {
width: setupGrid.cellWidth
text: root.checkingUpdate ? "Update wird geprüft…" : "LUG Update prüfen"
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
onClicked: root.checkForUpdates()
}
@@ -667,7 +673,7 @@ Panel {
width: setupGrid.cellWidth
text: "LUG aktualisieren"
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
onClicked: root.runAction("update-helper")
}
@@ -676,7 +682,7 @@ Panel {
width: setupGrid.cellWidth
text: "Omarchy aktualisieren"
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
onClicked: root.runAction("system-update")
}
@@ -685,7 +691,7 @@ Panel {
width: setupGrid.cellWidth
text: "LUG Helper öffnen"
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
onClicked: root.runAction("helper")
}
@@ -694,7 +700,7 @@ Panel {
width: setupGrid.cellWidth
text: "Wine-Runner"
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
onClicked: root.runAction("runners")
}
@@ -703,7 +709,7 @@ Panel {
width: setupGrid.cellWidth
text: "DXVK verwalten"
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
onClicked: root.runAction("dxvk")
}
@@ -712,7 +718,7 @@ Panel {
width: setupGrid.cellWidth
text: "RSI reparieren"
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
onClicked: root.runAction("repair-rsi")
}
@@ -721,7 +727,7 @@ Panel {
width: setupGrid.cellWidth
text: "Start-Script reparieren"
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
onClicked: root.runAction("repair-launch")
}
@@ -730,7 +736,7 @@ Panel {
width: setupGrid.cellWidth
text: "Start-Log öffnen"
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
onClicked: root.runAction("log")
}
@@ -739,7 +745,7 @@ Panel {
width: setupGrid.cellWidth
text: "Plugin-Debuglog öffnen"
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
onClicked: root.runAction("debug-log")
}
@@ -750,7 +756,7 @@ Panel {
Text {
text: "NGL · EXPERIMENTELL"
color: root.warning
font.family: root.bar ? root.bar.fontFamily : Style.font.family
font.family: root.uiFont
font.pixelSize: Style.font.bodySmall
font.bold: true
}
@@ -767,7 +773,7 @@ Panel {
width: nglGrid.cellWidth
text: "NGL Download"
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
onClicked: root.runAction("ngl-page")
}
@@ -776,7 +782,7 @@ Panel {
width: nglGrid.cellWidth
text: "NGL installieren"
foreground: root.barForeground
fontFamily: root.bar ? root.bar.fontFamily : Style.font.family
fontFamily: root.uiFont
bordered: true
onClicked: root.runAction("ngl-install")
}
@@ -787,7 +793,7 @@ Panel {
text: "NGL bleibt bewusst optional. Der normale RSI/LUG-Weg funktioniert unabhängig davon."
color: root.warning
opacity: 0.82
font.family: root.bar ? root.bar.fontFamily : Style.font.family
font.family: root.uiFont
font.pixelSize: Style.font.caption
wrapMode: Text.WordWrap
}
@@ -798,7 +804,7 @@ Panel {
width: parent.width
text: "Ziel: spielen statt Linux administrieren. Für Support genügt normalerweise „Support-Paket erstellen“."
color: root.muted
font.family: root.bar ? root.bar.fontFamily : Style.font.family
font.family: root.uiFont
font.pixelSize: Style.font.caption
wrapMode: Text.WordWrap
}
@@ -807,16 +813,17 @@ Panel {
}
component StatusChip: Rectangle {
id: chip
property string label: ""
property string value: ""
property color chipColor: root.accent
radius: 999
color: Qt.rgba(chipColor.r, chipColor.g, chipColor.b, 0.12)
border.color: chipColor
color: Qt.rgba(chip.chipColor.r, chip.chipColor.g, chip.chipColor.b, 0.12)
border.color: chip.chipColor
border.width: 1
implicitWidth: chipRow.implicitWidth + Style.space(14)
implicitHeight: chipRow.implicitHeight + Style.space(8)
implicitWidth: chipRow.implicitWidth + Style.space(16)
implicitHeight: chipRow.implicitHeight + Style.space(9)
Row {
id: chipRow
@@ -824,16 +831,16 @@ Panel {
spacing: Style.space(5)
Text {
text: parent.label
text: chip.label
color: root.muted
font.family: root.bar ? root.bar.fontFamily : Style.font.family
font.family: root.uiFont
font.pixelSize: Style.font.caption
}
Text {
text: parent.value
color: parent.chipColor
font.family: root.bar ? root.bar.fontFamily : Style.font.family
text: chip.value
color: chip.chipColor
font.family: root.uiFont
font.pixelSize: Style.font.caption
font.bold: true
}
@@ -841,16 +848,17 @@ Panel {
}
component StatusLine: Rectangle {
id: statusLine
property string label: ""
property string value: ""
property string state: "unknown"
width: parent.width
radius: 12
radius: 11
color: root.surfaceRaised
border.color: root.border
border.width: 1
implicitHeight: lineRow.implicitHeight + Style.space(10)
implicitHeight: lineRow.implicitHeight + Style.space(12)
Row {
id: lineRow
@@ -861,25 +869,25 @@ Panel {
spacing: Style.space(8)
Rectangle {
width: 10
height: 10
width: 9
height: 9
radius: 5
color: root.stateColor(parent.state)
color: root.stateColor(statusLine.state)
}
Text {
width: Style.space(118)
text: parent.label
text: statusLine.label
color: root.muted
font.family: root.bar ? root.bar.fontFamily : Style.font.family
font.family: root.uiFont
font.pixelSize: Style.font.bodySmall
}
Text {
width: Math.max(0, parent.width - Style.space(158))
text: root.stateIcon(parent.state) + " " + parent.value
width: Math.max(0, lineRow.width - Style.space(158))
text: root.stateIcon(statusLine.state) + " " + statusLine.value
color: root.barForeground
font.family: root.bar ? root.bar.fontFamily : Style.font.family
font.family: root.uiFont
font.pixelSize: Style.font.bodySmall
elide: Text.ElideRight
}
+10 -2
View File
@@ -1,4 +1,4 @@
# Omarchy Citizen 0.6.1
# Omarchy Citizen 0.6.2
A plug-and-play Star Citizen control panel for Omarchy.
@@ -70,10 +70,18 @@ remote; unattended updates stop if that remote changes or the checkout is dirty.
See [`backend/README.md`](backend/README.md) and [`GIT_DISTRIBUTION.md`](GIT_DISTRIBUTION.md).
## 0.6.1 hotfix
## 0.6.2 hotfix
- primary/setup actions now run through a Quickshell `Process` instead of fire-and-forget `bar.run`
- the panel shows `WIRD GESTARTET` immediately after a click
- startup failures stay visible in the panel instead of silently closing it
- terminal launch has a monitored fallback path and logs immediate launcher failures
- installers restart the Omarchy shell after QML changes to avoid stale third-party plugin QML
## 0.6.2 UI / setup hotfix
- fixed `undefined` in reusable status rows and chips
- panel no longer inherits the bar's theme font; uses a neutral system sans font
- first-time setup keeps the panel open and shows a visible status message
- setup terminal is launched directly through `xdg-terminal-exec`/UWSM with separate argv
- failed package/AUR setup remains visible instead of the terminal disappearing immediately
Binary file not shown.
+1 -1
View File
@@ -16,7 +16,7 @@ import (
)
const (
appVersion = "0.6.1"
appVersion = "0.6.2"
pluginID = "local.omarchy-citizen"
)
+54 -25
View File
@@ -2,7 +2,7 @@
set -u
PLUGIN_ID="local.omarchy-citizen"
PLUGIN_VERSION="0.6.1"
PLUGIN_VERSION="0.6.2"
CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/starcitizen-lug"
DATA_DIR="${XDG_DATA_HOME:-$HOME/.local/share}"
@@ -388,9 +388,7 @@ probe_detached_start() {
"$@" >>"$LOG_FILE" 2>&1 &
local pid=$!
# Give immediate launcher errors a chance to surface. A successful terminal
# launcher may either stay alive or exit 0 after handing the terminal off.
sleep 0.35
sleep 0.45
if ! kill -0 "$pid" 2>/dev/null; then
local rc=0
@@ -409,37 +407,44 @@ probe_detached_start() {
launch_terminal_action() {
local action="$1"
local cmd
log_line "launch-terminal action=$action"
printf -v cmd 'bash %q %q' "$SELF" "$action"
log_line "launch-terminal action=$action cmd=$cmd"
# Prefer direct argv-safe terminal launching. This avoids the presentation
# wrapper joining arguments into one shell command string.
if command -v uwsm-app >/dev/null 2>&1 && command -v xdg-terminal-exec >/dev/null 2>&1; then
if probe_detached_start "uwsm-xdg-terminal" \
setsid uwsm-app -- xdg-terminal-exec \
--app-id=org.omarchy.terminal \
--title="Omarchy Citizen Setup" \
-e bash "$SELF" "$action"; then
printf 'terminal=opened\n'
return 0
fi
fi
if command -v xdg-terminal-exec >/dev/null 2>&1; then
if probe_detached_start "xdg-terminal" \
xdg-terminal-exec \
--title="Omarchy Citizen Setup" \
-e bash "$SELF" "$action"; then
printf 'terminal=opened\n'
return 0
fi
fi
# Final compatibility fallback for older/current Omarchy installations.
if command -v omarchy-launch-floating-terminal-with-presentation >/dev/null 2>&1; then
if probe_detached_start "omarchy-floating-terminal" \
omarchy-launch-floating-terminal-with-presentation bash "$SELF" "$action"; then
return 0
fi
log_line "primary floating terminal launcher failed; trying direct terminal fallback"
fi
if command -v uwsm-app >/dev/null 2>&1 && command -v xdg-terminal-exec >/dev/null 2>&1; then
if probe_detached_start "direct-omarchy-terminal" \
setsid uwsm-app -- xdg-terminal-exec \
--app-id=org.omarchy.terminal \
--title="Omarchy Citizen" \
-e bash -c "$cmd"; then
return 0
fi
elif command -v xdg-terminal-exec >/dev/null 2>&1; then
if probe_detached_start "xdg-terminal" \
xdg-terminal-exec -e bash "$SELF" "$action"; then
printf 'terminal=opened\n'
return 0
fi
fi
echo "Das Setup-Terminal konnte nicht geöffnet werden." >&2
notify_error "Das Setup-Terminal konnte nicht geöffnet werden.
Bitte erstelle im SC-Panel ein Support-Paket. Darin ist jetzt auch der fehlgeschlagene Startversuch protokolliert."
Bitte klicke auf „Support-Paket erstellen“. Der fehlgeschlagene Startversuch ist dort protokolliert."
return 1
}
@@ -481,9 +486,32 @@ guided_setup() {
}
install_stack_terminal() {
set -e
set -Ee
exec > >(tee -a "$LOG_FILE") 2>&1
setup_failed() {
local rc=$?
trap - ERR
echo
echo "=================================================="
echo " SETUP KONNTE NICHT ABGESCHLOSSEN WERDEN"
echo "=================================================="
echo
echo "Fehlercode: $rc"
echo "Keine Sorge: Im SC-Panel kannst du anschließend"
echo "„Support-Paket erstellen“ wählen."
echo
log_line "install-stack failed rc=$rc"
notify "Omarchy Citizen" "Setup fehlgeschlagen. Bitte erstelle im SC-Panel ein Support-Paket."
if [[ -t 0 ]]; then
read -r -p "Drücke Enter, um dieses Fenster zu schließen … " _ || true
else
sleep 8
fi
exit "$rc"
}
trap setup_failed ERR
echo
echo "=================================================="
echo " Omarchy Citizen – Plug & Play Setup"
@@ -523,6 +551,7 @@ install_stack_terminal() {
echo
echo "Plug-&-Play-Setup beendet."
echo "Du kannst dieses Fenster schließen und ✦SC öffnen."
trap - ERR
notify "Omarchy Citizen" "Grundsetup abgeschlossen. Öffne ✦SC und starte Star Citizen."
log_line "install-stack complete"
}
+1 -1
View File
@@ -44,7 +44,7 @@ omarchy plugin enable "$PLUGIN_ID"
omarchy restart shell >/dev/null 2>&1 || true
echo
echo "Omarchy Citizen 0.6.1 wurde installiert:"
echo "Omarchy Citizen 0.6.2 wurde installiert:"
echo " $DEST"
echo
echo "Links-Klick auf 'SC' in der Omarchy-Leiste öffnet das Star-Citizen-Panel."
+2 -2
View File
@@ -2,10 +2,10 @@
"schemaVersion": 1,
"id": "local.omarchy-citizen",
"name": "Omarchy Citizen",
"version": "0.6.1",
"version": "0.6.2",
"author": "Community prototype",
"license": "MIT",
"description": "Plug-and-play Star Citizen controls for Omarchy with reliable in-panel action execution, guided setup/repair, debug support bundles, update backend and optional NGL.",
"description": "Plug-and-play Star Citizen controls for Omarchy. 0.6.2 fixes status rendering and makes first-time setup visibly reliable.",
"kinds": [
"bar-widget"
],