Warning: This project is no longer actively maintained. I am migrating away from Linux Mint, and this app was built specifically for that environment. No further updates or bug fixes are planned. Feel free to fork and continue development.
A Windows 11-style quick settings panel for Linux Mint / Cinnamon. Sits in the system tray and provides one-click access to WiFi, Bluetooth, volume, brightness, media controls, and more -- all in a borderless popup with the Catppuccin Mocha dark theme.
Screenshot placeholder -- replace with an actual capture of the panel.
- WiFi -- enable/disable wireless radio, shows connected SSID; chevron expands a full network list with signal strength, security indicators, and connect/disconnect buttons
- Bluetooth -- power on/off the adapter; chevron opens a paired device list with battery levels and connect/disconnect controls
- Hotspot -- toggle a pre-configured NetworkManager hotspot connection
- Night Light -- activate Redshift with a warm color temperature (4500 K default)
- Do Not Disturb -- suppress Cinnamon desktop notifications via D-Bus
- Airplane Mode -- composite toggle that disables both WiFi and Bluetooth, restoring their previous states when turned off
- Power Saver -- switch the CPU scaling governor between
schedutilandpowersave
- Volume -- controls the default PipeWire/WirePlumber audio sink (0--150%); click the icon to toggle mute; scroll the tray icon to adjust
- Brightness -- adjusts the backlight via sysfs (
intel_backlight), with abrightnessctlfallback for permission handling; hidden automatically on desktops without a backlight
- Now-playing card showing track title, artist, and player name
- Play/pause, next, and previous transport buttons via
playerctl - Integrates with Audio Router's active-player selection if present
- Percentage, charge state (Charging / Discharging / Full), and estimated time remaining
- Dynamic icon that reflects charge level and charging state
- Visual warning when battery drops below 20%
Quick-launch buttons for companion utilities: Audio Router, PowerPulse, Phosphor Display Manager, Bluetooth Manager, FreezeGuard, and Cinnamon Settings.
WiFi and Bluetooth tiles have a chevron arrow that slides open a full-screen detail view (animated Gtk.Stack slide transition):
- WiFi Detail -- toggle switch, scrollable network list with signal strength icons, security lock indicators, and connect/disconnect per network; link to Cinnamon Network Settings
- Bluetooth Detail -- toggle switch, sections for connected and paired devices with battery percentages, connect/disconnect per device; link to Cinnamon Bluetooth Settings
- Borderless popup window, positioned bottom-right above the taskbar on the active monitor
- Dismisses on focus loss or
Escapekey - Polls dynamic data (media, battery) every 5 seconds while visible
- Full state refresh on every open
| Dependency | Package (Debian/Ubuntu) | Purpose |
|---|---|---|
| Python 3.8+ | python3 |
Runtime |
| GTK 3 (PyGObject) | gir1.2-gtk-3.0, python3-gi |
UI framework |
| GLib / Gdk | (included with GTK) | Event loop, display |
| NetworkManager | network-manager |
WiFi control |
| nmcli | (included with network-manager) |
WiFi CLI |
| BlueZ | bluez |
Bluetooth stack |
| bluetoothctl | (included with bluez) |
Bluetooth CLI |
| PipeWire + WirePlumber | pipewire, wireplumber |
Audio |
| wpctl | (included with wireplumber) |
Audio CLI |
| playerctl | playerctl |
Media controls |
| Redshift | redshift |
Night light |
| UPower (GI bindings) | gir1.2-upowerglib-1.0 |
Battery info |
| Dependency | Package | Purpose |
|---|---|---|
| brightnessctl | brightnessctl |
Brightness fallback when sysfs write is not permitted |
| cpupower | linux-tools-common |
CPU governor change when direct sysfs write requires root |
# Copy the package
sudo cp -r /home/alaa/quick_settings /opt/quick-settings
# Create the launcher script
sudo tee /usr/local/bin/quick-settings > /dev/null << 'LAUNCHER'
#!/usr/bin/env python3
"""Quick Settings launcher."""
import sys
sys.path.insert(0, "/opt/quick-settings")
from quick_settings.__main__ import main
main()
LAUNCHER
sudo chmod +x /usr/local/bin/quick-settings
# Install the desktop entry
sudo tee /usr/share/applications/quick-settings.desktop > /dev/null << 'DESKTOP'
[Desktop Entry]
Type=Application
Name=Quick Settings
Comment=Windows 11-style quick settings panel
Exec=quick-settings
Icon=ayatana-settings
Categories=System;Settings;
StartupNotify=false
Terminal=false
Keywords=settings;quick;volume;wifi;bluetooth;brightness;
DESKTOP
# Enable autostart
mkdir -p ~/.config/autostart
cat > ~/.config/autostart/quick-settings.desktop << 'AUTOSTART'
[Desktop Entry]
Type=Application
Name=Quick Settings
Exec=quick-settings
Hidden=false
NoDisplay=true
X-GNOME-Autostart-enabled=true
AUTOSTARTsudo apt install python3-gi gir1.2-gtk-3.0 gir1.2-upowerglib-1.0 \
network-manager bluez pipewire wireplumber playerctl redshift brightnessctl# Run from terminal
quick-settings
# Run with debug logging
quick-settings --debug| Action | Behavior |
|---|---|
| Left-click tray icon | Toggle the quick settings popup |
| Right-click tray icon | Context menu (Quit) |
| Scroll up/down on tray icon | Adjust system volume by 5% per tick |
| Key | Action |
|---|---|
Escape |
Close the panel |
The panel also closes automatically when it loses focus (clicking anywhere outside).
Quick Settings has no configuration file. All settings are applied live through the toggle tiles and sliders. State is read directly from system backends on every panel open.
Brightness control targets /sys/class/backlight/intel_backlight. If your system uses a different backlight device (e.g., amdgpu_bl0), edit the DEVICE path in backends.py:
class BrightnessBackend:
DEVICE = Path("/sys/class/backlight/intel_backlight") # change thisThe Night Light toggle uses a fixed color temperature of 4500 K. To change it, modify the enable() method in the NightLightBackend class.
quick_settings/
├── __init__.py # Package marker
├── __main__.py # Entry point, argument parsing, GTK main loop bootstrap
├── app.py # QuickSettingsApp — initializes backends, panel, tray, polling
├── tray.py # TrayIcon — Gtk.StatusIcon with left-click/right-click/scroll
├── panel.py # PanelWindow — borderless popup, toggle grid, sliders, media, battery, app launchers
├── widgets.py # Custom widgets: ToggleTile, SliderWidget, MediaWidget, BatteryBar
├── detail_view.py # WiFiDetailView, BluetoothDetailView — slide-in detail panels
├── theme.py # Catppuccin Mocha CSS theme (all .qs-* prefixed selectors)
└── backends.py # System backends: WiFi, Bluetooth, Audio, Brightness, Battery,
# NightLight, Media, AirplaneMode, DND, PowerSaver, Hotspot
- Gtk.StatusIcon is used instead of AppIndicator because it provides native left-click (
activatesignal) for toggling the popup, right-click for context menus, and scroll events for volume -- none of which are available through AppIndicator's menu-only model. - Borderless popup is achieved with
Gdk.WindowTypeHint.POPUP_MENU,set_decorated(False), andset_keep_above(True). The panel auto-positions at the bottom-right of the monitor workarea. - Non-blocking backend calls -- all potentially slow operations (nmcli, bluetoothctl, mount) run in daemon threads. UI updates are marshalled back via
GLib.idle_add. - CSS scoping -- every CSS class is prefixed with
qs-to prevent collisions with the system GTK theme. CSS is generated from Python f-strings using the Catppuccin Mocha palette dictionary. - Gtk.Stack provides animated slide transitions between the main view and WiFi/Bluetooth detail views.
| Backend | CLI / API | Description |
|---|---|---|
WiFiBackend |
nmcli |
Enable/disable radio, list networks, connect/disconnect |
BluetoothBackend |
bluetoothctl |
Power on/off, list paired devices, connect/disconnect |
AudioBackend |
wpctl |
Get/set volume, mute/unmute (PipeWire default sink) |
BrightnessBackend |
sysfs / brightnessctl |
Read/write backlight percentage |
BatteryBackend |
UPowerGlib (GI) |
Battery percentage, charge state, time estimates |
NightLightBackend |
redshift |
Toggle warm color temperature |
MediaBackend |
playerctl |
Now-playing metadata, play/pause/next/previous |
AirplaneModeBackend |
(composite) | Disables WiFi + Bluetooth together |
DNDBackend |
dbus-send |
Toggle Cinnamon notification suppression |
PowerSaverBackend |
sysfs / cpupower |
Switch CPU scaling governor |
HotspotBackend |
nmcli |
Toggle a named "Hotspot" connection |
| Item | Path |
|---|---|
| Installed package | /opt/quick-settings/ |
| Launcher script | /usr/local/bin/quick-settings |
| Desktop entry | /usr/share/applications/quick-settings.desktop |
| Autostart entry | ~/.config/autostart/quick-settings.desktop |
| Source code | /home/alaa/quick_settings/ |
MIT License. See LICENSE for details.