diff --git a/Common/Colors.qml b/Common/Colors.qml index 02fef696..d05fa450 100644 --- a/Common/Colors.qml +++ b/Common/Colors.qml @@ -14,6 +14,8 @@ Singleton { readonly property string _homeUrl: StandardPaths.writableLocation(StandardPaths.HomeLocation) readonly property string homeDir: _homeUrl.startsWith("file://") ? _homeUrl.substring(7) : _homeUrl + readonly property string _configUrl: StandardPaths.writableLocation(StandardPaths.ConfigLocation) + readonly property string configDir: _configUrl.startsWith("file://") ? _configUrl.substring(7) : _configUrl readonly property string shellDir: Qt.resolvedUrl(".").toString().replace("file://", "").replace("/Common/", "") readonly property string wallpaperPath: Prefs.wallpaperPath property bool matugenAvailable: false @@ -301,7 +303,7 @@ palette = 15=${fg_b}`; console.log("Qt theming enabled:", qtTheming); systemThemeGenerationInProgress = true; - systemThemeGenerator.command = [shellDir + "/generate-themes.sh", wallpaperPath, shellDir, homeDir, "generate", isLight, iconTheme, gtkTheming, qtTheming]; + systemThemeGenerator.command = [shellDir + "/generate-themes.sh", wallpaperPath, shellDir, configDir, "generate", isLight, iconTheme, gtkTheming, qtTheming]; systemThemeGenerator.running = true; } @@ -335,7 +337,7 @@ palette = 15=${fg_b}`; console.log("GTK theming enabled:", gtkTheming); console.log("Qt theming enabled:", qtTheming); - systemThemeRestoreProcess.command = [shellDir + "/generate-themes.sh", "", shellDir, homeDir, "restore", isLight, iconTheme, gtkTheming, qtTheming]; + systemThemeRestoreProcess.command = [shellDir + "/generate-themes.sh", "", shellDir, configDir, "restore", isLight, iconTheme, gtkTheming, qtTheming]; systemThemeRestoreProcess.running = true; } @@ -365,7 +367,7 @@ palette = 15=${fg_b}`; Process { id: gtkAvailabilityChecker - command: ["bash", "-c", "command -v gsettings >/dev/null && [ -d ~/.config/gtk-3.0 -o -d ~/.config/gtk-4.0 ]"] + command: ["bash", "-c", "command -v gsettings >/dev/null && [ -d " + configDir + "/gtk-3.0 -o -d " + configDir + "/gtk-4.0 ]"] running: false onExited: (exitCode) => { gtkThemingEnabled = (exitCode === 0); @@ -406,10 +408,6 @@ palette = 15=${fg_b}`; if (exitCode === 0) { console.log("System themes generated successfully"); console.log("stdout:", systemThemeStdout.text); - - // GTK theme application is now handled by the simplified generate-themes.sh script - - ToastService.showInfo("System themes updated successfully"); } else { console.error("System theme generation failed, exit code:", exitCode); console.error("stdout:", systemThemeStdout.text); diff --git a/Common/Prefs.qml b/Common/Prefs.qml index 9a740d17..2647d48e 100644 --- a/Common/Prefs.qml +++ b/Common/Prefs.qml @@ -59,6 +59,8 @@ Singleton { readonly property string defaultMonoFontFamily: "Fira Code" readonly property string _homeUrl: StandardPaths.writableLocation(StandardPaths.HomeLocation) + readonly property string _configUrl: StandardPaths.writableLocation(StandardPaths.ConfigLocation) + readonly property string _configDir: _configUrl.startsWith("file://") ? _configUrl.substring(7) : _configUrl Timer { id: fontCheckTimer @@ -433,10 +435,10 @@ Singleton { "fi\n" + "\n" + "# Ensure config directories exist\n" + - "mkdir -p ~/.config/gtk-3.0 ~/.config/gtk-4.0\n" + + "mkdir -p " + _configDir + "/gtk-3.0 " + _configDir + "/gtk-4.0\n" + "\n" + "# Update settings.ini files (keep existing gtk-theme-name)\n" + - "for config_dir in ~/.config/gtk-3.0 ~/.config/gtk-4.0; do\n" + + "for config_dir in " + _configDir + "/gtk-3.0 " + _configDir + "/gtk-4.0; do\n" + " settings_file=\"$config_dir/settings.ini\"\n" + " if [ -f \"$settings_file\" ]; then\n" + " # Update existing icon-theme-name line or add it\n" + @@ -485,9 +487,9 @@ Singleton { " ' \"$config_file\" > \"$config_file.tmp\" && mv \"$config_file.tmp\" \"$config_file\"\n" + " fi\n" + "}\n" + - "remove_icon_theme " + home + "/.config/qt5ct/qt5ct.conf\n" + - "remove_icon_theme " + home + "/.config/qt6ct/qt6ct.conf\n" + - "rm -f " + home + "/.config/environment.d/95-qtct.conf 2>/dev/null || true\n" + + "remove_icon_theme " + _configDir + "/qt5ct/qt5ct.conf\n" + + "remove_icon_theme " + _configDir + "/qt6ct/qt6ct.conf\n" + + "rm -f " + _configDir + "/environment.d/95-qtct.conf 2>/dev/null || true\n" + "systemctl --user import-environment --unset=QT_QPA_PLATFORMTHEME --unset=QT_QPA_PLATFORMTHEME_QT6 2>/dev/null || true\n" + "dbus-update-activation-environment --systemd QT_QPA_PLATFORMTHEME= QT_QPA_PLATFORMTHEME_QT6= 2>/dev/null || true\n" + "rm -rf " + home + "/.cache/icon-cache " + home + "/.cache/thumbnails 2>/dev/null || true\n"; @@ -497,7 +499,7 @@ Singleton { } var script = - "mkdir -p " + home + "/.config/qt5ct " + home + "/.config/qt6ct " + home + "/.config/environment.d 2>/dev/null || true\n" + + "mkdir -p " + _configDir + "/qt5ct " + _configDir + "/qt6ct " + _configDir + "/environment.d 2>/dev/null || true\n" + "update_qt_config() {\n" + " local config_file=\"$1\"\n" + " local theme_name=\"$2\"\n" + @@ -528,15 +530,15 @@ Singleton { " printf '[Appearance]\\nicon_theme=%s\\n' \"$theme_name\" > \"$config_file\"\n" + " fi\n" + "}\n" + - "update_qt_config " + home + "/.config/qt5ct/qt5ct.conf " + _shq(qtThemeName) + "\n" + - "update_qt_config " + home + "/.config/qt6ct/qt6ct.conf " + _shq(qtThemeName) + "\n" + + "update_qt_config " + _configDir + "/qt5ct/qt5ct.conf " + _shq(qtThemeName) + "\n" + + "update_qt_config " + _configDir + "/qt6ct/qt6ct.conf " + _shq(qtThemeName) + "\n" + "if command -v qt5ct >/dev/null 2>&1; then\n" + - " printf 'QT_QPA_PLATFORMTHEME=qt5ct\\n' > " + home + "/.config/environment.d/95-qtct.conf\n" + + " printf 'QT_QPA_PLATFORMTHEME=qt5ct\\n' > " + _configDir + "/environment.d/95-qtct.conf\n" + " if command -v qt6ct >/dev/null 2>&1; then\n" + - " printf 'QT_QPA_PLATFORMTHEME_QT6=qt6ct\\n' >> " + home + "/.config/environment.d/95-qtct.conf\n" + + " printf 'QT_QPA_PLATFORMTHEME_QT6=qt6ct\\n' >> " + _configDir + "/environment.d/95-qtct.conf\n" + " fi\n" + "else\n" + - " rm -f " + home + "/.config/environment.d/95-qtct.conf 2>/dev/null || true\n" + + " rm -f " + _configDir + "/environment.d/95-qtct.conf 2>/dev/null || true\n" + "fi\n" + "systemctl --user import-environment QT_QPA_PLATFORMTHEME QT_QPA_PLATFORMTHEME_QT6 2>/dev/null || true\n" + "dbus-update-activation-environment --systemd QT_QPA_PLATFORMTHEME QT_QPA_PLATFORMTHEME_QT6 2>/dev/null || true\n" + diff --git a/Modules/Settings/LauncherTab.qml b/Modules/Settings/LauncherTab.qml index 6f4159f8..2fde6531 100644 --- a/Modules/Settings/LauncherTab.qml +++ b/Modules/Settings/LauncherTab.qml @@ -7,7 +7,6 @@ import qs.Widgets ScrollView { id: launcherTab - contentWidth: availableWidth contentHeight: column.implicitHeight + Theme.spacingXL clip: true diff --git a/Modules/Settings/PersonalizationTab.qml b/Modules/Settings/PersonalizationTab.qml index 17d94d53..312338a1 100644 --- a/Modules/Settings/PersonalizationTab.qml +++ b/Modules/Settings/PersonalizationTab.qml @@ -13,7 +13,6 @@ ScrollView { property alias profileBrowser: profileBrowserLoader.item property alias wallpaperBrowser: wallpaperBrowserLoader.item - contentWidth: availableWidth contentHeight: column.implicitHeight clip: true diff --git a/Modules/Settings/TimeWeatherTab.qml b/Modules/Settings/TimeWeatherTab.qml index 1f53b8b8..49408633 100644 --- a/Modules/Settings/TimeWeatherTab.qml +++ b/Modules/Settings/TimeWeatherTab.qml @@ -6,7 +6,6 @@ import qs.Widgets ScrollView { id: timeWeatherTab - contentWidth: availableWidth contentHeight: column.implicitHeight clip: true diff --git a/Modules/Settings/WidgetsTab.qml b/Modules/Settings/WidgetsTab.qml index 59c667fe..d493c2c6 100644 --- a/Modules/Settings/WidgetsTab.qml +++ b/Modules/Settings/WidgetsTab.qml @@ -6,7 +6,6 @@ import qs.Widgets ScrollView { id: widgetsTab - contentWidth: availableWidth contentHeight: column.implicitHeight + Theme.spacingXL clip: true diff --git a/README.md b/README.md index cc52a862..460310c6 100644 --- a/README.md +++ b/README.md @@ -1,250 +1,337 @@ -# DankMaterialShell (Quickshell) +# DankMaterialShell -A [Quickshell](https://quickshell.org/) built shell designed to be highly functional, in Material 3 style. +A [Quickshell](https://quickshell.org/)-based desktop shell with Material 3 design principles, built for functionality and modern aesthetics. -Specifically created for [niri](https://github.com/YaLTeR/niri). +Specifically optimized for the [niri](https://github.com/YaLTeR/niri) compositor, but compatible with other Wayland compositors. - +## Table of Contents + +- [Features](#features) +- [Requirements](#requirements) +- [Installation](#installation) + - [Core Dependencies](#core-dependencies) + - [Optional Dependencies](#optional-dependencies) + - [Shell Installation](#shell-installation) +- [Configuration](#configuration) + - [Theme Configuration](#theme-configuration) + - [App Theming Setup](#app-theming-setup) +- [Usage](#usage) + - [Basic Controls](#basic-controls) + - [IPC Commands](#ipc-commands) +- [Calendar Integration](#calendar-integration) +- [Troubleshooting](#troubleshooting) + +## Features + +- **Material 3 Design**: Modern, clean interface following Google's latest design language +- **Dynamic Theming**: Automatic color extraction from wallpapers using matugen +- **System Integration**: Built-in audio controls, brightness management, and media controls +- **Application Launcher**: Spotlight-style launcher for quick app access +- **Clipboard History**: Visual clipboard manager with search functionality +- **Process Manager**: Built-in task manager for system monitoring +- **Notification Center**: Centralized notification management +- **Calendar Support**: Integration with various calendar services +- **Lockscreen**: Secure screen locking functionality + +## Requirements + +**Base Requirements:** +- Wayland compositor (niri recommended) +- NetworkManager (for WiFi functionality) +- Material Symbols font +- Inter and Fira Code fonts (recommended) + +**Distribution Support:** +- Compatible with any Linux distribution +- Installation examples provided for Arch Linux and Fedora ## Installation -1. Install required dependencies +### Core Dependencies -This shell was primarily built for [niri](https://github.com/YaLTeR/niri), but only for workspaces and the active window widget in TopBar. So it could be used on any other wayland compositor with minimal changes. +#### Material Symbols Font +**Manual Installation:** ```bash -# 1 --- Material Symbols Font (if not present) -mkdir -p ~/.local/share/fonts && curl -L "https://github.com/google/material-design-icons/raw/master/variablefont/MaterialSymbolsRounded%5BFILL%2CGRAD%2Copsz%2Cwght%5D.ttf" -o ~/.local/share/fonts/MaterialSymbolsRounded.ttf && fc-cache -f -# Arch: paru -S ttf-material-symbols-variable-git -# Fedora: Use manual installation (Fedora packages contain legacy Material Icons, not Material Symbols) +mkdir -p ~/.local/share/fonts +curl -L "https://github.com/google/material-design-icons/raw/master/variablefont/MaterialSymbolsRounded%5BFILL%2CGRAD%2Copsz%2Cwght%5D.ttf" -o ~/.local/share/fonts/MaterialSymbolsRounded.ttf +fc-cache -f +``` -# 2 --- Inter Variable (recommended font) -mkdir -p ~/.local/share/fonts && curl -L "https://github.com/rsms/inter/releases/download/v4.0/Inter-4.0.zip" -o /tmp/Inter.zip && unzip -j /tmp/Inter.zip "InterVariable.ttf" "InterVariable-Italic.ttf" -d ~/.local/share/fonts/ && rm /tmp/Inter.zip && fc-cache -f -# Arch: pacman -S inter-font -# Fedora: sudo dnf install rsms-inter-fonts - -# 3 --- Fira Code (recommended monospace font) -mkdir -p ~/.local/share/fonts && curl -L "https://github.com/tonsky/FiraCode/releases/download/6.2/Fira_Code_v6.2.zip" -o /tmp/FiraCode.zip && unzip -j /tmp/FiraCode.zip "ttf/*.ttf" -d ~/.local/share/fonts/ && rm /tmp/FiraCode.zip && fc-cache -f -# Arch: pacman -S ttf-fira-code -# Fedora: sudo dnf install fira-code-fonts - -# 4 --- QuickShell (recommended to use a git build) -# Arch -paru -S quickshell-git +**Package Installation:** +```bash +# Arch Linux +paru -S ttf-material-symbols-variable-git # Fedora +# Use manual installation - Fedora packages contain legacy Material Icons +``` + +#### Typography + +**Inter Variable Font:** +```bash +# Manual +mkdir -p ~/.local/share/fonts +curl -L "https://github.com/rsms/inter/releases/download/v4.0/Inter-4.0.zip" -o /tmp/Inter.zip +unzip -j /tmp/Inter.zip "InterVariable.ttf" "InterVariable-Italic.ttf" -d ~/.local/share/fonts/ +rm /tmp/Inter.zip && fc-cache -f + +# Package managers +# Arch: pacman -S inter-font +# Fedora: sudo dnf install rsms-inter-fonts +``` + +**Fira Code Font:** +```bash +# Manual +mkdir -p ~/.local/share/fonts +curl -L "https://github.com/tonsky/FiraCode/releases/download/6.2/Fira_Code_v6.2.zip" -o /tmp/FiraCode.zip +unzip -j /tmp/FiraCode.zip "ttf/*.ttf" -d ~/.local/share/fonts/ +rm /tmp/FiraCode.zip && fc-cache -f + +# Package managers +# Arch: pacman -S ttf-fira-code +# Fedora: sudo dnf install fira-code-fonts +``` + +#### Quickshell + +**Arch Linux:** +```bash +paru -S quickshell-git +``` + +**Fedora:** +```bash sudo dnf copr enable errornointernet/quickshell sudo dnf install quickshell -# or +# or for git version sudo dnf install quickshell-git ``` -2. Install optional dependencies to unlock certain features +### Optional Dependencies -| Dependency | Purpose | If Missing | -|------------|---------|------------| -| matugen | Allows dynamic themes based on wallpaper and system app theming | Just can choose from preconfigured themes instead of dynamic colors | -| ddcutil | Allows controlling brightness of external monitors via DDC/CI | No external monitor brightness control | -| brightnessctl | Allows controlling brightness of laptop displays via backlight | No laptop display brightness control | -| wl-clipboard | Unlocks copy functionality of certain elements, such as process PIDs | No copy | -| qt5ct + qt6ct | Icon theme and Qt app theming | Setting icon theme in settings won't work for QT5 or QT6 applications, no Qt theming | -| gsettings | GTK theme management | No GTK theming | +| Component | Purpose | Missing Functionality | +|-----------|---------|----------------------| +| matugen | Dynamic wallpaper-based theming | Limited to preconfigured themes | +| ddcutil | External monitor brightness control | No DDC/CI brightness control | +| brightnessctl | Laptop display brightness control | No backlight control | +| wl-clipboard | Copy functionality for PIDs and other elements | No clipboard operations | +| qt5ct + qt6ct | Qt application theming | No Qt theme integration | +| gsettings | GTK application theming | No GTK theme integration | +#### Installation by Distribution + +**Arch Linux:** ```bash -# Arch -# Core dependencies -pacman -S inter-font ttf-fira-code cava wl-clipboard cliphist -paru -S ttf-material-symbols-variable-git # AUR package +# Core optional packages +pacman -S cava wl-clipboard cliphist ddcutil brightnessctl gsettings-desktop-schemas qt5ct qt6ct -# Optional: Brightness control -pacman -S ddcutil # For external monitors -pacman -S brightnessctl # For laptop displays - -# Optional: App theming (only if you use GTK/Qt applications) -pacman -S qt5ct qt6ct gsettings-desktop-schemas - -# Third-party packages (AUR) +# AUR packages paru -S matugen +``` -# Fedora -# Core dependencies -sudo dnf install cava wl-clipboard +**Fedora:** +```bash +# Core packages +sudo dnf install cava wl-clipboard ddcutil brightnessctl gsettings-desktop-schemas qt5ct qt6ct -# COPR packages (core dependencies from third-party repositories) +# COPR repositories sudo dnf copr enable wef/cliphist && sudo dnf install cliphist - -# Optional: Brightness control -sudo dnf install ddcutil # For external monitors -sudo dnf install brightnessctl # For laptop displays - -# Optional: App theming (only if you use GTK/Qt applications) -sudo dnf install theme qt5ct qt6ct gsettings-desktop-schemas - -# Optional third-party packages (COPR repositories) sudo dnf copr enable heus-sueh/packages && sudo dnf install matugen ``` -**Note on networking:** This shell requires NetworkManager for WiFi functionality. +### Shell Installation -**Note on system app theming:** DankMaterialShell can automatically theme GTK and Qt applications to match your dynamic wallpaper colors. This requires: -- For GTK apps: A compatible theme and `gsettings`, a compatible theme is one that respects standard color definitions - e.g. [Colloid](https://github.com/vinceliuice/Colloid-gtk-theme). -- For Qt apps: `qt5ct` and/or `qt6ct` +1. **Create configuration directory:** + ```bash + mkdir -p ~/.config/quickshell + ``` -**Recommended GTK base theme:** Use [Colloid](https://github.com/vinceliuice/Colloid-gtk-theme). Install with your preferences, e.g. `./install.sh -s standard -l --tweaks normal`. Configure in `~/.config/gtk-3.0/settings.ini` and `~/.config/gtk-4.0/settings.ini` and set Colloid as the theme: +2. **Clone the repository:** + ```bash + git clone https://github.com/bbedward/DankMaterialShell.git ~/.config/quickshell/DankMaterialShell + ``` + +3. **Launch the shell:** + ```bash + qs -c DankMaterialShell + ``` + +## Configuration + +### Theme Configuration + +#### GTK Applications + +Install a compatible theme like [Colloid](https://github.com/vinceliuice/Colloid-gtk-theme): + +```bash +# Install Colloid theme +./install.sh -s standard -l --tweaks normal ``` + +Configure in `~/.config/gtk-3.0/settings.ini` and `~/.config/gtk-4.0/settings.ini`: +```ini [Settings] gtk-theme-name=Colloid ``` -**Recommended QT base them:** Breeze is recommended, on arch it can be installed with `pacman -S breeze breeze5` and then in `~/.confg/qt6ct/qt6ct.conf` and `~/.confg/qt5ct/qt5ct.conf` set the following: +#### Qt Applications + +**Install Breeze theme:** +```bash +# Arch +pacman -S breeze breeze5 ``` + +**Configure Qt5 and Qt6:** + +In `~/.config/qt5ct/qt5ct.conf` and `~/.config/qt6ct/qt6ct.conf`: +```ini [Appearance] style=Breeze ``` -Enable these features in Settings → Appearance → System App Theming after installing the dependencies. +#### KDE Applications -3. Install DankMaterialShell - -``` -mkdir -p ~/.config/quickshell -git clone https://github.com/bbedward/DankMaterialShell.git ~/.config/quickshell/DankMaterialShell +Create `~/.config/kdeglobals`: +```ini +[UiSettings] +ColorScheme=qt6ct ``` -4. Enable +### App Theming Setup -``` -qs -c DankMaterialShell +Enable system app theming in **Settings → Appearance → System App Theming** after installing the required dependencies. -# In niri config -spawn-at-startup "qs" "-c" "DankMaterialShell" +## Usage -# Optionally at bindings for spotlight launcher and clipboard history -Mod+Space hotkey-overlay-title="Run an Application: Spotlight" { spawn "qs" "-c" "DankMaterialShell" "ipc" "call" "spotlight" "toggle"; } -Mod+V hotkey-overlay-title="Open Clipboard History" { spawn "qs" "-c" "DankMaterialShell" "ipc" "call" "clipboard" "toggle"; } -``` +### Basic Controls -# Available IPC Events +#### Niri Configuration -IPC Events are events that can be triggered with `qs` cli. +Add to your niri configuration: ```bash -qs -c DankMaterialShell ipc call +# Auto-start +spawn-at-startup "qs" "-c" "DankMaterialShell" + +# Key bindings +Mod+Space hotkey-overlay-title="Run an Application: Spotlight" { + spawn "qs" "-c" "DankMaterialShell" "ipc" "call" "spotlight" "toggle"; +} + +Mod+V hotkey-overlay-title="Open Clipboard History" { + spawn "qs" "-c" "DankMaterialShell" "ipc" "call" "clipboard" "toggle"; +} ``` -## System Controls +### IPC Commands -| Target | Function | Parameters | Description | -|--------|----------|------------|-------------| -| audio | setvolume | percentage (string) | Set audio volume to specific percentage (0-100) | -| audio | increment | step (string, default: "5") | Increase volume by step percentage | -| audio | decrement | step (string, default: "5") | Decrease volume by step percentage | -| audio | mute | none | Toggle audio mute | -| audio | setmic | percentage (string) | Set microphone volume to specific percentage | -| audio | micmute | none | Toggle microphone mute | -| audio | status | none | Get current audio status (output/input levels and mute states) | - -## Application Controls - -| Target | Function | Parameters | Description | -|--------|----------|------------|-------------| -| spotlight | open | none | Open spotlight (app launcher) | -| spotlight | close | none | Close spotlight (app launcher) | -| spotlight | toggle | none | Toggle spotlight (app launcher) | -| clipboard | open | none | Open clipboard history view | -| clipboard | close | none | Close clipboard history view | -| clipboard | toggle | none | Toggle clipboard history view | -| processlist | open | none | Open process list (task manager) | -| processlist | close | none | Close process list (task manager) | -| processlist | toggle | none | Toggle process list (task manager) | -| lock | lock | none | Activate lockscreen | -| lock | demo | none | Show lockscreen in demo mode | -| lock | isLocked | none | Returns whether screen is currently locked | - -## Media Controls - -| Target | Function | Parameters | Description | -|--------|----------|------------|-------------| -| mpris | list | none | Get list of available media players | -| mpris | play | none | Start media playback on active player | -| mpris | pause | none | Pause media playback on active player | -| mpris | playPause | none | Toggle play/pause state on active player | -| mpris | previous | none | Skip to previous track on active player | -| mpris | next | none | Skip to next track on active player | -| mpris | stop | none | Stop media playback on active player | - -## System Services - -| Target | Function | Parameters | Description | -|--------|----------|------------|-------------| -| wallpaper | get | none | Get current wallpaper path | -| wallpaper | set | path (string) | Set wallpaper to image path and refresh theme | -| wallpaper | clear | none | Clear current wallpaper | -| theme | get | none | Get current theme mode (light/dark) | -| theme | toggle | none | Toggle between light and dark mode | -| theme | light | none | Set theme to light mode | -| theme | dark | none | Set theme to dark mode | -| notifs | clear | none | Clear all notifications | - - -## (Optional) Setup Calendar events (Google, Microsoft, other Caldev, etc.) - -1. Install [khal](https://github.com/pimutils/khal), [vdirsyncer](https://github.com/pimutils/vdirsyncer), and `aiohttp-oauthlib` +The shell provides extensive IPC (Inter-Process Communication) functionality: +```bash +qs -c DankMaterialShell ipc call [parameters] ``` -# Arch + +#### Audio Controls + +| Command | Function | +|---------|----------| +| `audio setvolume 50` | Set volume to 50% | +| `audio increment 10` | Increase volume by 10% | +| `audio decrement 5` | Decrease volume by 5% | +| `audio mute` | Toggle audio mute | +| `audio setmic 75` | Set microphone to 75% | +| `audio micmute` | Toggle microphone mute | +| `audio status` | Get current audio status | + +#### Application Controls + +| Command | Function | +|---------|----------| +| `spotlight toggle` | Toggle application launcher | +| `clipboard toggle` | Toggle clipboard history | +| `processlist toggle` | Toggle process manager | +| `lock lock` | Activate lockscreen | + +#### Media Controls + +| Command | Function | +|---------|----------| +| `mpris list` | List available media players | +| `mpris playPause` | Toggle play/pause | +| `mpris next` | Next track | +| `mpris previous` | Previous track | + +#### System Services + +| Command | Function | +|---------|----------| +| `wallpaper set /path/to/image.jpg` | Set wallpaper and refresh theme | +| `theme toggle` | Toggle light/dark mode | +| `notifs clear` | Clear all notifications | + +## Calendar Integration + +### Prerequisites + +Install required packages: + +```bash +# Arch Linux pacman -S vdirsyncer khal python-aiohttp-oauthlib # Fedora sudo dnf install python3-vdirsyncer khal python3-aiohttp-oauthlib ``` -2. Configure vdirsyncer +### Configuration -Follow the [documentation](https://vdirsyncer.pimutils.org/en/stable/config.html), you will have different steps depending on which calendars you want to sync with. +1. **Create vdirsyncer directory:** + ```bash + mkdir -p ~/.vdirsyncer + ``` -``` -mkdir -p ~/.vdirsyncer +2. **Configure calendar sync** in `~/.vdirsyncer/config`: + ```ini + [general] + status_path = "~/.calendars/status" -# Create ~/.vdirsyncer/config (a single google calendar would look like) -[general] -status_path = "~/.calendars/status" + [pair personal_sync] + a = "personal" + b = "personallocal" + collections = ["from a", "from b"] + conflict_resolution = "a wins" + metadata = ["color"] -[pair personal_sync] -a = "personal" -b = "personallocal" -collections = ["from a", "from b"] -conflict_resolution = "a wins" -metadata = ["color"] + [storage personal] + type = "google_calendar" + token_file = "~/.vdirsyncer/google_calendar_token" + client_id = "your_client_id" + client_secret = "your_client_secret" -[storage personal] -type = "google_calendar" -token_file = "~/.vdirsyncer/google_calendar_token" -client_id = "...." -client_secret = "...." + [storage personallocal] + type = "filesystem" + path = "~/.calendars/Personal" + fileext = ".ics" + ``` -[storage personallocal] -type = "filesystem" -path = "~/.calendars/Personal" -fileext = ".ics" +3. **Initial sync:** + ```bash + vdirsyncer sync + ``` -# Sync -vdirsyncer sync - -# Create crontab -crontab -e -# e.g., this syncs every 5 minutes -*/5 * * * * /usr/bin/vdirsyncer sync -``` - -3. Configure khal - -``` -# Run this -khal configure - -# Choose option 2 for month/day/year -# Time format, doesnt matter -# Choose option 1 for use calendar already on this computer -``` +4. **Configure automatic sync:** + ```bash + crontab -e + # Add: */5 * * * * /usr/bin/vdirsyncer sync + ``` +5. **Configure khal:** + ```bash + khal configure + # Follow the interactive setup + ``` \ No newline at end of file diff --git a/generate-themes.sh b/generate-themes.sh index ef68bb5b..1e0fb2ab 100755 --- a/generate-themes.sh +++ b/generate-themes.sh @@ -5,15 +5,15 @@ WALLPAPER_PATH="$1" SHELL_DIR="$2" -HOME_DIR="$3" +CONFIG_DIR="$3" # Config directory (typically ~/.config) MODE="$4" # "generate" or "restore" IS_LIGHT="$5" # "true" for light mode, "false" for dark mode ICON_THEME="$6" # Icon theme name GTK_THEMING="$7" # "true" to enable GTK theming, "false" to disable QT_THEMING="$8" # "true" to enable Qt theming, "false" to disable -if [ -z "$SHELL_DIR" ] || [ -z "$HOME_DIR" ]; then - echo "Usage: $0 [mode] [is_light] [icon_theme] [gtk_theming] [qt_theming]" >&2 +if [ -z "$SHELL_DIR" ] || [ -z "$CONFIG_DIR" ]; then + echo "Usage: $0 [mode] [is_light] [icon_theme] [gtk_theming] [qt_theming]" >&2 echo " For restore mode, wallpaper_path can be empty" >&2 exit 1 fi @@ -55,13 +55,13 @@ update_theme_settings() { } update_gtk_css() { - local home_dir="$1" - local import_line="@import url(\"$home_dir/.config/gtk-4.0/dank-colors.css\");" + local config_dir="$1" + local import_line="@import url(\"$config_dir/gtk-4.0/dank-colors.css\");" echo "Updating GTK CSS imports..." # Update GTK-4.0 - local gtk4_css="$home_dir/.config/gtk-4.0/gtk.css" + local gtk4_css="$config_dir/gtk-4.0/gtk.css" if [ -f "$gtk4_css" ]; then # Remove existing import if present sed -i '/^@import url.*dank-colors\.css.*);$/d' "$gtk4_css" @@ -74,8 +74,8 @@ update_gtk_css() { echo "Updated GTK-4.0 CSS import" # Update GTK-3.0 with its own path - local gtk3_import="@import url(\"$home_dir/.config/gtk-3.0/dank-colors.css\");" - local gtk3_css="$home_dir/.config/gtk-3.0/gtk.css" + local gtk3_import="@import url(\"$config_dir/gtk-3.0/dank-colors.css\");" + local gtk3_css="$config_dir/gtk-3.0/gtk.css" if [ -f "$gtk3_css" ]; then # Remove existing import if present sed -i '/^@import url.*dank-colors\.css.*);$/d' "$gtk3_css" @@ -89,8 +89,7 @@ update_gtk_css() { } update_qt_config() { - local home_dir="$1" - local username=$(basename "$home_dir") + local config_dir="$1" echo "Updating Qt configuration..." @@ -98,46 +97,69 @@ update_qt_config() { update_qt_color_config() { local config_file="$1" local version="$2" - local color_scheme_path="$home_dir/.config/qt${version}ct/colors/matugen.conf" + local color_scheme_path="$config_dir/qt${version}ct/colors/matugen.conf" if [ -f "$config_file" ]; then - # Update existing config with awk - properly handle existing [Appearance] section - awk -v scheme_path="$color_scheme_path" ' - BEGIN { in_appearance = 0; custom_palette_set = 0; color_scheme_set = 0 } - /^\[Appearance\]/ { - in_appearance = 1; - print; - next - } - /^\[/ && !/^\[Appearance\]/ { - # End of [Appearance] section - add missing settings before next section - if (in_appearance) { - if (!custom_palette_set) { print "custom_palette=true" } - if (!color_scheme_set) { print "color_scheme_path=" scheme_path } - } - in_appearance = 0; - print; - next - } - in_appearance && /^custom_palette=/ { - print "custom_palette=true" - custom_palette_set = 1 - next - } - in_appearance && /^color_scheme_path=/ { - print "color_scheme_path=" scheme_path - color_scheme_set = 1 - next - } - { print } - END { - # Handle case where [Appearance] is the last section - if (in_appearance) { - if (!custom_palette_set) print "custom_palette=true" - if (!color_scheme_set) print "color_scheme_path=" scheme_path - } - } - ' "$config_file" > "$config_file.tmp" && mv "$config_file.tmp" "$config_file" + # Read the entire file and carefully update only what we need + python3 -c " +import sys +import re + +config_file = '$config_file' +color_scheme_path = '$color_scheme_path' + +try: + with open(config_file, 'r') as f: + content = f.read() + + lines = content.split('\n') + result = [] + in_appearance = False + custom_palette_found = False + color_scheme_found = False + + for line in lines: + stripped = line.strip() + + if stripped == '[Appearance]': + in_appearance = True + result.append(line) + elif stripped.startswith('[') and stripped != '[Appearance]': + # End of [Appearance] section, add missing settings if needed + if in_appearance: + if not custom_palette_found: + result.append('custom_palette=true') + if not color_scheme_found: + result.append('color_scheme_path=' + color_scheme_path) + in_appearance = False + result.append(line) + elif in_appearance and stripped.startswith('custom_palette='): + custom_palette_found = True + result.append('custom_palette=true') + elif in_appearance and stripped.startswith('color_scheme_path='): + color_scheme_found = True + result.append('color_scheme_path=' + color_scheme_path) + else: + result.append(line) + + # Handle case where [Appearance] is the last section + if in_appearance: + if not custom_palette_found: + result.append('custom_palette=true') + if not color_scheme_found: + result.append('color_scheme_path=' + color_scheme_path) + + # If no [Appearance] section exists, create one + if not any('[Appearance]' in line for line in lines): + result.extend(['', '[Appearance]', 'custom_palette=true', 'color_scheme_path=' + color_scheme_path]) + + with open(config_file, 'w') as f: + f.write('\n'.join(result)) + +except Exception as e: + print(f'Error updating {config_file}: {e}', file=sys.stderr) + sys.exit(1) +" else # Create new config file printf '[Appearance]\ncustom_palette=true\ncolor_scheme_path=%s\n' "$color_scheme_path" > "$config_file" @@ -146,13 +168,13 @@ update_qt_config() { # Update Qt5ct if available if command -v qt5ct >/dev/null 2>&1; then - update_qt_color_config "$home_dir/.config/qt5ct/qt5ct.conf" "5" + update_qt_color_config "$config_dir/qt5ct/qt5ct.conf" "5" echo "Updated Qt5ct configuration" fi # Update Qt6ct if available if command -v qt6ct >/dev/null 2>&1; then - update_qt_color_config "$home_dir/.config/qt6ct/qt6ct.conf" "6" + update_qt_color_config "$config_dir/qt6ct/qt6ct.conf" "6" echo "Updated Qt6ct configuration" fi } @@ -185,7 +207,7 @@ if [ ! -d "$SHELL_DIR" ]; then fi # Create necessary directories -mkdir -p "$HOME_DIR/.config/gtk-3.0" "$HOME_DIR/.config/gtk-4.0" "$HOME_DIR/.config/qt5ct/colors" "$HOME_DIR/.config/qt6ct/colors" "$HOME_DIR/.local/share/color-schemes" +mkdir -p "$CONFIG_DIR/gtk-3.0" "$CONFIG_DIR/gtk-4.0" "$CONFIG_DIR/qt5ct/colors" "$CONFIG_DIR/qt6ct/colors" "$(dirname "$CONFIG_DIR")/.local/share/color-schemes" # Change to shell directory where matugen-config.toml is located cd "$SHELL_DIR" || exit 1 @@ -218,7 +240,7 @@ update_theme_settings "$color_scheme" "$ICON_THEME" # Update GTK CSS imports if GTK theming is enabled if [ "$GTK_THEMING" = "true" ]; then - update_gtk_css "$HOME_DIR" + update_gtk_css "$CONFIG_DIR" echo "GTK theming updated" else echo "GTK theming disabled - skipping GTK CSS updates" @@ -226,7 +248,7 @@ fi # Update Qt configuration if Qt theming is enabled if [ "$QT_THEMING" = "true" ]; then - update_qt_config "$HOME_DIR" + update_qt_config "$CONFIG_DIR" echo "Qt theming updated" else echo "Qt theming disabled - skipping Qt configuration updates" @@ -234,8 +256,8 @@ fi echo "System theme files generated successfully" if [ "$GTK_THEMING" = "true" ]; then - echo "dank-colors.css files should be available in $HOME_DIR/.config/gtk-3.0/ and $HOME_DIR/.config/gtk-4.0/" + echo "dank-colors.css files should be available in $CONFIG_DIR/gtk-3.0/ and $CONFIG_DIR/gtk-4.0/" fi if [ "$QT_THEMING" = "true" ]; then - echo "Qt color schemes should be available in $HOME_DIR/.config/qt5ct/colors/ and $HOME_DIR/.config/qt6ct/colors/" + echo "Qt color schemes should be available in $CONFIG_DIR/qt5ct/colors/ and $CONFIG_DIR/qt6ct/colors/" fi \ No newline at end of file diff --git a/matugen-config.toml b/matugen-config.toml index 6e10c26a..3ae5537e 100644 --- a/matugen-config.toml +++ b/matugen-config.toml @@ -8,10 +8,6 @@ output_path = '~/.config/gtk-3.0/dank-colors.css' input_path = './templates/gtk-colors.css' output_path = '~/.config/gtk-4.0/dank-colors.css' -[templates.qt] -input_path = './templates/qt-colors.colors' -output_path = '~/.local/share/color-schemes/Matugen.colors' - [templates.qt5ct] input_path = './templates/qtct-colors.conf' output_path = '~/.config/qt5ct/colors/matugen.conf' diff --git a/templates/qtct-colors.conf b/templates/qtct-colors.conf index 5d35cb46..98bafd38 100644 --- a/templates/qtct-colors.conf +++ b/templates/qtct-colors.conf @@ -1,5 +1,5 @@ [ColorScheme] -active_colors={{colors.on_background.default.hex}}, {{colors.surface.default.hex}}, #ffffff, #cacaca, #9f9f9f, #b8b8b8, {{colors.on_background.default.hex}}, #ffffff, {{colors.on_surface.default.hex}}, {{colors.background.default.hex}}, {{colors.background.default.hex}}, {{colors.shadow.default.hex}}, {{colors.primary_container.default.hex}}, {{colors.on_primary_container.default.hex}}, {{colors.secondary.default.hex}}, {{colors.primary.default.hex}}, {{colors.surface.default.hex}}, {{colors.scrim.default.hex}}, {{colors.surface.default.hex}}, {{colors.on_surface.default.hex}}, {{colors.secondary.default.hex}} -disabled_colors={{colors.on_background.default.hex}}, {{colors.surface.default.hex}}, #ffffff, #cacaca, #9f9f9f, #b8b8b8, {{colors.on_background.default.hex}}, #ffffff, {{colors.on_surface.default.hex}}, {{colors.background.default.hex}}, {{colors.background.default.hex}}, {{colors.shadow.default.hex}}, {{colors.primary_container.default.hex}}, {{colors.on_primary_container.default.hex}}, {{colors.secondary.default.hex}}, {{colors.primary.default.hex}}, {{colors.surface.default.hex}}, {{colors.scrim.default.hex}}, {{colors.surface.default.hex}}, {{colors.on_surface.default.hex}}, {{colors.secondary.default.hex}} -inactive_colors={{colors.on_background.default.hex}}, {{colors.surface.default.hex}}, #ffffff, #cacaca, #9f9f9f, #b8b8b8, {{colors.on_background.default.hex}}, #ffffff, {{colors.on_surface.default.hex}}, {{colors.background.default.hex}}, {{colors.background.default.hex}}, {{colors.shadow.default.hex}}, {{colors.primary_container.default.hex}}, {{colors.on_primary_container.default.hex}}, {{colors.secondary.default.hex}}, {{colors.primary.default.hex}}, {{colors.surface.default.hex}}, {{colors.scrim.default.hex}}, {{colors.surface.default.hex}}, {{colors.on_surface.default.hex}}, {{colors.secondary.default.hex}} +active_colors={{colors.on_surface.default.hex}}, {{colors.surface_container.default.hex}}, {{colors.surface_container_high.default.hex}}, {{colors.outline.default.hex}}, {{colors.surface_variant.default.hex}}, {{colors.outline_variant.default.hex}}, {{colors.on_surface.default.hex}}, {{colors.on_primary.default.hex}}, {{colors.on_surface.default.hex}}, {{colors.surface.default.hex}}, {{colors.background.default.hex}}, {{colors.shadow.default.hex}}, {{colors.primary.default.hex}}, {{colors.on_primary.default.hex}}, {{colors.secondary.default.hex}}, {{colors.secondary.default.hex}}, {{colors.surface_container_low.default.hex}}, {{colors.surface_container.default.hex}}, {{colors.surface_container.default.hex}}, {{colors.on_surface_variant.default.hex}}, {{colors.on_surface_variant.default.hex}} +disabled_colors={{colors.on_surface_variant.default.hex}}, {{colors.surface_variant.default.hex}}, {{colors.surface_container_high.default.hex}}, {{colors.outline.default.hex}}, {{colors.surface_variant.default.hex}}, {{colors.outline_variant.default.hex}}, {{colors.on_surface_variant.default.hex}}, {{colors.on_surface_variant.default.hex}}, {{colors.on_surface_variant.default.hex}}, {{colors.surface_variant.default.hex}}, {{colors.surface_variant.default.hex}}, {{colors.shadow.default.hex}}, {{colors.surface_variant.default.hex}}, {{colors.on_surface_variant.default.hex}}, {{colors.on_surface_variant.default.hex}}, {{colors.on_surface_variant.default.hex}}, {{colors.surface_variant.default.hex}}, {{colors.surface_variant.default.hex}}, {{colors.surface_variant.default.hex}}, {{colors.on_surface_variant.default.hex}}, {{colors.on_surface_variant.default.hex}} +inactive_colors={{colors.on_surface_variant.default.hex}}, {{colors.surface_container.default.hex}}, {{colors.surface_container_high.default.hex}}, {{colors.outline.default.hex}}, {{colors.surface_variant.default.hex}}, {{colors.outline_variant.default.hex}}, {{colors.on_surface_variant.default.hex}}, {{colors.on_surface_variant.default.hex}}, {{colors.on_surface_variant.default.hex}}, {{colors.surface_container.default.hex}}, {{colors.surface_container.default.hex}}, {{colors.shadow.default.hex}}, {{colors.secondary.default.hex}}, {{colors.on_secondary.default.hex}}, {{colors.secondary.default.hex}}, {{colors.secondary.default.hex}}, {{colors.surface_container_low.default.hex}}, {{colors.surface_container.default.hex}}, {{colors.surface_container.default.hex}}, {{colors.on_surface_variant.default.hex}}, {{colors.on_surface_variant.default.hex}}