Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: CI

on:
push:
branches: [main, dev, feature/**, fix/**]
branches: [main, dev, feat/**, feature/**, fix/**, hotfix/**, chore/**]
pull_request:
branches: [main, dev]

Expand Down Expand Up @@ -42,7 +42,9 @@ jobs:
kf6-qqc2-desktop-style \
polkit-devel \
clang-tools-extra \
qt6-qtbase-private-devel
qt6-qtbase-private-devel \
desktop-file-utils \
appstream

- name: Configure (CMake)
run: |
Expand All @@ -58,6 +60,11 @@ jobs:
- name: Run tests
run: ctest --test-dir build --output-on-failure

- name: Validate desktop metadata
run: |
desktop-file-validate data/icons/io.github.projectroasd.rocontrol.desktop
appstreamcli validate --no-net data/icons/io.github.projectroasd.rocontrol.metainfo.xml

- name: Check formatting (clang-format)
run: |
find src \( -name "*.cpp" -o -name "*.h" \) -print0 | \
Expand Down Expand Up @@ -92,12 +99,14 @@ jobs:
polkit-devel

- name: Prepare source tarball
id: prep
run: |
VERSION="$(sed -n 's/^[[:space:]]*VERSION[[:space:]]\([0-9.][0-9.]*\)$/\1/p' CMakeLists.txt | head -n1)"
if [[ -z "${VERSION}" ]]; then
echo "Failed to read project version from CMakeLists.txt" >&2
exit 1
fi
echo "version=${VERSION}" >> "${GITHUB_OUTPUT}"
ARCHIVE_BASENAME="ro-control-${VERSION}"
mkdir -p ~/rpmbuild/SOURCES ~/rpmbuild/SPECS
STAGE_DIR="$(mktemp -d)"
Expand All @@ -113,7 +122,7 @@ jobs:
run: |
rpmbuild -ba "${HOME}/rpmbuild/SPECS/ro-control.spec" \
--define "_topdir ${HOME}/rpmbuild" \
--define "upstream_version ${VERSION}"
--define "upstream_version ${{ steps.prep.outputs.version }}"

- name: Lint built RPMs
run: |
Expand Down
13 changes: 12 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,9 @@ jobs:
qt6-qttools-devel \
qt6-qtwayland-devel \
kf6-qqc2-desktop-style \
polkit-devel
polkit-devel \
desktop-file-utils \
appstream

- name: Build RPM artifacts
env:
Expand Down Expand Up @@ -164,6 +166,12 @@ jobs:

rpm -qp --info "${RPM_FILE}" > "dist/rpm/ro-control-${VERSION}-${RPM_ARCH}-info.txt"
rpm -qp --requires "${RPM_FILE}" | sort > "dist/rpm/ro-control-${VERSION}-${RPM_ARCH}-requires.txt"
rpm -qlp "${RPM_FILE}" | sort > "dist/rpm/ro-control-${VERSION}-${RPM_ARCH}-files.txt"

- name: Validate desktop metadata
run: |
desktop-file-validate data/icons/io.github.projectroasd.rocontrol.desktop
appstreamcli validate --no-net data/icons/io.github.projectroasd.rocontrol.metainfo.xml

- name: Install and smoke-test RPM
env:
Expand Down Expand Up @@ -201,6 +209,7 @@ jobs:
RPM_FILE="$(find dist/rpm -maxdepth 1 -type f -name "*.${RPM_ARCH}.rpm" | head -n1)"
INFO_FILE="dist/rpm/ro-control-${VERSION}-${RPM_ARCH}-info.txt"
REQUIRES_FILE="dist/rpm/ro-control-${VERSION}-${RPM_ARCH}-requires.txt"
FILES_FILE="dist/rpm/ro-control-${VERSION}-${RPM_ARCH}-files.txt"
CHECKSUM_FILE="dist/rpm/ro-control-${VERSION}-${RPM_ARCH}-SHA256SUMS.txt"
BUNDLE_DIR="dist/release/ro-control-${VERSION}-${RPM_ARCH}"
BUNDLE_NAME="ro-control-${VERSION}-${RPM_ARCH}-fedora42.tar.gz"
Expand All @@ -214,6 +223,7 @@ jobs:
cp "${RPM_FILE}" "${BUNDLE_DIR}/"
cp "${INFO_FILE}" "${BUNDLE_DIR}/"
cp "${REQUIRES_FILE}" "${BUNDLE_DIR}/"
cp "${FILES_FILE}" "${BUNDLE_DIR}/"
cp "${CHECKSUM_FILE}" "${BUNDLE_DIR}/"

tar -C dist/release -czf "dist/release/${BUNDLE_NAME}" "ro-control-${VERSION}-${RPM_ARCH}"
Expand Down Expand Up @@ -254,4 +264,5 @@ jobs:
dist/*SHA256SUMS.txt
dist/*-requires.txt
dist/*-info.txt
dist/*-files.txt
dist/*-fedora42.tar.gz
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.2.0] - 2026-03-30

### Changed
- KDE desktop preferences now apply at runtime, including saved theme mode selection
- Fedora CI now validates desktop/AppStream metadata and follows `feat/*` branches
- Release packaging now records installed RPM file manifests for smoke validation

### Fixed
- Installed builds now resolve the privileged helper from the correct libexec path
- RPM CI now propagates the detected project version correctly into `rpmbuild`
- System integration tests no longer depend on executable `/tmp` mounts

### Added
- NVIDIA detection pipeline with driver/module verification report
- Secure Boot detection and session type (Wayland/X11) detection
Expand Down
23 changes: 12 additions & 11 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.22)

project(ro-control
VERSION 0.1.0
VERSION 0.2.0
DESCRIPTION "Smart NVIDIA Driver Manager & System Monitor for Linux"
HOMEPAGE_URL "https://github.com/Project-Ro-ASD/ro-Control"
LANGUAGES CXX
Expand Down Expand Up @@ -83,6 +83,16 @@ set(APP_SOURCES
src/cli/cli.cpp
)

# ─── Install Paths ────────────────────────────────────────────────────────────
include(GNUInstallDirs)

set(RO_CONTROL_HELPER_INSTALL_PATH
"${CMAKE_INSTALL_FULL_LIBEXECDIR}/${RO_CONTROL_HELPER_NAME}"
)
set(RO_CONTROL_POLICY_BUILD_PATH
"${CMAKE_CURRENT_BINARY_DIR}/io.github.ProjectRoASD.rocontrol.policy"
)

# ─── QML Resources ────────────────────────────────────────────────────────────
add_library(ro-control-backend STATIC ${BACKEND_SOURCES})

Expand Down Expand Up @@ -173,16 +183,6 @@ target_compile_options(ro-control PRIVATE
$<$<CONFIG:Release>:-O2>
)

# ─── Install Targets ──────────────────────────────────────────────────────────
include(GNUInstallDirs)

set(RO_CONTROL_HELPER_INSTALL_PATH
"${CMAKE_INSTALL_FULL_LIBEXECDIR}/${RO_CONTROL_HELPER_NAME}"
)
set(RO_CONTROL_POLICY_BUILD_PATH
"${CMAKE_CURRENT_BINARY_DIR}/io.github.ProjectRoASD.rocontrol.policy"
)

# ─── Include Directories ──────────────────────────────────────────────────────
target_include_directories(ro-control PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src
Expand All @@ -191,6 +191,7 @@ target_include_directories(ro-control PRIVATE

target_compile_definitions(ro-control PRIVATE
RO_CONTROL_POLICY_ID="${RO_CONTROL_POLICY_ID}"
RO_CONTROL_APP_VERSION="${PROJECT_VERSION}"
)

configure_file(
Expand Down
2 changes: 1 addition & 1 deletion data/icons/io.github.projectroasd.rocontrol.metainfo.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
</categories>

<releases>
<release version="0.1.0" date="2026-03-06" />
<release version="0.2.0" date="2026-03-30" />
</releases>

<screenshots>
Expand Down
2 changes: 1 addition & 1 deletion docs/man/ro-control.1
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.TH RO-CONTROL 1 "March 2026" "ro-control 0.1.0" "User Commands"
.TH RO-CONTROL 1 "March 2026" "ro-control 0.2.0" "User Commands"
.SH NAME
ro-control \- NVIDIA driver management and diagnostics CLI
.SH SYNOPSIS
Expand Down
2 changes: 1 addition & 1 deletion packaging/rpm/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ macro explicitly:

```bash
rpmbuild -ba packaging/rpm/ro-control.spec \
--define "upstream_version 0.1.0"
--define "upstream_version 0.2.0"
```

If you build from a Git checkout instead of a published source archive, create
Expand Down
7 changes: 6 additions & 1 deletion packaging/rpm/ro-control.spec
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
%global upstream_version %{!?upstream_version:0.1.0}%{?upstream_version}
%global upstream_version %{!?upstream_version:0.2.0}%{?upstream_version}
%global debug_package %{nil}

Name: ro-control
Expand Down Expand Up @@ -76,6 +76,11 @@ tar -xzf %{SOURCE0} --strip-components=1
%{_datadir}/polkit-1/actions/io.github.ProjectRoASD.rocontrol.policy

%changelog
* Mon Mar 30 2026 ro-Control Maintainers <noreply@github.com> - 0.2.0-1
- Fix installed helper path resolution for privileged operations on system installs
- Activate saved KDE-friendly interface preferences and theme switching in the UI
- Harden Fedora CI and release validation for metadata and RPM packaging

* Sun Mar 22 2026 ro-Control Maintainers <noreply@github.com> - 0.1.0-1
- Prepare first GitHub Release RPMs for i686, x86_64, and aarch64
- Add explicit Fedora runtime command dependencies and recommendations
Expand Down
2 changes: 1 addition & 1 deletion src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ void configureGuiGraphicsEnvironment() {
int main(int argc, char *argv[]) {
constexpr auto kApplicationName = "ro-control";
constexpr auto kDisplayName = "ro-Control";
constexpr auto kApplicationVersion = "0.1.0";
constexpr auto kApplicationVersion = RO_CONTROL_APP_VERSION;
const QString applicationDescription =
QStringLiteral("ro-Control GPU driver manager and diagnostics CLI.");

Expand Down
48 changes: 45 additions & 3 deletions src/qml/Main.qml
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,53 @@ ApplicationWindow {
title: qsTr("ro-Control")
font.family: "Noto Sans"

readonly property string themeMode: "light"
readonly property bool darkMode: false
SystemPalette {
id: systemPalette
colorGroup: SystemPalette.Active
}

function isColorDark(colorValue) {
return ((0.2126 * colorValue.r) + (0.7152 * colorValue.g) + (0.0722 * colorValue.b)) < 0.5;
}

readonly property string themeMode: uiPreferences.themeMode
readonly property bool darkMode: themeMode === "dark"
|| (themeMode === "system" && root.isColorDark(systemPalette.window))
readonly property bool compactMode: uiPreferences.compactMode
readonly property bool showAdvancedInfo: uiPreferences.showAdvancedInfo
readonly property var theme: ({
readonly property var theme: darkMode ? ({
window: "#141922",
shell: "#10151d",
card: "#1b2330",
cardStrong: "#212b3a",
border: "#2c3748",
text: "#edf3ff",
textMuted: "#b2bdd1",
textSoft: "#8f9bb1",
accentA: "#7e90ff",
accentB: "#34c7a1",
accentC: "#ffbf47",
success: "#36c691",
warning: "#f2ae2d",
danger: "#f17575",
successBg: "#173529",
warningBg: "#3a2e12",
dangerBg: "#3d2024",
infoBg: "#1c2941",
sidebarBg: "#111722",
sidebarText: "#eef3ff",
sidebarMuted: "#95a3bb",
sidebarAccent: "#7e90ff",
sidebarActive: "#1d2940",
sidebarHover: "#182131",
sidebarBorder: "#253141",
sidebarHint: "#8898b0",
topbarBg: "#171e29",
topbarChip: "#222c3a",
topbarValue: "#eef3ff",
contentBg: "#121822",
contentGlow: "#182131"
}) : ({
window: "#f3f6fb",
shell: "#edf2f8",
card: "#ffffff",
Expand Down
15 changes: 10 additions & 5 deletions src/qml/pages/DriverPage.qml
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,7 @@ Item {
color: page.theme.card
border.width: 1
border.color: page.theme.border
opacity: page.backendBusy || !page.canInstallLatestRemoteDriver ? 0.7 : 1.0
implicitHeight: expressColumn.implicitHeight + 34

ColumnLayout {
Expand Down Expand Up @@ -311,9 +312,12 @@ Item {

Label {
Layout.fillWidth: true
text: "nvidia-" + page.recommendedVersion + " • "
+ (nvidiaDetector.gpuFound ? qsTr("Verified Compatible") : page.detectedHardwareLabel)
color: page.theme.success
text: page.canInstallLatestRemoteDriver
? "nvidia-" + page.recommendedVersion + " • " + qsTr("Verified Compatible")
: (page.remoteDriverCatalogAvailable
? qsTr("Compatible NVIDIA hardware not detected")
: qsTr("Scanning the Fedora repositories..."))
color: page.canInstallLatestRemoteDriver ? page.theme.success : page.theme.textMuted
font.pixelSize: 13
font.weight: Font.DemiBold
elide: Text.ElideRight
Expand All @@ -324,8 +328,8 @@ Item {

MouseArea {
anchors.fill: parent
cursorShape: page.backendBusy ? Qt.ArrowCursor : Qt.PointingHandCursor
enabled: !page.backendBusy
cursorShape: !enabled ? Qt.ArrowCursor : Qt.PointingHandCursor
enabled: !page.backendBusy && page.canInstallLatestRemoteDriver
onClicked: {
page.setOperationState(qsTr("Installer"), qsTr("Installing the proprietary NVIDIA driver (akmod-nvidia)..."), "info", true);
nvidiaInstaller.installProprietary(true);
Expand Down Expand Up @@ -425,6 +429,7 @@ Item {
Rectangle {
Layout.fillWidth: true
Layout.columnSpan: page.wideLayout ? 2 : 1
visible: page.showAdvancedInfo
radius: 26
color: Qt.tint(page.theme.warningBg, page.darkMode ? "#11ffffff" : "#22ffffff")
border.width: 1
Expand Down
2 changes: 2 additions & 0 deletions src/qml/pages/MonitorPage.qml
Original file line number Diff line number Diff line change
Expand Up @@ -243,13 +243,15 @@ Item {

Label {
text: qsTr("System Information")
visible: page.showAdvancedInfo
color: page.theme.text
font.pixelSize: 28
font.weight: Font.DemiBold
}

GridLayout {
Layout.fillWidth: true
visible: page.showAdvancedInfo
columns: 2
columnSpacing: 16
rowSpacing: 16
Expand Down
Loading
Loading