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
2 changes: 2 additions & 0 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[target.x86_64-unknown-linux-gnu]
rustflags = ["-C", "link-arg=-Wl,--gc-sections"]
6 changes: 3 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,11 @@ jobs:
- uses: Swatinem/rust-cache@v2

- name: Build release binary
env:
# fat LTO is memory-heavy; serialize codegen to avoid OOM on CI runners
CARGO_BUILD_JOBS: 1
run: cargo build --release --target ${{ matrix.target }}

- name: Strip binary
run: strip target/${{ matrix.target }}/release/${{ env.BINARY_NAME }}

- name: Rename artifact
run: |
cp target/${{ matrix.target }}/release/${{ env.BINARY_NAME }} \
Expand Down
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,14 @@
All notable changes to the `nmrs-gui` crate will be documented in this file.

## [Unreleased]

## [1.6.0] - 2026-05-20
### Added
- VPN management: list, connect, disconnect, and add WireGuard and OpenVPN profiles ([#21](https://github.com/networkmanager-rs/nmrs-gui/pull/21))

### Changed
- Header shows a connection-type icon and active network name (VPN, wired, Wi‑Fi, or disconnected) ([#21](https://github.com/networkmanager-rs/nmrs-gui/pull/21))
- Network scan progress uses a header spinner instead of "Scanning..." text ([#21](https://github.com/networkmanager-rs/nmrs-gui/pull/21))
- Use `Arc<Notify>` for monitor callbacks to satisfy `Send` bound ([#359](https://github.com/cachebag/nmrs/pull/359))

## [1.5.1] - 2026-04-10
Expand Down
10 changes: 5 additions & 5 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

59 changes: 22 additions & 37 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,54 +1,39 @@
[workspace]
resolver = "2"

[workspace.package]
[package]
name = "nmrs-gui"
version = "1.6.0"
authors = ["Akrm Al-Hakimi <alhakimiakrmj@gmail.com>"]
edition = "2024"
rust-version = "1.85.0"
description = "GTK4 GUI for managing NetworkManager connections"
license = "MIT"
repository = "https://github.com/networkmanager-rs/nmrs-gui"
keywords = ["networkmanager", "gui", "gtk", "linux"]
categories = ["gui"]
publish = true

[workspace.lints.rust]
[profile.release]
opt-level = 3
lto = "fat"
codegen-units = 1
incremental = false
panic = "abort"
strip = true

[lints.rust]
unused = { level = "warn", priority = -1 }

[workspace.lints.clippy]
[lints.clippy]
too_many_arguments = "allow"
type_complexity = "allow"

[workspace.dependencies]
nmrs = "3.0"
[dependencies]
nmrs = "3.1.5"
gtk = { version = "0.11.0", package = "gtk4" }
glib = "0.22"
dirs = "6.0.0"
fs2 = "0.4.3"
anyhow = "1.0.102"
clap = { version = "4.6.1", features = ["derive"] }
tokio = { version = "1.52.1", features = ["rt-multi-thread", "macros", "sync", "time"] }
tokio = { version = "1.52", features = ["rt-multi-thread", "macros", "sync", "time"] }
tokio-util = "0.7.18"
log = "0.4"

[package]
name = "nmrs-gui"
version = "1.5.1"
authors = ["Akrm Al-Hakimi <alhakimiakrmj@gmail.com>"]
edition.workspace = true
rust-version = "1.85.0"
description = "GTK4 GUI for managing NetworkManager connections"
license.workspace = true
repository.workspace = true
keywords = ["networkmanager", "gui", "gtk", "linux"]
categories = ["gui"]
publish = true

[lints]
workspace = true

[dependencies]
nmrs.workspace = true
gtk.workspace = true
glib.workspace = true
tokio.workspace = true
log.workspace = true
dirs.workspace = true
fs2.workspace = true
anyhow.workspace = true
clap.workspace = true
tokio-util.workspace = true
2 changes: 1 addition & 1 deletion package.nix
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ rustPlatform.buildRustPackage {

src = ./.;

cargoHash = "sha256-KuSq4fHazMTsXsFRMUKjtIF2rismBcNSv/cA5hr7Xn0=";
cargoHash = "sha256-tbR4zADI2JsiCAeEzubrhM20Rqy2M1mDD1hq80gEG9g=";

nativeBuildInputs = [
pkg-config
Expand Down
143 changes: 143 additions & 0 deletions src/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,42 @@ window {
color: var(--text-primary);
}

/* Global pointer cursor for interactive elements */
button,
switch,
.network-selection,
.vpn-add-row {
cursor: pointer;
}

/* Header */
headerbar {
background: var(--bg-secondary);
color: var(--text-primary);
border-bottom: 1px solid var(--border-color);
}

/* Connection status in header */
.conn-status-icon {
color: var(--text-secondary);
min-width: 16px;
min-height: 16px;
}
.conn-status-name {
color: var(--text-primary);
font-weight: 500;
font-size: 0.95em;
}
.conn-status-separator {
color: var(--text-tertiary);
margin: 0 2px;
}
.scan-spinner {
color: var(--text-secondary);
min-width: 14px;
min-height: 14px;
}

/* Switch */
switch {
background-color: var(--bg-tertiary);
Expand Down Expand Up @@ -312,3 +341,117 @@ popover row label {
opacity: 0.5;
}

/* VPN styles */
.vpn-section-header {
font-weight: 700;
font-size: 14px;
text-transform: uppercase;
color: var(--text-secondary);
letter-spacing: 0.8px;
opacity: 0.8;
}

.vpn-list {
background: var(--bg-primary);
margin-bottom: 4px;
}

.vpn-type-label {
font-size: 12px;
color: var(--text-tertiary);
margin-left: 4px;
opacity: 0.7;
}

.vpn-icon {
color: var(--accent-color);
opacity: 0.8;
margin-left: 6px;
}

.vpn-add-row {
opacity: 0.7;
}
.vpn-add-row:hover {
opacity: 1;
}

.vpn-add-icon {
color: var(--accent-color);
opacity: 0.8;
}

.vpn-add-label {
color: var(--text-secondary);
}

.vpn-action-btn {
padding: 6px 18px;
border-radius: 6px;
font-weight: 600;
}

.vpn-connect-btn {
background: var(--accent-color);
color: white;
padding: 6px 18px;
border-radius: 6px;
font-weight: 600;
}
.vpn-connect-btn:hover {
opacity: 0.9;
}

.vpn-disconnect-btn {
background: var(--error-color);
color: white;
padding: 6px 18px;
border-radius: 6px;
font-weight: 600;
}
.vpn-disconnect-btn:hover {
opacity: 0.9;
}

.vpn-entry {
background: var(--bg-secondary);
color: var(--text-primary);
border: 1px solid var(--border-color);
border-radius: 4px;
padding: 4px 8px;
margin-bottom: 4px;
}
.vpn-entry:focus {
border-color: var(--accent-color);
}

.vpn-tab-btn {
padding: 4px 14px;
border-radius: 4px;
background: var(--bg-tertiary);
color: var(--text-secondary);
font-weight: 600;
}
.vpn-tab-btn:hover {
background: var(--border-color-hover);
}
.vpn-tab-active {
background: var(--accent-color);
color: white;
}

.vpn-browse-btn {
background: var(--bg-tertiary);
color: var(--text-primary);
border-radius: 4px;
padding: 4px 12px;
}
.vpn-browse-btn:hover {
background: var(--border-color-hover);
}

.vpn-status-label {
color: var(--text-secondary);
font-size: 13px;
}

Loading