1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2025-12-06 05:25:41 -05:00

Compare commits

...

67 Commits

Author SHA1 Message Date
github-actions[bot]
71a7ebbfe2 Update VERSION to v0.3.3 (from DMS) 2025-11-03 21:43:00 +00:00
ffoebel
d6d701c722 matugen: missing foot.ini colors section (#620) 2025-11-03 16:40:54 -05:00
bbedward
43fbbc07f5 brightness: fix osd suppression 2025-11-03 16:27:41 -05:00
purian23
8504144c32 Jk - no udev rules here 2025-11-03 16:19:11 -05:00
ffoebel
1d3e59b5dd matugen: pywalfox update via post_hook (#619) 2025-11-03 16:00:26 -05:00
bbedward
3f70ca3506 brightness: dont cap to 1 minimum for non-backlight/ddc 2025-11-03 15:39:49 -05:00
purian23
3640d8bd24 Update Copr udev spec source 2025-11-03 15:34:56 -05:00
bbedward
706a99817f wallpaper: small ui tweak 2025-11-03 15:30:55 -05:00
purian23
4645b2dcab Remove brightnessctl dep from Copr specs 2025-11-03 15:22:12 -05:00
bbedward
13f1673371 toast: handle error overflow better 2025-11-03 15:18:06 -05:00
github-actions[bot]
7d374c4c2a i18n: update source strings from codebase 2025-11-03 20:04:07 +00:00
bbedward
5ed449773c lock: prevent sending lockerReady during unlock 2025-11-03 15:03:31 -05:00
github-actions[bot]
aef9c2269a i18n: update translations 2025-11-03 19:57:43 +00:00
github-actions[bot]
daa5a3e821 i18n: update source strings from codebase 2025-11-03 19:57:32 +00:00
bbedward
5cd1167b28 net: add auto connect option for wifi networks
fixes #597
2025-11-03 14:56:49 -05:00
github-actions[bot]
21e7ae3dfd i18n: update translations 2025-11-03 19:17:48 +00:00
bbedward
5d40138585 display: fix brightness OSD suppression 2025-11-03 14:17:10 -05:00
github-actions[bot]
893fd820a3 i18n: update translations 2025-11-03 18:27:17 +00:00
github-actions[bot]
2d536d99e5 i18n: update source strings from codebase 2025-11-03 18:27:06 +00:00
bbedward
a0ee4792b9 greeter: fix cornerRadius and fillmode sync
fixes #609
2025-11-03 13:26:21 -05:00
bbedward
a8f6880840 wallpaper: improve per-mode wallpaper selection interface
- Separate it out so its clear what you're changing
fixes #611
2025-11-03 12:11:33 -05:00
bbedward
51296d1d44 niri: skip wallpaper transition during mode switches
fixes #612
2025-11-03 12:01:00 -05:00
bbedward
0f29149014 dankbar: fix mousearea position for scrolling workspaces
fixes #610
2025-11-03 11:55:41 -05:00
github-actions[bot]
b9f0c277ec i18n: update source strings from codebase 2025-11-03 15:59:32 +00:00
github-actions[bot]
69964c9704 i18n: update translations 2025-11-03 15:59:12 +00:00
github-actions[bot]
ff1d38e34f i18n: update source strings from codebase 2025-11-03 15:59:02 +00:00
Bruno Cesar Rocha
3abee7f2f5 Consolidate launcher (#615)
* refactor: Consolidate Icon Renderer for launcher

Launcher icons are built on 2 places Spotlight and AppDrawer
This duplicates the maintanance effort, every time something
changes on one place must be replicated on the other.

This commit consolidates the Icon renderer in a shared component.

* refactor: Consolidate Launcher list and grid

List and GRid builders were split in 2 components.

this commit adds separate delegates to be reused as shared components.
2025-11-03 10:58:52 -05:00
bbedward
ed0b80008f brightness: use brightness.decrement/increment/refresh APIs 2025-11-03 10:57:16 -05:00
bbedward
976ff108b3 brightness: remove brightnessctl + ddcutil dependencies
- Switches to DMS API v13+ dependency
2025-11-02 20:22:45 -05:00
purian23
66e3cc77c5 Update handling of Systemd 2025-11-02 19:40:47 -05:00
github-actions[bot]
229abba1e4 i18n: update translations 2025-11-03 00:22:59 +00:00
bbedward
8dacaf84cc matugen: color panel border primary 2025-11-02 19:22:20 -05:00
purian23
102b185572 Check initial plugin status 2025-11-02 14:26:24 -05:00
github-actions[bot]
52ac474f7d i18n: update source strings from codebase 2025-11-02 19:21:00 +00:00
purian23
c0064cfcfa Update Notepad initial services 2025-11-02 14:20:33 -05:00
Aziz Hasanain
414ce5610d Remove wallpaper engine support in favor of plugin (#601)
* Remove wallpaper engine support in favor of plugin

* i18n: update source strings from codebase

* Add migration notification for WallpaperEngine support

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-11-02 13:44:06 -05:00
github-actions[bot]
113ac42814 i18n: update translations 2025-11-02 16:08:29 +00:00
github-actions[bot]
a2f2eef326 i18n: update source strings from codebase 2025-11-02 16:08:20 +00:00
bbedward
54a69a6101 gamma: allow setting high temp 2025-11-02 11:07:47 -05:00
bbedward
5e2d3c8d7d update readme 2025-11-02 10:12:31 -05:00
bbedward
5a9950a7c3 matugen: add foot and alacritty 2025-11-02 10:07:20 -05:00
OpetBrebet
2aadbc1a61 Fix dark spot in disc shader after transition (#604) 2025-11-02 09:35:04 -05:00
bbedward
749414ab65 matugen: vscode update 2025-11-02 08:43:48 -05:00
bbedward
baaebcd413 matugen: add vscode theme, switch to dms dank16 2025-11-02 01:42:48 -04:00
purian23
5a8a60b15d Integrate danksearch in DMS Copr 2025-11-01 23:53:33 -04:00
github-actions[bot]
f0ddb8db49 i18n: update translations 2025-11-02 02:39:36 +00:00
bbedward
baa12c0161 matugen: alt version detection 2025-11-01 22:38:56 -04:00
bbedward
ca226e98c2 add contributing docs section 2025-11-01 13:53:07 -04:00
bbedward
453079ef1f update stock wallpaper 2025-11-01 13:28:10 -04:00
github-actions[bot]
074aea2c35 Update VERSION to v0.3.2 (from DMS) 2025-11-01 17:12:54 +00:00
bbedward
9cf5f0b9b3 readme update 2025-11-01 12:30:35 -04:00
bbedward
89e12eea29 readme updoot 2025-11-01 12:26:11 -04:00
bbedward
03d4caff8f matugen: validation 2025-11-01 12:04:59 -04:00
bbedward
89d54dedb7 matugen: more flexible checking 2025-11-01 11:49:12 -04:00
bbedward
9a9e62ccd3 matugen: support newer json format 2025-11-01 11:40:18 -04:00
Massimo Branchini
eca38ae920 base activation for cups capability (#591)
* base activation for cups capability

* i18n: update source strings from codebase

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-11-01 10:55:27 -04:00
bbedward
84e89599bf widgets: fix right click handling 2025-11-01 10:39:25 -04:00
bbedward
e1cdf4ed50 keyboard/hyprland: sync keyboard layout with event 2025-11-01 10:35:22 -04:00
github-actions[bot]
e4371ea4fc i18n: update source strings from codebase 2025-11-01 14:23:09 +00:00
bbedward
9c45d13cbf lock/greeter: don't elide password field
fixes #593
2025-11-01 10:22:27 -04:00
bbedward
5f22347d7a audio: re-create players on default device change 2025-11-01 10:14:30 -04:00
Moraxyc Xu
ca786a3567 nix: replace pkgs.system with pkgs.stdenv.hostPlatform.system (#599) 2025-11-01 09:39:03 -04:00
purian23
60ce662d49 Update Copr path directories 2025-10-31 21:31:45 -04:00
github-actions[bot]
4f9b0d8925 i18n: update translations 2025-11-01 01:09:17 +00:00
purian23
9c2fc570e6 feat: Add Fedora Copr Systemd Support
- Updated distro filestructure
2025-10-31 21:08:47 -04:00
github-actions[bot]
0ba982b271 i18n: update source strings from codebase 2025-10-31 21:10:22 +00:00
Bruno Cesar Rocha
ff3123e387 feat: allow Launcher plugins to set unicode icons. (#594)
Launcher plugins can now set `icon: "unicode:🍉"`
and the symbol is used as the icon.
2025-10-31 17:10:00 -04:00
69 changed files with 2997 additions and 2991 deletions

View File

@@ -86,15 +86,16 @@ jobs:
BuildRequires: gzip
BuildRequires: wget
BuildRequires: systemd-rpm-macros
Requires: (quickshell or quickshell-git)
Requires: accountsservice
Requires: dms-cli
Requires: dgop
Recommends: brightnessctl
Recommends: cava
Recommends: cliphist
Recommends: danksearch
Recommends: hyprpicker
Recommends: matugen
Recommends: wl-clipboard
@@ -171,6 +172,8 @@ jobs:
install -Dm755 %{_builddir}/dms-cli %{buildroot}%{_bindir}/dms
install -Dm755 %{_builddir}/dgop %{buildroot}%{_bindir}/dgop
install -Dm644 %{_builddir}/dms-qml/assets/systemd/dms.service %{buildroot}%{_userunitdir}/dms.service
install -dm755 %{buildroot}%{_datadir}/quickshell/dms
cp -r %{_builddir}/dms-qml/* %{buildroot}%{_datadir}/quickshell/dms/
@@ -224,6 +227,7 @@ jobs:
%license LICENSE
%doc README.md CONTRIBUTING.md
%{_datadir}/quickshell/dms/
%{_userunitdir}/dms.service
%files -n dms-cli
%{_bindir}/dms

View File

@@ -21,6 +21,7 @@ Singleton {
property bool isLightMode: false
property bool doNotDisturb: false
property bool isSwitchingMode: false
property string wallpaperPath: ""
property bool perMonitorWallpaper: false
@@ -42,6 +43,7 @@ Singleton {
property bool nightModeEnabled: false
property int nightModeTemperature: 4500
property int nightModeHighTemperature: 6500
property bool nightModeAutoEnabled: false
property string nightModeAutoMode: "time"
property int nightModeStartHour: 18
@@ -83,7 +85,21 @@ Singleton {
if (content && content.trim()) {
var settings = JSON.parse(content)
isLightMode = settings.isLightMode !== undefined ? settings.isLightMode : false
wallpaperPath = settings.wallpaperPath !== undefined ? settings.wallpaperPath : ""
if (settings.wallpaperPath && settings.wallpaperPath.startsWith("we:")) {
console.warn("WallpaperEngine wallpaper detected, resetting wallpaper")
wallpaperPath = ""
Quickshell.execDetached([
"notify-send",
"-u", "critical",
"-a", "DMS",
"-i", "dialog-warning",
"WallpaperEngine Support Moved",
"WallpaperEngine support has been moved to a plugin. Please enable the Linux Wallpaper Engine plugin in Settings → Plugins to continue using WallpaperEngine."
])
} else {
wallpaperPath = settings.wallpaperPath !== undefined ? settings.wallpaperPath : ""
}
perMonitorWallpaper = settings.perMonitorWallpaper !== undefined ? settings.perMonitorWallpaper : false
monitorWallpapers = settings.monitorWallpapers !== undefined ? settings.monitorWallpapers : {}
perModeWallpaper = settings.perModeWallpaper !== undefined ? settings.perModeWallpaper : false
@@ -94,6 +110,7 @@ Singleton {
doNotDisturb = settings.doNotDisturb !== undefined ? settings.doNotDisturb : false
nightModeEnabled = settings.nightModeEnabled !== undefined ? settings.nightModeEnabled : false
nightModeTemperature = settings.nightModeTemperature !== undefined ? settings.nightModeTemperature : 4500
nightModeHighTemperature = settings.nightModeHighTemperature !== undefined ? settings.nightModeHighTemperature : 6500
nightModeAutoEnabled = settings.nightModeAutoEnabled !== undefined ? settings.nightModeAutoEnabled : false
nightModeAutoMode = settings.nightModeAutoMode !== undefined ? settings.nightModeAutoMode : "time"
if (settings.nightModeStartTime !== undefined) {
@@ -171,6 +188,7 @@ Singleton {
"doNotDisturb": doNotDisturb,
"nightModeEnabled": nightModeEnabled,
"nightModeTemperature": nightModeTemperature,
"nightModeHighTemperature": nightModeHighTemperature,
"nightModeAutoEnabled": nightModeAutoEnabled,
"nightModeAutoMode": nightModeAutoMode,
"nightModeStartHour": nightModeStartHour,
@@ -250,7 +268,7 @@ Singleton {
}
function cleanupUnusedKeys() {
const validKeys = ["isLightMode", "wallpaperPath", "perMonitorWallpaper", "monitorWallpapers", "perModeWallpaper", "wallpaperPathLight", "wallpaperPathDark", "monitorWallpapersLight", "monitorWallpapersDark", "doNotDisturb", "nightModeEnabled", "nightModeTemperature", "nightModeAutoEnabled", "nightModeAutoMode", "nightModeStartHour", "nightModeStartMinute", "nightModeEndHour", "nightModeEndMinute", "latitude", "longitude", "nightModeUseIPLocation", "nightModeLocationProvider", "pinnedApps", "selectedGpuIndex", "nvidiaGpuTempEnabled", "nonNvidiaGpuTempEnabled", "enabledGpuPciIds", "wallpaperCyclingEnabled", "wallpaperCyclingMode", "wallpaperCyclingInterval", "wallpaperCyclingTime", "monitorCyclingSettings", "lastBrightnessDevice", "launchPrefix", "wallpaperTransition", "includedTransitions", "recentColors", "showThirdPartyPlugins", "configVersion"]
const validKeys = ["isLightMode", "wallpaperPath", "perMonitorWallpaper", "monitorWallpapers", "perModeWallpaper", "wallpaperPathLight", "wallpaperPathDark", "monitorWallpapersLight", "monitorWallpapersDark", "doNotDisturb", "nightModeEnabled", "nightModeTemperature", "nightModeHighTemperature", "nightModeAutoEnabled", "nightModeAutoMode", "nightModeStartHour", "nightModeStartMinute", "nightModeEndHour", "nightModeEndMinute", "latitude", "longitude", "nightModeUseIPLocation", "nightModeLocationProvider", "pinnedApps", "selectedGpuIndex", "nvidiaGpuTempEnabled", "nonNvidiaGpuTempEnabled", "enabledGpuPciIds", "wallpaperCyclingEnabled", "wallpaperCyclingMode", "wallpaperCyclingInterval", "wallpaperCyclingTime", "monitorCyclingSettings", "lastBrightnessDevice", "launchPrefix", "wallpaperTransition", "includedTransitions", "recentColors", "showThirdPartyPlugins", "configVersion"]
try {
const content = settingsFile.text()
@@ -277,9 +295,11 @@ Singleton {
}
function setLightMode(lightMode) {
isSwitchingMode = true
isLightMode = lightMode
syncWallpaperForCurrentMode()
saveSettings()
Qt.callLater(() => { isSwitchingMode = false })
}
function setDoNotDisturb(enabled) {
@@ -526,6 +546,11 @@ Singleton {
saveSettings()
}
function setNightModeHighTemperature(temperature) {
nightModeHighTemperature = temperature
saveSettings()
}
function setNightModeAutoEnabled(enabled) {
console.log("SessionData: Setting nightModeAutoEnabled to", enabled)
nightModeAutoEnabled = enabled

View File

@@ -300,6 +300,7 @@ Singleton {
loadSettings()
initializeListModels()
fprintdDetectionProcess.running = true
pluginSettingsCheckProcess.running = true
}
}
@@ -1985,7 +1986,7 @@ Singleton {
FileView {
id: pluginSettingsFile
path: isGreeterMode ? "" : pluginSettingsPath
path: isGreeterMode ? "" : (pluginSettingsFileExists ? pluginSettingsPath : "")
blockLoading: true
blockWrites: true
atomicWrites: true
@@ -2002,6 +2003,17 @@ Singleton {
}
}
property bool pluginSettingsFileExists: false
Process {
id: pluginSettingsCheckProcess
command: ["test", "-f", pluginSettingsPath]
onExited: (exitCode) => {
pluginSettingsFileExists = (exitCode === 0)
}
}
Process {
id: systemDefaultDetectionProcess

View File

@@ -9,6 +9,7 @@ import Quickshell.Io
import Quickshell.Services.UPower
import qs.Common
import qs.Services
import qs.Modules.Greetd
import "StockThemes.js" as StockThemes
Singleton {
@@ -43,23 +44,11 @@ Singleton {
var screens = Quickshell.screens
if (screens.length > 0) {
var firstMonitorWallpaper = SessionData.getMonitorWallpaper(screens[0].name)
var wallpaperPath = firstMonitorWallpaper || SessionData.wallpaperPath
if (wallpaperPath && wallpaperPath.startsWith("we:")) {
return stateDir + "/we_screenshots/" + wallpaperPath.substring(3) + ".jpg"
}
return wallpaperPath
return firstMonitorWallpaper || SessionData.wallpaperPath
}
}
var wallpaperPath = SessionData.wallpaperPath
var screens = Quickshell.screens
if (screens.length > 0 && wallpaperPath && wallpaperPath.startsWith("we:")) {
return stateDir + "/we_screenshots/" + wallpaperPath.substring(3) + ".jpg"
}
return wallpaperPath
return SessionData.wallpaperPath
}
readonly property string rawWallpaperPath: {
if (typeof SessionData === "undefined")
@@ -112,11 +101,10 @@ Singleton {
const isLight = (typeof SessionData !== "undefined" && SessionData.isLightMode)
const iconTheme = (typeof SettingsData !== "undefined" && SettingsData.iconTheme) ? SettingsData.iconTheme : "System Default"
const selectedMatugenType = (typeof SettingsData !== "undefined" && SettingsData.matugenScheme) ? SettingsData.matugenScheme : "scheme-tonal-spot"
const effectivePath = rawWallpaperPath.startsWith("we:") ? (stateDir + "/we_screenshots/" + rawWallpaperPath.substring(3) + ".jpg") : rawWallpaperPath
if (effectivePath.startsWith("#")) {
setDesiredTheme("hex", effectivePath, isLight, iconTheme, selectedMatugenType)
if (rawWallpaperPath.startsWith("#")) {
setDesiredTheme("hex", rawWallpaperPath, isLight, iconTheme, selectedMatugenType)
} else {
setDesiredTheme("image", effectivePath, isLight, iconTheme, selectedMatugenType)
setDesiredTheme("image", rawWallpaperPath, isLight, iconTheme, selectedMatugenType)
}
return
}
@@ -127,11 +115,10 @@ Singleton {
if (currentTheme === dynamic) {
if (rawWallpaperPath) {
const selectedMatugenType = (typeof SettingsData !== "undefined" && SettingsData.matugenScheme) ? SettingsData.matugenScheme : "scheme-tonal-spot"
const effectivePath = rawWallpaperPath.startsWith("we:") ? (stateDir + "/we_screenshots/" + rawWallpaperPath.substring(3) + ".jpg") : rawWallpaperPath
if (effectivePath.startsWith("#")) {
setDesiredTheme("hex", effectivePath, isLight, iconTheme, selectedMatugenType)
if (rawWallpaperPath.startsWith("#")) {
setDesiredTheme("hex", rawWallpaperPath, isLight, iconTheme, selectedMatugenType)
} else {
setDesiredTheme("image", effectivePath, isLight, iconTheme, selectedMatugenType)
setDesiredTheme("image", rawWallpaperPath, isLight, iconTheme, selectedMatugenType)
}
}
} else {
@@ -439,7 +426,12 @@ Singleton {
}
}
property real cornerRadius: typeof SettingsData !== "undefined" ? SettingsData.cornerRadius : 12
property real cornerRadius: {
if (typeof SessionData !== "undefined" && SessionData.isGreeterMode && typeof GreetdSettings !== "undefined") {
return GreetdSettings.cornerRadius
}
return typeof SettingsData !== "undefined" ? SettingsData.cornerRadius : 12
}
property real spacingXS: 4
property real spacingS: 8
property real spacingM: 12
@@ -811,16 +803,10 @@ Singleton {
const desiredPath = stateDir + "/matugen.desired.json"
Quickshell.execDetached(["sh", "-c", `mkdir -p '${stateDir}' && cat > '${desiredPath}' << 'EOF'\n${json}\nEOF`])
Quickshell.execDetached(["rm", "-f", stateDir + "/matugen.key"])
workerRunning = true
const syncModeWithPortal = (typeof SettingsData !== "undefined" && SettingsData.syncModeWithPortal) ? "true" : "false"
if (rawWallpaperPath.startsWith("we:")) {
console.log("Theme: Starting matugen worker (WE wallpaper, waiting for screenshot)")
systemThemeGenerator.command = ["sh", "-c", `sleep 3 && ${shellDir}/scripts/matugen-worker.sh '${stateDir}' '${shellDir}' '${configDir}' '${syncModeWithPortal}' --run`]
} else {
console.log("Theme: Starting matugen worker")
systemThemeGenerator.command = [shellDir + "/scripts/matugen-worker.sh", stateDir, shellDir, configDir, syncModeWithPortal, "--run"]
}
console.log("Theme: Starting matugen worker")
systemThemeGenerator.command = [shellDir + "/scripts/matugen-worker.sh", stateDir, shellDir, configDir, syncModeWithPortal, "--run"]
systemThemeGenerator.running = true
}
@@ -837,11 +823,10 @@ Singleton {
return
}
const selectedMatugenType = (typeof SettingsData !== "undefined" && SettingsData.matugenScheme) ? SettingsData.matugenScheme : "scheme-tonal-spot"
const effectivePath = rawWallpaperPath.startsWith("we:") ? (stateDir + "/we_screenshots/" + rawWallpaperPath.substring(3) + ".jpg") : rawWallpaperPath
if (effectivePath.startsWith("#")) {
setDesiredTheme("hex", effectivePath, isLight, iconTheme, selectedMatugenType)
if (rawWallpaperPath.startsWith("#")) {
setDesiredTheme("hex", rawWallpaperPath, isLight, iconTheme, selectedMatugenType)
} else {
setDesiredTheme("image", effectivePath, isLight, iconTheme, selectedMatugenType)
setDesiredTheme("image", rawWallpaperPath, isLight, iconTheme, selectedMatugenType)
}
} else {
let primaryColor

View File

@@ -39,9 +39,6 @@ DankModal {
property bool selectedFileIsDir: false
property bool showOverwriteConfirmation: false
property string pendingFilePath: ""
property bool weAvailable: false
property string wePath: ""
property bool weMode: false
property var parentModal: null
property bool showSidebar: true
property string viewMode: "grid"
@@ -220,22 +217,6 @@ DankModal {
StandardPaths.HomeLocation) + "/snap/steam/common/.local/share/Steam/steamapps/workshop/content/431960"]
property int currentPathIndex: 0
function discoverWallpaperEngine() {
currentPathIndex = 0
checkNextPath()
}
function checkNextPath() {
if (currentPathIndex >= steamPaths.length) {
return
}
const wePath = steamPaths[currentPathIndex]
const cleanPath = wePath.replace(/^file:\/\//, '')
weDiscoveryProcess.command = ["test", "-d", cleanPath]
weDiscoveryProcess.wePath = wePath
weDiscoveryProcess.running = true
}
width: 800
height: 600
enableShadow: true
@@ -266,9 +247,6 @@ DankModal {
selectedIndex = -1
keyboardNavigationActive = false
backButtonFocused = false
if (browserType === "wallpaper" && !weAvailable) {
discoverWallpaperEngine()
}
}
}
onCurrentPathChanged: {
@@ -572,23 +550,6 @@ DankModal {
}
}
Process {
id: weDiscoveryProcess
property string wePath: ""
running: false
onExited: exitCode => {
if (exitCode === 0) {
fileBrowserModal.weAvailable = true
fileBrowserModal.wePath = wePath
} else {
currentPathIndex++
checkNextPath()
}
}
}
content: Component {
Item {
anchors.fill: parent
@@ -644,7 +605,6 @@ DankModal {
iconName: showHiddenFiles ? "visibility_off" : "visibility"
iconSize: Theme.iconSize - 4
iconColor: showHiddenFiles ? Theme.primary : Theme.surfaceText
visible: !weMode
onClicked: showHiddenFiles = !showHiddenFiles
}
@@ -653,7 +613,6 @@ DankModal {
iconName: viewMode === "grid" ? "view_list" : "grid_view"
iconSize: Theme.iconSize - 4
iconColor: Theme.surfaceText
visible: !weMode
onClicked: viewMode = viewMode === "grid" ? "list" : "grid"
}
@@ -662,26 +621,10 @@ DankModal {
iconName: iconSizeIndex === 0 ? "photo_size_select_small" : iconSizeIndex === 1 ? "photo_size_select_large" : iconSizeIndex === 2 ? "photo_size_select_actual" : "zoom_in"
iconSize: Theme.iconSize - 4
iconColor: Theme.surfaceText
visible: !weMode && viewMode === "grid"
visible: viewMode === "grid"
onClicked: iconSizeIndex = (iconSizeIndex + 1) % iconSizes.length
}
DankActionButton {
circular: false
iconName: "movie"
iconSize: Theme.iconSize - 4
iconColor: weMode ? Theme.primary : Theme.surfaceText
visible: weAvailable && browserType === "wallpaper"
onClicked: {
weMode = !weMode
if (weMode) {
navigateTo(wePath)
} else {
navigateTo(getLastPath())
}
}
}
DankActionButton {
circular: false
iconName: "info"
@@ -769,8 +712,8 @@ DankModal {
height: parent.height - 41
clip: true
property real gridCellWidth: weMode ? 255 : iconSizes[iconSizeIndex] + 24
property real gridCellHeight: weMode ? 215 : iconSizes[iconSizeIndex] + 56
property real gridCellWidth: iconSizes[iconSizeIndex] + 24
property real gridCellHeight: iconSizes[iconSizeIndex] + 56
property real availableGridWidth: width - Theme.spacingM * 2
property int gridColumns: Math.max(1, Math.floor(availableGridWidth / gridCellWidth))
property real gridLeftMargin: Theme.spacingM + Math.max(0, (availableGridWidth - (gridColumns * gridCellWidth)) / 2)
@@ -809,7 +752,6 @@ DankModal {
}
delegate: FileBrowserGridDelegate {
weMode: fileBrowserModal.weMode
iconSizes: fileBrowserModal.iconSizes
iconSizeIndex: fileBrowserModal.iconSizeIndex
selectedIndex: fileBrowserModal.selectedIndex
@@ -817,11 +759,7 @@ DankModal {
onItemClicked: (index, path, name, isDir) => {
selectedIndex = index
setSelectedFileData(path, name, isDir)
if (weMode && isDir) {
var sceneId = path.split("/").pop()
fileSelected("we:" + sceneId)
fileBrowserModal.close()
} else if (isDir) {
if (isDir) {
navigateTo(path)
} else {
fileSelected(path)
@@ -838,11 +776,7 @@ DankModal {
fileBrowserModal.keyboardSelectionRequested = false
selectedIndex = index
setSelectedFileData(filePath, fileName, fileIsDir)
if (weMode && fileIsDir) {
var sceneId = filePath.split("/").pop()
fileSelected("we:" + sceneId)
fileBrowserModal.close()
} else if (fileIsDir) {
if (fileIsDir) {
navigateTo(filePath)
} else {
fileSelected(filePath)

View File

@@ -73,115 +73,22 @@ Rectangle {
appLauncher.keyboardNavigationActive = false
}
delegate: Rectangle {
width: ListView.view.width
height: resultsList.itemHeight
radius: Theme.cornerRadius
color: ListView.isCurrentItem ? Theme.primaryPressed : listMouseArea.containsMouse ? Theme.primaryHoverLight : Theme.surfaceContainerHigh
Row {
anchors.fill: parent
anchors.margins: Theme.spacingM
spacing: Theme.spacingL
Item {
width: resultsList.iconSize
height: resultsList.iconSize
anchors.verticalCenter: parent.verticalCenter
visible: model.icon !== undefined && model.icon !== ""
property string iconValue: model.icon || ""
property bool isMaterial: iconValue.indexOf("material:") === 0
property string materialName: isMaterial ? iconValue.substring(9) : ""
DankIcon {
anchors.centerIn: parent
name: parent.materialName
size: resultsList.iconSize
color: Theme.surfaceText
visible: parent.isMaterial
}
IconImage {
id: listIconImg
anchors.fill: parent
source: parent.isMaterial ? "" : Quickshell.iconPath(parent.iconValue, true)
asynchronous: true
visible: !parent.isMaterial && status === Image.Ready
}
Rectangle {
anchors.fill: parent
visible: !parent.isMaterial && !listIconImg.visible
color: Theme.surfaceLight
radius: Theme.cornerRadius
border.width: 1
border.color: Theme.primarySelected
StyledText {
anchors.centerIn: parent
text: (model.name && model.name.length > 0) ? model.name.charAt(0).toUpperCase() : "A"
font.pixelSize: resultsList.iconSize * 0.4
color: Theme.primary
font.weight: Font.Bold
}
}
}
Column {
anchors.verticalCenter: parent.verticalCenter
width: (model.icon !== undefined && model.icon !== "") ? (parent.width - resultsList.iconSize - Theme.spacingL) : parent.width
spacing: Theme.spacingXS
StyledText {
width: parent.width
text: model.name || ""
font.pixelSize: Theme.fontSizeLarge
color: Theme.surfaceText
font.weight: Font.Medium
elide: Text.ElideRight
wrapMode: Text.NoWrap
maximumLineCount: 1
}
StyledText {
width: parent.width
text: model.comment || "Application"
font.pixelSize: Theme.fontSizeMedium
color: Theme.surfaceVariantText
elide: Text.ElideRight
maximumLineCount: 1
visible: resultsList.showDescription && model.comment && model.comment.length > 0
}
}
}
MouseArea {
id: listMouseArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton
z: 10
onEntered: () => {
if (resultsList.hoverUpdatesSelection && !resultsList.keyboardNavigationActive)
resultsList.currentIndex = index
}
onPositionChanged: () => {
resultsList.keyboardNavigationReset()
}
onClicked: mouse => {
if (mouse.button === Qt.LeftButton) {
resultsList.itemClicked(index, model)
} else if (mouse.button === Qt.RightButton && !model.isPlugin) {
const globalPos = mapToItem(null, mouse.x, mouse.y)
const modalPos = resultsContainer.parent.mapFromItem(null, globalPos.x, globalPos.y)
resultsList.itemRightClicked(index, model, modalPos.x, modalPos.y)
}
}
delegate: AppLauncherListDelegate {
listView: resultsList
itemHeight: resultsList.itemHeight
iconSize: resultsList.iconSize
showDescription: resultsList.showDescription
hoverUpdatesSelection: resultsList.hoverUpdatesSelection
keyboardNavigationActive: resultsList.keyboardNavigationActive
isCurrentItem: ListView.isCurrentItem
iconMaterialSizeAdjustment: 0
iconUnicodeScale: 0.8
onItemClicked: (idx, modelData) => resultsList.itemClicked(idx, modelData)
onItemRightClicked: (idx, modelData, mouseX, mouseY) => {
const modalPos = resultsContainer.parent.mapFromItem(null, mouseX, mouseY)
resultsList.itemRightClicked(idx, modelData, modalPos.x, modalPos.y)
}
onKeyboardNavigationReset: resultsList.keyboardNavigationReset
}
}
@@ -250,103 +157,23 @@ Rectangle {
appLauncher.keyboardNavigationActive = false
}
delegate: Rectangle {
width: resultsGrid.cellWidth - resultsGrid.cellPadding
height: resultsGrid.cellHeight - resultsGrid.cellPadding
radius: Theme.cornerRadius
color: resultsGrid.currentIndex === index ? Theme.primaryPressed : gridMouseArea.containsMouse ? Theme.primaryHoverLight : Theme.surfaceContainerHigh
Column {
anchors.centerIn: parent
spacing: Theme.spacingS
Item {
property int iconSize: Math.min(resultsGrid.maxIconSize, Math.max(resultsGrid.minIconSize, resultsGrid.cellWidth * resultsGrid.iconSizeRatio))
width: iconSize
height: iconSize
anchors.horizontalCenter: parent.horizontalCenter
visible: model.icon !== undefined && model.icon !== ""
property string iconValue: model.icon || ""
property bool isMaterial: iconValue.indexOf("material:") === 0
property string materialName: isMaterial ? iconValue.substring(9) : ""
DankIcon {
anchors.centerIn: parent
name: parent.materialName
size: parent.iconSize
color: Theme.surfaceText
visible: parent.isMaterial
}
IconImage {
id: gridIconImg
anchors.fill: parent
source: parent.isMaterial ? "" : Quickshell.iconPath(parent.iconValue, true)
smooth: true
asynchronous: true
visible: !parent.isMaterial && status === Image.Ready
}
Rectangle {
anchors.fill: parent
visible: !parent.isMaterial && !gridIconImg.visible
color: Theme.surfaceLight
radius: Theme.cornerRadius
border.width: 1
border.color: Theme.primarySelected
StyledText {
anchors.centerIn: parent
text: (model.name && model.name.length > 0) ? model.name.charAt(0).toUpperCase() : "A"
font.pixelSize: Math.min(28, parent.width * 0.5)
color: Theme.primary
font.weight: Font.Bold
}
}
}
StyledText {
anchors.horizontalCenter: parent.horizontalCenter
width: resultsGrid.cellWidth - 12
text: model.name || ""
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
font.weight: Font.Medium
elide: Text.ElideRight
horizontalAlignment: Text.AlignHCenter
maximumLineCount: 1
wrapMode: Text.NoWrap
}
}
MouseArea {
id: gridMouseArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton
z: 10
onEntered: () => {
if (resultsGrid.hoverUpdatesSelection && !resultsGrid.keyboardNavigationActive)
resultsGrid.currentIndex = index
}
onPositionChanged: () => {
resultsGrid.keyboardNavigationReset()
}
onClicked: mouse => {
if (mouse.button === Qt.LeftButton) {
resultsGrid.itemClicked(index, model)
} else if (mouse.button === Qt.RightButton && !model.isPlugin) {
const globalPos = mapToItem(null, mouse.x, mouse.y)
const modalPos = resultsContainer.parent.mapFromItem(null, globalPos.x, globalPos.y)
resultsGrid.itemRightClicked(index, model, modalPos.x, modalPos.y)
}
}
delegate: AppLauncherGridDelegate {
gridView: resultsGrid
cellWidth: resultsGrid.cellWidth
cellHeight: resultsGrid.cellHeight
cellPadding: resultsGrid.cellPadding
minIconSize: resultsGrid.minIconSize
maxIconSize: resultsGrid.maxIconSize
iconSizeRatio: resultsGrid.iconSizeRatio
hoverUpdatesSelection: resultsGrid.hoverUpdatesSelection
keyboardNavigationActive: resultsGrid.keyboardNavigationActive
currentIndex: resultsGrid.currentIndex
onItemClicked: (idx, modelData) => resultsGrid.itemClicked(idx, modelData)
onItemRightClicked: (idx, modelData, mouseX, mouseY) => {
const modalPos = resultsContainer.parent.mapFromItem(null, mouseX, mouseY)
resultsGrid.itemRightClicked(idx, modelData, modalPos.x, modalPos.y)
}
onKeyboardNavigationReset: resultsGrid.keyboardNavigationReset
}
}
}

View File

@@ -389,124 +389,27 @@ DankPopout {
appLauncher.keyboardNavigationActive = false
}
delegate: Rectangle {
width: ListView.view.width
height: appList.itemHeight
radius: Theme.cornerRadius
color: ListView.isCurrentItem ? Theme.primaryPressed : listMouseArea.containsMouse ? Theme.primaryHoverLight : Theme.surfaceContainerHigh
Row {
anchors.fill: parent
anchors.margins: Theme.spacingM
spacing: Theme.spacingL
Item {
width: appList.iconSize
height: appList.iconSize
anchors.verticalCenter: parent.verticalCenter
visible: model.icon !== undefined && model.icon !== ""
property string iconValue: model.icon || ""
property bool isMaterial: iconValue.indexOf("material:") === 0
property string materialName: isMaterial ? iconValue.substring(9) : ""
DankIcon {
anchors.centerIn: parent
name: parent.materialName
size: appList.iconSize - Theme.spacingM
color: Theme.surfaceText
visible: parent.isMaterial
}
IconImage {
id: listIconImg
anchors.fill: parent
anchors.margins: Theme.spacingXS
source: parent.isMaterial ? "" : Quickshell.iconPath(parent.iconValue, true)
smooth: true
asynchronous: true
visible: !parent.isMaterial && status === Image.Ready
}
Rectangle {
anchors.fill: parent
anchors.leftMargin: Theme.spacingS
anchors.rightMargin: Theme.spacingS
anchors.bottomMargin: Theme.spacingM
visible: !parent.isMaterial && listIconImg.status !== Image.Ready
color: Theme.surfaceLight
radius: Theme.cornerRadius
border.width: 0
border.color: Theme.primarySelected
StyledText {
anchors.centerIn: parent
text: (model.name && model.name.length > 0) ? model.name.charAt(0).toUpperCase() : "A"
font.pixelSize: appList.iconSize * 0.4
color: Theme.primary
font.weight: Font.Bold
}
}
}
Column {
anchors.verticalCenter: parent.verticalCenter
width: (model.icon !== undefined && model.icon !== "") ? (parent.width - appList.iconSize - Theme.spacingL) : parent.width
spacing: Theme.spacingXS
StyledText {
width: parent.width
text: model.name || ""
font.pixelSize: Theme.fontSizeLarge
color: Theme.surfaceText
font.weight: Font.Medium
elide: Text.ElideRight
wrapMode: Text.NoWrap
maximumLineCount: 1
}
StyledText {
width: parent.width
text: model.comment || "Application"
font.pixelSize: Theme.fontSizeMedium
color: Theme.surfaceVariantText
elide: Text.ElideRight
maximumLineCount: 1
visible: appList.showDescription && model.comment && model.comment.length > 0
}
}
}
MouseArea {
id: listMouseArea
anchors.fill: parent
anchors.leftMargin: Theme.spacingS
anchors.rightMargin: Theme.spacingS
anchors.bottomMargin: Theme.spacingM
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton
z: 10
onEntered: {
if (appList.hoverUpdatesSelection && !appList.keyboardNavigationActive)
appList.currentIndex = index
}
onPositionChanged: {
appList.keyboardNavigationReset()
}
onClicked: mouse => {
if (mouse.button === Qt.LeftButton) {
appList.itemClicked(index, model)
} else if (mouse.button === Qt.RightButton) {
var globalPos = mapToItem(null, mouse.x, mouse.y)
var panelPos = contextMenu.parent.mapFromItem(null, globalPos.x, globalPos.y)
appList.itemRightClicked(index, model, panelPos.x, panelPos.y)
}
}
delegate: AppLauncherListDelegate {
listView: appList
itemHeight: appList.itemHeight
iconSize: appList.iconSize
showDescription: appList.showDescription
hoverUpdatesSelection: appList.hoverUpdatesSelection
keyboardNavigationActive: appList.keyboardNavigationActive
isCurrentItem: ListView.isCurrentItem
mouseAreaLeftMargin: Theme.spacingS
mouseAreaRightMargin: Theme.spacingS
mouseAreaBottomMargin: Theme.spacingM
iconMargins: Theme.spacingXS
iconFallbackLeftMargin: Theme.spacingS
iconFallbackRightMargin: Theme.spacingS
iconFallbackBottomMargin: Theme.spacingM
onItemClicked: (idx, modelData) => appList.itemClicked(idx, modelData)
onItemRightClicked: (idx, modelData, mouseX, mouseY) => {
const panelPos = contextMenu.parent.mapFromItem(null, mouseX, mouseY)
appList.itemRightClicked(idx, modelData, panelPos.x, panelPos.y)
}
onKeyboardNavigationReset: appList.keyboardNavigationReset
}
}
@@ -577,112 +480,30 @@ DankPopout {
appLauncher.keyboardNavigationActive = false
}
delegate: Rectangle {
width: appGrid.cellWidth - appGrid.cellPadding
height: appGrid.cellHeight - appGrid.cellPadding
radius: Theme.cornerRadius
color: appGrid.currentIndex === index ? Theme.primaryPressed : gridMouseArea.containsMouse ? Theme.primaryHoverLight : Theme.surfaceContainerHigh
Column {
anchors.centerIn: parent
spacing: Theme.spacingS
Item {
property int iconSize: Math.min(appGrid.maxIconSize, Math.max(appGrid.minIconSize, appGrid.cellWidth * appGrid.iconSizeRatio))
width: iconSize
height: iconSize
anchors.horizontalCenter: parent.horizontalCenter
visible: model.icon !== undefined && model.icon !== ""
property string iconValue: model.icon || ""
property bool isMaterial: iconValue.indexOf("material:") === 0
property string materialName: isMaterial ? iconValue.substring(9) : ""
DankIcon {
anchors.centerIn: parent
name: parent.materialName
size: parent.iconSize - Theme.spacingL
color: Theme.surfaceText
visible: parent.isMaterial
}
IconImage {
id: gridIconImg
anchors.fill: parent
anchors.leftMargin: Theme.spacingS
anchors.rightMargin: Theme.spacingS
anchors.bottomMargin: Theme.spacingS
source: parent.isMaterial ? "" : Quickshell.iconPath(parent.iconValue, true)
smooth: true
asynchronous: true
visible: !parent.isMaterial && status === Image.Ready
}
Rectangle {
anchors.fill: parent
anchors.leftMargin: Theme.spacingS
anchors.rightMargin: Theme.spacingS
anchors.bottomMargin: Theme.spacingS
visible: !parent.isMaterial && gridIconImg.status !== Image.Ready
color: Theme.surfaceLight
radius: Theme.cornerRadius
border.width: 0
border.color: Theme.primarySelected
StyledText {
anchors.centerIn: parent
text: (model.name && model.name.length > 0) ? model.name.charAt(0).toUpperCase() : "A"
font.pixelSize: Math.min(28, parent.width * 0.5)
color: Theme.primary
font.weight: Font.Bold
}
}
}
StyledText {
anchors.horizontalCenter: parent.horizontalCenter
width: appGrid.cellWidth - 12
text: model.name || ""
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
font.weight: Font.Medium
elide: Text.ElideRight
horizontalAlignment: Text.AlignHCenter
maximumLineCount: 1
wrapMode: Text.NoWrap
}
}
MouseArea {
id: gridMouseArea
anchors.fill: parent
anchors.leftMargin: Theme.spacingS
anchors.rightMargin: Theme.spacingS
anchors.bottomMargin: Theme.spacingS
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton
z: 10
onEntered: {
if (appGrid.hoverUpdatesSelection && !appGrid.keyboardNavigationActive)
appGrid.currentIndex = index
}
onPositionChanged: {
appGrid.keyboardNavigationReset()
}
onClicked: mouse => {
if (mouse.button === Qt.LeftButton) {
appGrid.itemClicked(index, model)
} else if (mouse.button === Qt.RightButton) {
var globalPos = mapToItem(null, mouse.x, mouse.y)
var panelPos = contextMenu.parent.mapFromItem(null, globalPos.x, globalPos.y)
appGrid.itemRightClicked(index, model, panelPos.x, panelPos.y)
}
}
delegate: AppLauncherGridDelegate {
gridView: appGrid
cellWidth: appGrid.cellWidth
cellHeight: appGrid.cellHeight
cellPadding: appGrid.cellPadding
minIconSize: appGrid.minIconSize
maxIconSize: appGrid.maxIconSize
iconSizeRatio: appGrid.iconSizeRatio
hoverUpdatesSelection: appGrid.hoverUpdatesSelection
keyboardNavigationActive: appGrid.keyboardNavigationActive
currentIndex: appGrid.currentIndex
mouseAreaLeftMargin: Theme.spacingS
mouseAreaRightMargin: Theme.spacingS
mouseAreaBottomMargin: Theme.spacingS
iconFallbackLeftMargin: Theme.spacingS
iconFallbackRightMargin: Theme.spacingS
iconFallbackBottomMargin: Theme.spacingS
iconMaterialSizeAdjustment: Theme.spacingL
onItemClicked: (idx, modelData) => appGrid.itemClicked(idx, modelData)
onItemRightClicked: (idx, modelData, mouseX, mouseY) => {
const panelPos = contextMenu.parent.mapFromItem(null, mouseX, mouseY)
appGrid.itemRightClicked(idx, modelData, panelPos.x, panelPos.y)
}
onKeyboardNavigationReset: appGrid.keyboardNavigationReset
}
}
}

View File

@@ -7,6 +7,7 @@ import Quickshell.Io
import qs.Common
import qs.Widgets
import qs.Modules
import qs.Services
Variants {
model: {
@@ -76,11 +77,6 @@ Variants {
}
}
WallpaperEngineProc {
id: weProc
monitor: modelData.name
}
Component.onCompleted: {
if (source) {
const formattedSource = source.startsWith("file://") ? source : "file://" + source
@@ -89,34 +85,25 @@ Variants {
isInitialized = true
}
Component.onDestruction: {
weProc.stop()
}
property bool isInitialized: false
property real transitionProgress: 0
readonly property bool transitioning: transitionAnimation.running
onSourceChanged: {
const isWE = source.startsWith("we:")
const isColor = source.startsWith("#")
if (isWE) {
if (!source) {
setWallpaperImmediate("")
} else if (isColor) {
setWallpaperImmediate("")
weProc.start(source.substring(3))
} else {
weProc.stop()
if (!source) {
setWallpaperImmediate("")
} else if (isColor) {
setWallpaperImmediate("")
if (!isInitialized || !currentWallpaper.source) {
setWallpaperImmediate(source.startsWith("file://") ? source : "file://" + source)
isInitialized = true
} else if (CompositorService.isNiri && SessionData.isSwitchingMode) {
setWallpaperImmediate(source.startsWith("file://") ? source : "file://" + source)
} else {
if (!isInitialized || !currentWallpaper.source) {
setWallpaperImmediate(source.startsWith("file://") ? source : "file://" + source)
isInitialized = true
} else {
changeWallpaper(source.startsWith("file://") ? source : "file://" + source)
}
changeWallpaper(source.startsWith("file://") ? source : "file://" + source)
}
}
}
@@ -173,7 +160,7 @@ Variants {
asynchronous: true
smooth: true
cache: true
fillMode: root.getFillMode(SettingsData.wallpaperFillMode)
fillMode: root.getFillMode(SessionData.isGreeterMode ? GreetdSettings.wallpaperFillMode : SettingsData.wallpaperFillMode)
}
Image {
@@ -184,7 +171,7 @@ Variants {
asynchronous: true
smooth: true
cache: true
fillMode: root.getFillMode(SettingsData.wallpaperFillMode)
fillMode: root.getFillMode(SessionData.isGreeterMode ? GreetdSettings.wallpaperFillMode : SettingsData.wallpaperFillMode)
onStatusChanged: {
if (status !== Image.Ready)

View File

@@ -47,6 +47,16 @@ Rectangle {
}
}
const backlight = DisplayService.devices.find(d => d.class === "backlight")
if (backlight) {
return backlight.name
}
const ddc = DisplayService.devices.find(d => d.class === "ddc")
if (ddc) {
return ddc.name
}
return DisplayService.devices.length > 0 ? DisplayService.devices[0].name : ""
}
@@ -224,8 +234,10 @@ Rectangle {
if (deviceClass === "backlight" || deviceClass === "ddc") {
const brightness = DisplayService.getDeviceBrightness(modelData.name)
if (brightness <= 33) return "brightness_low"
if (brightness <= 66) return "brightness_medium"
if (brightness <= 33)
return "brightness_low"
if (brightness <= 66)
return "brightness_medium"
return "brightness_high"
} else if (deviceName.includes("kbd")) {
return "keyboard"
@@ -277,9 +289,12 @@ Rectangle {
StyledText {
text: {
const deviceClass = modelData.class || ""
if (deviceClass === "backlight") return "Backlight device"
if (deviceClass === "ddc") return "DDC/CI monitor"
if (deviceClass === "leds") return "LED device"
if (deviceClass === "backlight")
return "Backlight device"
if (deviceClass === "ddc")
return "DDC/CI monitor"
if (deviceClass === "leds")
return "LED device"
return deviceClass
}
font.pixelSize: Theme.fontSizeSmall
@@ -295,11 +310,17 @@ Rectangle {
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: {
if (screenName && screenName.length > 0 && modelData.name !== currentDeviceName) {
const pins = JSON.parse(JSON.stringify(SettingsData.brightnessDevicePins || {}))
if (pins[screenName]) {
delete pins[screenName]
SettingsData.setBrightnessDevicePins(pins)
}
}
currentDeviceName = modelData.name
deviceNameChanged(modelData.name)
}
}
}
}
}

View File

@@ -376,6 +376,9 @@ Rectangle {
contentHeight: wifiColumn.height
clip: true
property var frozenNetworks: []
property bool menuOpen: false
Column {
id: wifiColumn
width: parent.width
@@ -403,7 +406,7 @@ Rectangle {
}
Repeater {
model: sortedNetworks
model: wifiContent.menuOpen ? wifiContent.frozenNetworks : sortedNetworks
property var sortedNetworks: {
const ssid = NetworkService.currentWifiSSID
@@ -414,6 +417,9 @@ Rectangle {
if (b.ssid === ssid) return 1
return b.signal - a.signal
})
if (!wifiContent.menuOpen) {
wifiContent.frozenNetworks = sorted
}
return sorted
}
delegate: Rectangle {
@@ -494,11 +500,13 @@ Rectangle {
if (networkContextMenu.visible) {
networkContextMenu.close()
} else {
wifiContent.menuOpen = true
networkContextMenu.currentSSID = modelData.ssid
networkContextMenu.currentSecured = modelData.secured
networkContextMenu.currentConnected = modelData.ssid === NetworkService.currentWifiSSID
networkContextMenu.currentSaved = modelData.saved
networkContextMenu.currentSignal = modelData.signal
networkContextMenu.currentAutoconnect = modelData.autoconnect || false
networkContextMenu.popup(optionsButton, -networkContextMenu.width + optionsButton.width, optionsButton.height + Theme.spacingXS)
}
}
@@ -541,6 +549,11 @@ Rectangle {
property bool currentConnected: false
property bool currentSaved: false
property int currentSignal: 0
property bool currentAutoconnect: false
onClosed: {
wifiContent.menuOpen = false
}
background: Rectangle {
color: Theme.popupBackground()
@@ -606,6 +619,29 @@ Rectangle {
}
}
MenuItem {
text: networkContextMenu.currentAutoconnect ? I18n.tr("Disable Autoconnect") : I18n.tr("Enable Autoconnect")
height: (networkContextMenu.currentSaved || networkContextMenu.currentConnected) && DMSService.apiVersion > 13 ? 32 : 0
visible: (networkContextMenu.currentSaved || networkContextMenu.currentConnected) && DMSService.apiVersion > 13
contentItem: StyledText {
text: parent.text
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
leftPadding: Theme.spacingS
verticalAlignment: Text.AlignVCenter
}
background: Rectangle {
color: parent.hovered ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.08) : "transparent"
radius: Theme.cornerRadius / 2
}
onTriggered: {
NetworkService.setWifiAutoconnect(networkContextMenu.currentSSID, !networkContextMenu.currentAutoconnect)
}
}
MenuItem {
text: I18n.tr("Forget Network")
height: networkContextMenu.currentSaved || networkContextMenu.currentConnected ? 32 : 0

View File

@@ -13,7 +13,7 @@ Row {
property string screenName: ""
property var parentScreen: null
signal iconClicked()
signal iconClicked
height: 40
spacing: 0
@@ -36,13 +36,27 @@ Row {
if (deviceName && deviceName.length > 0) {
const found = DisplayService.devices.find(dev => dev.name === deviceName)
return found ? found.name : ""
if (found) {
return found.name
}
}
const currentDeviceName = DisplayService.currentDevice
if (currentDeviceName) {
const found = DisplayService.devices.find(dev => dev.name === currentDeviceName)
return found ? found.name : ""
if (found) {
return found.name
}
}
const backlight = DisplayService.devices.find(d => d.class === "backlight")
if (backlight) {
return backlight.name
}
const ddc = DisplayService.devices.find(d => d.class === "ddc")
if (ddc) {
return ddc.name
}
return DisplayService.devices.length > 0 ? DisplayService.devices[0].name : ""
@@ -69,9 +83,7 @@ Row {
height: Theme.iconSize + Theme.spacingS * 2
anchors.verticalCenter: parent.verticalCenter
radius: (Theme.iconSize + Theme.spacingS * 2) / 2
color: iconArea.containsMouse
? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12)
: Theme.withAlpha(Theme.primary, 0)
color: iconArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) : Theme.withAlpha(Theme.primary, 0)
MouseArea {
id: iconArea
@@ -112,8 +124,10 @@ Row {
if (targetDevice.class === "backlight" || targetDevice.class === "ddc") {
const brightness = targetBrightness
if (brightness <= 33) return "brightness_low"
if (brightness <= 66) return "brightness_medium"
if (brightness <= 33)
return "brightness_low"
if (brightness <= 66)
return "brightness_medium"
return "brightness_high"
} else if (targetDevice.name.includes("kbd")) {
return "keyboard"
@@ -131,10 +145,13 @@ Row {
anchors.verticalCenter: parent.verticalCenter
width: parent.width - (Theme.iconSize + Theme.spacingS * 2)
enabled: DisplayService.brightnessAvailable && targetDeviceName.length > 0
minimum: 1
minimum: {
if (!targetDevice) return 1
return (targetDevice.class === "backlight" || targetDevice.class === "ddc") ? 1 : 0
}
maximum: 100
value: targetBrightness
onSliderValueChanged: function(newValue) {
onSliderValueChanged: function (newValue) {
if (DisplayService.brightnessAvailable && targetDeviceName) {
DisplayService.setBrightness(newValue, targetDeviceName, true)
}
@@ -148,4 +165,4 @@ Row {
active: false
sourceComponent: DankTooltip {}
}
}
}

View File

@@ -531,6 +531,61 @@ Item {
axis: axis
}
MouseArea {
id: scrollArea
anchors.fill: parent
acceptedButtons: Qt.NoButton
propagateComposedEvents: true
z: -1
property real scrollAccumulator: 0
property real touchpadThreshold: 500
property bool actionInProgress: false
Timer {
id: cooldownTimer
interval: 100
onTriggered: parent.actionInProgress = false
}
onWheel: wheel => {
if (actionInProgress) {
wheel.accepted = false
return
}
const deltaY = wheel.angleDelta.y
const deltaX = wheel.angleDelta.x
if (CompositorService.isNiri && Math.abs(deltaX) > Math.abs(deltaY)) {
topBarContent.switchApp(deltaX)
wheel.accepted = false
return
}
const isMouseWheel = Math.abs(deltaY) >= 120 && (Math.abs(deltaY) % 120) === 0
const direction = deltaY < 0 ? 1 : -1
if (isMouseWheel) {
topBarContent.switchWorkspace(direction)
actionInProgress = true
cooldownTimer.restart()
} else {
scrollAccumulator += deltaY
if (Math.abs(scrollAccumulator) >= touchpadThreshold) {
const touchDirection = scrollAccumulator < 0 ? 1 : -1
topBarContent.switchWorkspace(touchDirection)
scrollAccumulator = 0
actionInProgress = true
cooldownTimer.restart()
}
}
wheel.accepted = false
}
}
Item {
id: topBarContent
anchors.fill: parent
@@ -835,60 +890,6 @@ Item {
id: stackContainer
anchors.fill: parent
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.NoButton
propagateComposedEvents: true
z: -1
property real scrollAccumulator: 0
property real touchpadThreshold: 500
property bool actionInProgress: false
Timer {
id: cooldownTimer
interval: 100
onTriggered: parent.actionInProgress = false
}
onWheel: wheel => {
if (actionInProgress) {
wheel.accepted = false
return
}
const deltaY = wheel.angleDelta.y
const deltaX = wheel.angleDelta.x
if (CompositorService.isNiri && Math.abs(deltaX) > Math.abs(deltaY)) {
topBarContent.switchApp(deltaX)
wheel.accepted = false
return
}
const isMouseWheel = Math.abs(deltaY) >= 120 && (Math.abs(deltaY) % 120) === 0
const direction = deltaY < 0 ? 1 : -1
if (isMouseWheel) {
topBarContent.switchWorkspace(direction)
actionInProgress = true
cooldownTimer.restart()
} else {
scrollAccumulator += deltaY
if (Math.abs(scrollAccumulator) >= touchpadThreshold) {
const touchDirection = scrollAccumulator < 0 ? 1 : -1
topBarContent.switchWorkspace(touchDirection)
scrollAccumulator = 0
actionInProgress = true
cooldownTimer.restart()
}
}
wheel.accepted = false
}
}
Item {
id: horizontalStack
anchors.fill: parent

View File

@@ -1,6 +1,7 @@
import QtQuick
import QtQuick.Controls
import Quickshell
import Quickshell.Hyprland
import Quickshell.Io
import qs.Common
import qs.Modules.Plugins
@@ -78,6 +79,16 @@ BasePill {
root.hyprlandKeyboard,
"next"
])
}
}
}
Connections {
target: CompositorService.isHyprland ? Hyprland : null
enabled: CompositorService.isHyprland
function onRawEvent(event) {
if (event.name === "activelayout") {
updateLayout()
}
}

View File

@@ -108,17 +108,11 @@ BasePill {
}
}
MouseArea {
id: customMouseArea
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.RightButton
onPressed: function (mouse){
if (CompositorService.isNiri) {
NiriService.toggleOverview()
} else if (root.hyprlandOverviewLoader?.item) {
root.hyprlandOverviewLoader.item.overviewOpen = !root.hyprlandOverviewLoader.item.overviewOpen
}
onRightClicked: {
if (CompositorService.isNiri) {
NiriService.toggleOverview()
} else if (root.hyprlandOverviewLoader?.item) {
root.hyprlandOverviewLoader.item.overviewOpen = !root.hyprlandOverviewLoader.item.overviewOpen
}
}
}

View File

@@ -202,7 +202,7 @@ Item {
function loadWallpaperDirectory() {
const currentWallpaper = getCurrentWallpaper()
if (!currentWallpaper || currentWallpaper.startsWith("#") || currentWallpaper.startsWith("we:")) {
if (!currentWallpaper || currentWallpaper.startsWith("#")) {
if (CacheData.wallpaperLastPath && CacheData.wallpaperLastPath !== "") {
wallpaperDir = CacheData.wallpaperLastPath
} else {

View File

@@ -43,6 +43,7 @@ Singleton {
property bool lockScreenShowPowerActions: true
property var screenPreferences: ({})
property int animationSpeed: 2
property string wallpaperFillMode: "Fill"
readonly property string defaultFontFamily: "Inter Variable"
readonly property string defaultMonoFontFamily: "Fira Code"
@@ -78,6 +79,7 @@ Singleton {
lockScreenShowPowerActions = settings.lockScreenShowPowerActions !== undefined ? settings.lockScreenShowPowerActions : true
screenPreferences = settings.screenPreferences !== undefined ? settings.screenPreferences : ({})
animationSpeed = settings.animationSpeed !== undefined ? settings.animationSpeed : 2
wallpaperFillMode = settings.wallpaperFillMode !== undefined ? settings.wallpaperFillMode : "Fill"
settingsLoaded = true
if (typeof Theme !== "undefined") {

View File

@@ -147,15 +147,9 @@ Item {
anchors.fill: parent
source: {
var currentWallpaper = SessionData.getMonitorWallpaper(screenName)
if (screenName && currentWallpaper && currentWallpaper.startsWith("we:")) {
const cacheHome = StandardPaths.writableLocation(StandardPaths.GenericCacheLocation).toString()
const baseDir = Paths.strip(cacheHome)
const screenshotPath = baseDir + "/DankMaterialShell/we_screenshots" + "/" + currentWallpaper.substring(3) + ".jpg"
return screenshotPath
}
return (currentWallpaper && !currentWallpaper.startsWith("#")) ? currentWallpaper : ""
}
fillMode: Theme.getFillMode(SettingsData.wallpaperFillMode)
fillMode: Theme.getFillMode(GreetdSettings.wallpaperFillMode)
smooth: true
asynchronous: false
cache: true
@@ -496,14 +490,16 @@ Item {
if (parent.showPassword) {
return GreeterState.passwordBuffer
}
return "•".repeat(Math.min(GreeterState.passwordBuffer.length, 25))
return "•".repeat(GreeterState.passwordBuffer.length)
}
return GreeterState.usernameInput
}
color: Theme.surfaceText
font.pixelSize: (GreeterState.showPasswordInput && !parent.showPassword) ? Theme.fontSizeLarge : Theme.fontSizeMedium
opacity: (GreeterState.showPasswordInput ? GreeterState.passwordBuffer.length > 0 : GreeterState.usernameInput.length > 0) ? 1 : 0
elide: Text.ElideRight
clip: true
elide: Text.ElideNone
horizontalAlignment: implicitWidth > width ? Text.AlignRight : Text.AlignLeft
Behavior on opacity {
NumberAnimation {

View File

@@ -62,6 +62,7 @@ Item {
function sendLockerReadyOnce() {
if (lockerReadySent) return;
if (root.unlocking) return;
lockerReadySent = true;
if (SessionService.loginctlAvailable && DMSService.apiVersion >= 2) {
DMSService.sendRequest("loginctl.lockerReady", null, resp => {
@@ -73,9 +74,10 @@ Item {
function maybeSend() {
if (!lockerReadyArmed) return;
if (root.unlocking) return;
if (!root.visible || root.opacity <= 0) return;
Qt.callLater(() => {
if (root.visible && root.opacity > 0)
if (root.visible && root.opacity > 0 && !root.unlocking)
sendLockerReadyOnce();
});
}
@@ -157,12 +159,6 @@ Item {
anchors.fill: parent
source: {
var currentWallpaper = SessionData.getMonitorWallpaper(screenName)
if (screenName && currentWallpaper && currentWallpaper.startsWith("we:")) {
const cacheHome = StandardPaths.writableLocation(StandardPaths.GenericCacheLocation).toString()
const baseDir = Paths.strip(cacheHome)
const screenshotPath = baseDir + "/DankMaterialShell/we_screenshots" + "/" + currentWallpaper.substring(3) + ".jpg"
return screenshotPath
}
return (currentWallpaper && !currentWallpaper.startsWith("#")) ? currentWallpaper : ""
}
fillMode: Theme.getFillMode(SettingsData.wallpaperFillMode)
@@ -551,12 +547,14 @@ Item {
if (parent.showPassword) {
return root.passwordBuffer
}
return "•".repeat(Math.min(root.passwordBuffer.length, 25))
return "•".repeat(root.passwordBuffer.length)
}
color: Theme.surfaceText
font.pixelSize: parent.showPassword ? Theme.fontSizeMedium : Theme.fontSizeLarge
opacity: (demoMode || root.passwordBuffer.length > 0) ? 1 : 0
elide: Text.ElideRight
clip: true
elide: Text.ElideNone
horizontalAlignment: implicitWidth > width ? Text.AlignRight : Text.AlignLeft
Behavior on opacity {
NumberAnimation {
@@ -1245,6 +1243,7 @@ Item {
lockSecured: !demoMode
onUnlockRequested: {
root.unlocking = true
lockerReadyArmed = false
passwordField.text = ""
root.passwordBuffer = ""
root.unlockRequested()

View File

@@ -11,19 +11,6 @@ DankOSD {
autoHideInterval: 3000
enableMouseInteraction: true
property var brightnessDebounceTimer: Timer {
property int pendingValue: 0
interval: {
const deviceInfo = DisplayService.getCurrentDeviceInfo()
return (deviceInfo && deviceInfo.class === "ddc") ? 200 : 50
}
repeat: false
onTriggered: {
DisplayService.setBrightnessInternal(pendingValue, DisplayService.lastIpcDevice)
}
}
Connections {
target: DisplayService
function onBrightnessChanged() {
@@ -73,7 +60,11 @@ DankOSD {
height: 40
x: parent.gap * 2 + Theme.iconSize
anchors.verticalCenter: parent.verticalCenter
minimum: 1
minimum: {
const deviceInfo = DisplayService.getCurrentDeviceInfo()
if (!deviceInfo) return 1
return (deviceInfo.class === "backlight" || deviceInfo.class === "ddc") ? 1 : 0
}
maximum: 100
enabled: DisplayService.brightnessAvailable
showValue: true
@@ -89,8 +80,7 @@ DankOSD {
onSliderValueChanged: newValue => {
if (DisplayService.brightnessAvailable) {
root.brightnessDebounceTimer.pendingValue = newValue
root.brightnessDebounceTimer.restart()
DisplayService.setBrightness(newValue, DisplayService.lastIpcDevice, true)
resetHideTimer()
}
}
@@ -101,8 +91,7 @@ DankOSD {
onSliderDragFinished: finalValue => {
if (DisplayService.brightnessAvailable) {
root.brightnessDebounceTimer.stop()
DisplayService.setBrightnessInternal(finalValue, DisplayService.lastIpcDevice)
DisplayService.setBrightness(finalValue, DisplayService.lastIpcDevice, true)
}
}
@@ -110,13 +99,13 @@ DankOSD {
target: DisplayService
function onBrightnessChanged() {
if (!brightnessSlider.pressed) {
if (!brightnessSlider.pressed && brightnessSlider.value !== DisplayService.brightnessLevel) {
brightnessSlider.value = DisplayService.brightnessLevel
}
}
function onDeviceSwitched() {
if (!brightnessSlider.pressed) {
if (!brightnessSlider.pressed && brightnessSlider.value !== DisplayService.brightnessLevel) {
brightnessSlider.value = DisplayService.brightnessLevel
}
}
@@ -124,13 +113,4 @@ DankOSD {
}
}
}
onOsdShown: {
if (DisplayService.brightnessAvailable && contentLoader.item) {
const slider = contentLoader.item.children[0].children[1]
if (slider) {
slider.value = DisplayService.brightnessLevel
}
}
}
}

View File

@@ -33,6 +33,7 @@ Item {
readonly property real bottomMargin: isVerticalOrientation ? (isBottomBarEdge && isLast ? barEdgeExtension : (isLast ? gapExtension : gapExtension / 2)) : 0
signal clicked()
signal rightClicked()
width: isVerticalOrientation ? barThickness : visualWidth
height: isVerticalOrientation ? visualHeight : barThickness
@@ -69,8 +70,12 @@ Item {
height: root.height + root.topMargin + root.bottomMargin
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton
onPressed: {
acceptedButtons: Qt.LeftButton | Qt.RightButton
onPressed: function (mouse) {
if (mouse.button === Qt.RightButton) {
root.rightClicked()
return
}
if (popoutTarget && popoutTarget.setTriggerPosition) {
const globalPos = root.visualContent.mapToGlobal(0, 0)
const currentScreen = parentScreen || Screen

View File

@@ -145,14 +145,14 @@ Item {
Column {
width: parent.width
spacing: 0
spacing: Theme.spacingS
leftPadding: Theme.spacingM
rightPadding: Theme.spacingM
visible: DisplayService.gammaControlAvailable
DankDropdown {
width: parent.width - parent.leftPadding - parent.rightPadding
text: I18n.tr("Temperature")
text: I18n.tr("Night Temperature")
description: I18n.tr("Color temperature for night mode")
currentValue: SessionData.nightModeTemperature + "K"
options: {
@@ -165,6 +165,30 @@ Item {
onValueChanged: value => {
var temp = parseInt(value.replace("K", ""))
SessionData.setNightModeTemperature(temp)
if (SessionData.nightModeHighTemperature < temp) {
SessionData.setNightModeHighTemperature(temp)
}
}
}
DankDropdown {
width: parent.width - parent.leftPadding - parent.rightPadding
text: I18n.tr("Day Temperature")
description: I18n.tr("Color temperature for day time")
currentValue: SessionData.nightModeHighTemperature + "K"
options: {
var temps = []
var minTemp = SessionData.nightModeTemperature
for (var i = Math.max(2500, minTemp); i <= 10000; i += 500) {
temps.push(i + "K")
}
return temps
}
onValueChanged: value => {
var temp = parseInt(value.replace("K", ""))
if (temp >= SessionData.nightModeTemperature) {
SessionData.setNightModeHighTemperature(temp)
}
}
}
}

View File

@@ -130,27 +130,10 @@ Item {
CachingImage {
anchors.fill: parent
anchors.margins: 1
property var weExtensions: [".jpg", ".jpeg", ".png", ".webp", ".gif", ".bmp", ".tga"]
property int weExtIndex: 0
source: {
var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath
if (currentWallpaper && currentWallpaper.startsWith("we:")) {
var sceneId = currentWallpaper.substring(3)
return StandardPaths.writableLocation(StandardPaths.HomeLocation) + "/.local/share/Steam/steamapps/workshop/content/431960/" + sceneId + "/preview" + weExtensions[weExtIndex]
}
return (currentWallpaper !== "" && !currentWallpaper.startsWith("#")) ? "file://" + currentWallpaper : ""
}
onStatusChanged: {
var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath
if (currentWallpaper && currentWallpaper.startsWith("we:") && status === Image.Error) {
if (weExtIndex < weExtensions.length - 1) {
weExtIndex++
source = StandardPaths.writableLocation(StandardPaths.HomeLocation) + "/.local/share/Steam/steamapps/workshop/content/431960/" + currentWallpaper.substring(3) + "/preview" + weExtensions[weExtIndex]
} else {
visible = false
}
}
}
fillMode: Image.PreserveAspectCrop
visible: {
var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath
@@ -454,59 +437,6 @@ Item {
}
}
Rectangle {
width: parent.width
height: 1
color: Theme.outline
opacity: 0.2
visible: CompositorService.isNiri
}
Row {
width: parent.width
spacing: Theme.spacingM
visible: CompositorService.isNiri
DankIcon {
name: "blur_on"
size: Theme.iconSize
color: SettingsData.blurWallpaperOnOverview ? Theme.primary : Theme.surfaceVariantText
anchors.verticalCenter: parent.verticalCenter
}
Column {
width: parent.width - Theme.iconSize - Theme.spacingM - blurOverviewToggle.width - Theme.spacingM
spacing: Theme.spacingXS
anchors.verticalCenter: parent.verticalCenter
StyledText {
text: I18n.tr("Blur on Overview")
font.pixelSize: Theme.fontSizeLarge
font.weight: Font.Medium
color: Theme.surfaceText
}
StyledText {
text: I18n.tr("Blur wallpaper when niri overview is open")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceVariantText
wrapMode: Text.WordWrap
width: parent.width
}
}
DankToggle {
id: blurOverviewToggle
anchors.verticalCenter: parent.verticalCenter
checked: SettingsData.blurWallpaperOnOverview
onToggled: checked => {
SettingsData.setBlurWallpaperOnOverview(checked)
}
}
}
// Per-Mode Wallpaper Section - Full Width
Rectangle {
width: parent.width
height: 1
@@ -561,9 +491,450 @@ Item {
}
}
}
Column {
width: parent.width
spacing: Theme.spacingM
visible: SessionData.perModeWallpaper
Row {
anchors.horizontalCenter: parent.horizontalCenter
width: parent.width
spacing: Theme.spacingL
Column {
width: (parent.width - Theme.spacingL) / 2
spacing: Theme.spacingS
StyledText {
text: I18n.tr("Light Mode")
font.pixelSize: Theme.fontSizeMedium
color: Theme.surfaceText
font.weight: Font.Medium
}
StyledRect {
width: parent.width
height: width * 9 / 16
radius: Theme.cornerRadius
color: Theme.surfaceVariant
border.color: Theme.outline
border.width: 0
CachingImage {
anchors.fill: parent
anchors.margins: 1
source: {
var lightWallpaper = SessionData.wallpaperPathLight
return (lightWallpaper !== "" && !lightWallpaper.startsWith("#")) ? "file://" + lightWallpaper : ""
}
fillMode: Image.PreserveAspectCrop
visible: {
var lightWallpaper = SessionData.wallpaperPathLight
return lightWallpaper !== "" && !lightWallpaper.startsWith("#")
}
maxCacheSize: 160
layer.enabled: true
layer.effect: MultiEffect {
maskEnabled: true
maskSource: lightMask
maskThresholdMin: 0.5
maskSpreadAtMin: 1
}
}
Rectangle {
anchors.fill: parent
anchors.margins: 1
radius: Theme.cornerRadius - 1
color: {
var lightWallpaper = SessionData.wallpaperPathLight
return lightWallpaper.startsWith("#") ? lightWallpaper : "transparent"
}
visible: {
var lightWallpaper = SessionData.wallpaperPathLight
return lightWallpaper !== "" && lightWallpaper.startsWith("#")
}
}
Rectangle {
id: lightMask
anchors.fill: parent
anchors.margins: 1
radius: Theme.cornerRadius - 1
color: "black"
visible: false
layer.enabled: true
}
DankIcon {
anchors.centerIn: parent
name: "light_mode"
size: Theme.iconSizeLarge
color: Theme.surfaceVariantText
visible: SessionData.wallpaperPathLight === ""
}
Rectangle {
anchors.fill: parent
anchors.margins: 1
radius: Theme.cornerRadius - 1
color: Qt.rgba(0, 0, 0, 0.7)
visible: lightModeMouseArea.containsMouse
Row {
anchors.centerIn: parent
spacing: 4
Rectangle {
width: 28
height: 28
radius: 14
color: Qt.rgba(255, 255, 255, 0.9)
DankIcon {
anchors.centerIn: parent
name: "folder_open"
size: 16
color: "black"
}
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: {
lightWallpaperBrowserLoader.active = true
}
}
}
Rectangle {
width: 28
height: 28
radius: 14
color: Qt.rgba(255, 255, 255, 0.9)
DankIcon {
anchors.centerIn: parent
name: "palette"
size: 16
color: "black"
}
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: {
if (PopoutService.colorPickerModal) {
var lightWallpaper = SessionData.wallpaperPathLight
PopoutService.colorPickerModal.selectedColor = lightWallpaper.startsWith("#") ? lightWallpaper : Theme.primary
PopoutService.colorPickerModal.pickerTitle = "Choose Light Mode Color"
PopoutService.colorPickerModal.onColorSelectedCallback = function(selectedColor) {
SessionData.wallpaperPathLight = selectedColor
SessionData.syncWallpaperForCurrentMode()
SessionData.saveSettings()
}
PopoutService.colorPickerModal.show()
}
}
}
}
Rectangle {
width: 28
height: 28
radius: 14
color: Qt.rgba(255, 255, 255, 0.9)
visible: SessionData.wallpaperPathLight !== ""
DankIcon {
anchors.centerIn: parent
name: "clear"
size: 16
color: "black"
}
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: {
SessionData.wallpaperPathLight = ""
SessionData.syncWallpaperForCurrentMode()
SessionData.saveSettings()
}
}
}
}
}
MouseArea {
id: lightModeMouseArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
propagateComposedEvents: true
acceptedButtons: Qt.NoButton
}
}
StyledText {
text: {
var lightWallpaper = SessionData.wallpaperPathLight
return lightWallpaper ? lightWallpaper.split('/').pop() : "Not set"
}
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceVariantText
elide: Text.ElideMiddle
maximumLineCount: 1
width: parent.width
}
}
Column {
width: (parent.width - Theme.spacingL) / 2
spacing: Theme.spacingS
StyledText {
text: I18n.tr("Dark Mode")
font.pixelSize: Theme.fontSizeMedium
color: Theme.surfaceText
font.weight: Font.Medium
}
StyledRect {
width: parent.width
height: width * 9 / 16
radius: Theme.cornerRadius
color: Theme.surfaceVariant
border.color: Theme.outline
border.width: 0
CachingImage {
anchors.fill: parent
anchors.margins: 1
source: {
var darkWallpaper = SessionData.wallpaperPathDark
return (darkWallpaper !== "" && !darkWallpaper.startsWith("#")) ? "file://" + darkWallpaper : ""
}
fillMode: Image.PreserveAspectCrop
visible: {
var darkWallpaper = SessionData.wallpaperPathDark
return darkWallpaper !== "" && !darkWallpaper.startsWith("#")
}
maxCacheSize: 160
layer.enabled: true
layer.effect: MultiEffect {
maskEnabled: true
maskSource: darkMask
maskThresholdMin: 0.5
maskSpreadAtMin: 1
}
}
Rectangle {
anchors.fill: parent
anchors.margins: 1
radius: Theme.cornerRadius - 1
color: {
var darkWallpaper = SessionData.wallpaperPathDark
return darkWallpaper.startsWith("#") ? darkWallpaper : "transparent"
}
visible: {
var darkWallpaper = SessionData.wallpaperPathDark
return darkWallpaper !== "" && darkWallpaper.startsWith("#")
}
}
Rectangle {
id: darkMask
anchors.fill: parent
anchors.margins: 1
radius: Theme.cornerRadius - 1
color: "black"
visible: false
layer.enabled: true
}
DankIcon {
anchors.centerIn: parent
name: "dark_mode"
size: Theme.iconSizeLarge
color: Theme.surfaceVariantText
visible: SessionData.wallpaperPathDark === ""
}
Rectangle {
anchors.fill: parent
anchors.margins: 1
radius: Theme.cornerRadius - 1
color: Qt.rgba(0, 0, 0, 0.7)
visible: darkModeMouseArea.containsMouse
Row {
anchors.centerIn: parent
spacing: 4
Rectangle {
width: 28
height: 28
radius: 14
color: Qt.rgba(255, 255, 255, 0.9)
DankIcon {
anchors.centerIn: parent
name: "folder_open"
size: 16
color: "black"
}
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: {
darkWallpaperBrowserLoader.active = true
}
}
}
Rectangle {
width: 28
height: 28
radius: 14
color: Qt.rgba(255, 255, 255, 0.9)
DankIcon {
anchors.centerIn: parent
name: "palette"
size: 16
color: "black"
}
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: {
if (PopoutService.colorPickerModal) {
var darkWallpaper = SessionData.wallpaperPathDark
PopoutService.colorPickerModal.selectedColor = darkWallpaper.startsWith("#") ? darkWallpaper : Theme.primary
PopoutService.colorPickerModal.pickerTitle = "Choose Dark Mode Color"
PopoutService.colorPickerModal.onColorSelectedCallback = function(selectedColor) {
SessionData.wallpaperPathDark = selectedColor
SessionData.syncWallpaperForCurrentMode()
SessionData.saveSettings()
}
PopoutService.colorPickerModal.show()
}
}
}
}
Rectangle {
width: 28
height: 28
radius: 14
color: Qt.rgba(255, 255, 255, 0.9)
visible: SessionData.wallpaperPathDark !== ""
DankIcon {
anchors.centerIn: parent
name: "clear"
size: 16
color: "black"
}
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: {
SessionData.wallpaperPathDark = ""
SessionData.syncWallpaperForCurrentMode()
SessionData.saveSettings()
}
}
}
}
}
MouseArea {
id: darkModeMouseArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
propagateComposedEvents: true
acceptedButtons: Qt.NoButton
}
}
StyledText {
text: {
var darkWallpaper = SessionData.wallpaperPathDark
return darkWallpaper ? darkWallpaper.split('/').pop() : "Not set"
}
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceVariantText
elide: Text.ElideMiddle
maximumLineCount: 1
width: parent.width
}
}
}
}
}
Rectangle {
width: parent.width
height: 1
color: Theme.outline
opacity: 0.2
visible: CompositorService.isNiri
}
Row {
width: parent.width
spacing: Theme.spacingM
visible: CompositorService.isNiri
DankIcon {
name: "blur_on"
size: Theme.iconSize
color: SettingsData.blurWallpaperOnOverview ? Theme.primary : Theme.surfaceVariantText
anchors.verticalCenter: parent.verticalCenter
}
Column {
width: parent.width - Theme.iconSize - Theme.spacingM - blurOverviewToggle.width - Theme.spacingM
spacing: Theme.spacingXS
anchors.verticalCenter: parent.verticalCenter
StyledText {
text: I18n.tr("Blur on Overview")
font.pixelSize: Theme.fontSizeLarge
font.weight: Font.Medium
color: Theme.surfaceText
}
StyledText {
text: I18n.tr("Blur wallpaper when niri overview is open")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceVariantText
wrapMode: Text.WordWrap
width: parent.width
}
}
DankToggle {
id: blurOverviewToggle
anchors.verticalCenter: parent.verticalCenter
checked: SettingsData.blurWallpaperOnOverview
onToggled: checked => {
SettingsData.setBlurWallpaperOnOverview(checked)
}
}
}
// Per-Monitor Wallpaper Section - Full Width
Rectangle {
width: parent.width
height: 1
@@ -1775,4 +2146,58 @@ Item {
}
}
}
Loader {
id: lightWallpaperBrowserLoader
active: false
asynchronous: true
sourceComponent: FileBrowserModal {
parentModal: personalizationTab.parentModal
Component.onCompleted: {
open()
}
browserTitle: "Select Light Mode Wallpaper"
browserIcon: "light_mode"
browserType: "wallpaper"
showHiddenFiles: true
fileExtensions: ["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif", "*.webp"]
onFileSelected: path => {
SessionData.wallpaperPathLight = path
SessionData.syncWallpaperForCurrentMode()
SessionData.saveSettings()
close()
}
onDialogClosed: {
Qt.callLater(() => lightWallpaperBrowserLoader.active = false)
}
}
}
Loader {
id: darkWallpaperBrowserLoader
active: false
asynchronous: true
sourceComponent: FileBrowserModal {
parentModal: personalizationTab.parentModal
Component.onCompleted: {
open()
}
browserTitle: "Select Dark Mode Wallpaper"
browserIcon: "dark_mode"
browserType: "wallpaper"
showHiddenFiles: true
fileExtensions: ["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif", "*.webp"]
onFileSelected: path => {
SessionData.wallpaperPathDark = path
SessionData.syncWallpaperForCurrentMode()
SessionData.saveSettings()
close()
}
onDialogClosed: {
Qt.callLater(() => darkWallpaperBrowserLoader.active = false)
}
}
}
}

View File

@@ -67,7 +67,7 @@ PanelWindow {
}
}
width: shouldBeVisible ? Math.min(900, messageText.implicitWidth + statusIcon.width + Theme.spacingM + (ToastService.hasDetails ? (expandButton.width + closeButton.width + 4) : 0) + Theme.spacingL * 2 + Theme.spacingM * 2) : frozenWidth
width: shouldBeVisible ? Math.min(900, messageText.implicitWidth + statusIcon.width + Theme.spacingM + (ToastService.hasDetails ? (expandButton.width + closeButton.width + 4) : (ToastService.currentLevel === ToastService.levelError ? closeButton.width + Theme.spacingS : 0)) + Theme.spacingL * 2 + Theme.spacingM * 2) : frozenWidth
height: toastContent.height + Theme.spacingL * 2
anchors.horizontalCenter: parent.horizontalCenter
y: Theme.barHeight - 4 + SettingsData.dankBarSpacing + 2
@@ -146,8 +146,10 @@ PanelWindow {
font.weight: Font.Medium
anchors.left: statusIcon.right
anchors.leftMargin: Theme.spacingM
anchors.right: ToastService.hasDetails ? expandButton.left : parent.right
anchors.rightMargin: ToastService.hasDetails ? Theme.spacingS : 0
anchors.verticalCenter: parent.verticalCenter
width: implicitWidth
elide: Text.ElideRight
wrapMode: Text.NoWrap
}
@@ -196,7 +198,7 @@ PanelWindow {
buttonSize: Theme.iconSize + 8
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
visible: ToastService.hasDetails
visible: ToastService.hasDetails || ToastService.currentLevel === ToastService.levelError
onClicked: {
ToastService.hideToast()

View File

@@ -104,11 +104,6 @@ Variants {
}
}
WallpaperEngineProc {
id: weProc
monitor: modelData.name
}
Component.onCompleted: {
if (source) {
const formattedSource = source.startsWith("file://") ? source : "file://" + source
@@ -117,30 +112,21 @@ Variants {
isInitialized = true
}
Component.onDestruction: {
weProc.stop()
}
onSourceChanged: {
const isWE = source.startsWith("we:")
const isColor = source.startsWith("#")
if (isWE) {
if (!source) {
setWallpaperImmediate("")
} else if (isColor) {
setWallpaperImmediate("")
weProc.start(source.substring(3))
} else {
weProc.stop()
if (!source) {
setWallpaperImmediate("")
} else if (isColor) {
setWallpaperImmediate("")
if (!isInitialized || !currentWallpaper.source) {
setWallpaperImmediate(source.startsWith("file://") ? source : "file://" + source)
isInitialized = true
} else if (CompositorService.isNiri && SessionData.isSwitchingMode) {
setWallpaperImmediate(source.startsWith("file://") ? source : "file://" + source)
} else {
if (!isInitialized || !currentWallpaper.source) {
setWallpaperImmediate(source.startsWith("file://") ? source : "file://" + source)
isInitialized = true
} else {
changeWallpaper(source.startsWith("file://") ? source : "file://" + source)
}
changeWallpaper(source.startsWith("file://") ? source : "file://" + source)
}
}
}

View File

@@ -1,63 +0,0 @@
import QtCore
import QtQuick
import Quickshell.Io
import Quickshell
import qs.Common
Item {
id: root
property string monitor: ""
property string sceneId: ""
property string pendingSceneId: ""
Process {
id: weProcess
running: false
command: []
}
Process {
id: killer
running: false
command: []
onExited: (code) => {
if (pendingSceneId !== "") {
const cacheHome = StandardPaths.writableLocation(StandardPaths.GenericCacheLocation).toString()
const baseDir = Paths.strip(cacheHome)
const outDir = baseDir + "/DankMaterialShell/we_screenshots"
const outPath = outDir + "/" + pendingSceneId + ".jpg"
Quickshell.execDetached(["mkdir", "-p", outDir])
weProcess.command = [
"linux-wallpaperengine",
"--screen-root", monitor,
"--screenshot", outPath,
"--bg", pendingSceneId,
"--silent"
]
weProcess.running = true
sceneId = pendingSceneId
pendingSceneId = ""
}
}
}
function start(newSceneId) {
if (sceneId === newSceneId && weProcess.running) {
return
}
pendingSceneId = newSceneId
stop()
}
function stop() {
if (weProcess.running) {
weProcess.running = false
}
killer.command = [
"pkill", "-f",
"linux-wallpaperengine --screen-root " + monitor
]
killer.running = true
}
}

View File

@@ -45,6 +45,13 @@ Item {
action: "toast:Test Item 3 activated!",
categories: ["LauncherExample"]
},
{
name: "Unicode Icon Example",
icon: "unicode:🚀",
comment: "Demonstrates unicode/emoji icon support",
action: "toast:Unicode icons work great!",
categories: ["LauncherExample"]
},
{
name: "Example Copy Action",
icon: "material:content_copy",

View File

@@ -97,7 +97,7 @@ function executeItem(item): void
**Icon Types**:
The `icon` field supports three formats:
The `icon` field supports four formats:
1. **Material Design Icons** - Use `material:` prefix:
```javascript
@@ -105,13 +105,19 @@ The `icon` field supports three formats:
```
Examples: `material:star`, `material:favorite`, `material:settings`
2. **Desktop Theme Icons** - Use icon name directly:
2. **Unicode/Emoji Icons** - Use `unicode:` prefix:
```javascript
icon: "unicode:🚀" // Unicode character or emoji
```
Display any Unicode character or emoji as the icon. Examples: `unicode:😀`, `unicode:⚡`, `unicode:🎨`
3. **Desktop Theme Icons** - Use icon name directly:
```javascript
icon: "firefox" // Uses system icon theme
```
Examples: `firefox`, `chrome`, `folder`, `text-editor`
3. **No Icon** - Omit the `icon` field entirely:
4. **No Icon** - Omit the `icon` field entirely:
```javascript
{
name: "😀 Grinning Face",
@@ -121,7 +127,7 @@ The `icon` field supports three formats:
categories: ["MyPlugin"]
}
```
Perfect for emoji pickers or text-only items where the icon area should be hidden
When icon is omitted, the launcher hides the icon area and displays only text
**Action Format**: `type:data` where:
- `type` - Action handler (toast, copy, script, etc.)

View File

@@ -1228,7 +1228,7 @@ Each item returned by `getItems()` must include:
### Icon Types
The `icon` field supports three formats:
The `icon` field supports four formats:
**1. Material Design Icons** - Use the `material:` prefix:
```javascript
@@ -1242,7 +1242,19 @@ The `icon` field supports three formats:
```
Available icons: Any icon from Material Symbols font (e.g., `lightbulb`, `star`, `favorite`, `settings`, `terminal`, `translate`, `sentiment_satisfied`)
**2. Desktop Theme Icons** - Use icon name directly:
**2. Unicode/Emoji Icons** - Use the `unicode:` prefix:
```javascript
{
name: "Grinning Face",
icon: "unicode:😀", // Unicode character or emoji
comment: "Copy emoji to clipboard",
action: "copy:😀",
categories: ["MyPlugin"]
}
```
Display any Unicode character or emoji as the icon. The character is rendered at 70-80% of the icon size with proper theming. Perfect for emoji pickers, symbol selectors, or character libraries.
**3. Desktop Theme Icons** - Use icon name directly:
```javascript
{
name: "Firefox",
@@ -1254,7 +1266,7 @@ Available icons: Any icon from Material Symbols font (e.g., `lightbulb`, `star`,
```
Uses the user's installed icon theme. Common examples: `firefox`, `chrome`, `folder`, `text-editor`
**3. No Icon** - Omit the `icon` field entirely:
**4. No Icon** - Omit the `icon` field entirely:
```javascript
{
name: "😀 Grinning Face",
@@ -1264,7 +1276,7 @@ Uses the user's installed icon theme. Common examples: `firefox`, `chrome`, `fol
categories: ["MyPlugin"]
}
```
When `icon` is omitted, the launcher hides the icon area and displays only the text, giving full width to the item name. Perfect for emoji pickers or text-only items.
When `icon` is omitted, the launcher hides the icon area and displays only the text, giving full width to the item name. Useful when you want emojis or symbols to be part of the item name itself.
### Trigger System

823
README.md
View File

@@ -1,824 +1,175 @@
# DankMaterialShell (dms)
<div align=center>
<div align="center">
<a href="https://danklinux.com">
<img src="assets/danklogo2.svg" alt="DankMaterialShell Logo" width="200">
</a>
### A modern Wayland desktop shell
Built with [Quickshell](https://quickshell.org/) and [Go](https://go.dev/)
[![Documentation](https://img.shields.io/badge/docs-danklinux.com-9ccbfb?style=for-the-badge&labelColor=101418)](https://danklinux.com/docs)
[![GitHub stars](https://img.shields.io/github/stars/AvengeMedia/DankMaterialShell?style=for-the-badge&labelColor=101418&color=ffd700)](https://github.com/AvengeMedia/DankMaterialShell/stargazers)
[![GitHub License](https://img.shields.io/github/license/AvengeMedia/DankMaterialShell?style=for-the-badge&labelColor=101418&color=b9c8da)](https://github.com/AvengeMedia/DankMaterialShell/blob/master/LICENSE)
[![GitHub release](https://img.shields.io/github/v/release/AvengeMedia/DankMaterialShell?style=for-the-badge&labelColor=101418&color=9ccbfb)](https://github.com/AvengeMedia/DankMaterialShell/releases)
[![GitHub last commit](https://img.shields.io/github/last-commit/AvengeMedia/DankMaterialShell?style=for-the-badge&labelColor=101418&color=9ccbfb)](https://github.com/AvengeMedia/DankMaterialShell/commits/master)
[![AUR version](https://img.shields.io/aur/version/dms-shell-bin?style=for-the-badge&labelColor=101418&color=9ccbfb)](https://aur.archlinux.org/packages/dms-shell-bin)
[![AUR version (git)](https://img.shields.io/aur/version/dms-shell-git?style=for-the-badge&labelColor=101418&color=9ccbfb&label=AUR%20(git))](https://aur.archlinux.org/packages/dms-shell-git)
[![Ko-Fi donate](https://img.shields.io/badge/donate-kofi?style=for-the-badge&logo=ko-fi&logoColor=ffffff&label=ko-fi&labelColor=101418&color=f16061&link=https%3A%2F%2Fko-fi.com%2Favengemediallc)](https://ko-fi.com/avengemediallc)
</div>
A modern Wayland desktop shell built with [Quickshell](https://quickshell.org/) and [Go](https://go.dev/). Optimized for the [niri](https://github.com/YaLTeR/niri), [Hyprland](https://hyprland.org/), [sway](https://swaywm.org/), and [dwl/mangowc](https://github.com/DreamMaoMao/mangowc) compositors.
DankMaterialShell is a complete desktop shell for [niri](https://github.com/YaLTeR/niri), [Hyprland](https://hypr.land), [MangoWC](https://github.com/DreamMaoMao/mangowc), [Sway](https://swaywm.org), and other Wayland compositors. It replaces waybar, swaylock, swayidle, mako, fuzzel, polkit, and everything else you'd normally stitch together to make a desktop - all in one cohesive package with a gorgeous interface.
Features notifications, app launcher, wallpaper customization, and fully customizable with [plugins](https://github.com/AvengeMedia/dms-plugin-registry).
## Components
## Screenshots
DankMaterialShell combines two main components:
- **[QML/UI Layer](https://github.com/AvengeMedia/DankMaterialShell)** (this repo) - All the visual components, widgets, and shell interface built with Quickshell
- **[Go Backend](https://github.com/AvengeMedia/danklinux)** - System integration, IPC, process management, and core services
---
## See it in Action
<div align="center">
<div style="max-width: 700px; margin: 0 auto;">
https://github.com/user-attachments/assets/1200a739-7770-4601-8b85-695ca527819a
</div>
</div>
<details><summary><strong>View More Screenshots</strong></summary>
<br>
<details><summary><strong>More Screenshots</strong></summary>
<div align="center">
### Desktop Overview
<img src="https://github.com/user-attachments/assets/203a9678-c3b7-4720-bb97-853a511ac5c8" width="600" alt="Desktop" />
<img src="https://github.com/user-attachments/assets/203a9678-c3b7-4720-bb97-853a511ac5c8" width="600" alt="DankMaterialShell Desktop" />
<img src="https://github.com/user-attachments/assets/a937cf35-a43b-4558-8c39-5694ff5fcac4" width="600" alt="Dashboard" />
### Dashboard
<img src="https://github.com/user-attachments/assets/2da00ea1-8921-4473-a2a9-44a44535a822" width="450" alt="Launcher" />
<img width="600" alt="DankDash" src="https://github.com/user-attachments/assets/a937cf35-a43b-4558-8c39-5694ff5fcac4" />
### Application Launcher
<img src="https://github.com/user-attachments/assets/2da00ea1-8921-4473-a2a9-44a44535a822" width="450" alt="Spotlight Launcher" />
### Control Center
<img width="600" alt="Control Center" src="https://github.com/user-attachments/assets/732c30de-5f4a-4a2b-a995-c8ab656cecd5" />
### System Monitor
<img src="https://github.com/user-attachments/assets/b3c817ec-734d-4974-929f-2d11a1065349" width="600" alt="System Monitor" />
### Widget Customization
<img src="https://github.com/user-attachments/assets/903f7c60-146f-4fb3-a75d-a4823828f298" width="500" alt="Widget Customization" />
### Lock Screen
<img src="https://github.com/user-attachments/assets/3fa07de2-c1b0-4e57-8f25-3830ac6baf4f" width="600" alt="Lock Screen" />
### Dynamic Theming
<img src="https://github.com/user-attachments/assets/a81a68e3-4f7e-4246-8199-0fef1013d4cf" width="700" alt="Auto Theme" />
### Notification Center
<img src="https://github.com/user-attachments/assets/07cbde9a-0242-4989-9f97-5765c6458c85" width="350" alt="Notification Center" />
### Dock
<img src="https://github.com/user-attachments/assets/e6999daf-f7bf-4329-98fa-0ce4f0e7219c" width="400" alt="Dock" />
<img src="https://github.com/user-attachments/assets/732c30de-5f4a-4a2b-a995-c8ab656cecd5" width="600" alt="Control Center" />
</div>
</details>
## Quick start (Arch, Fedora, Debian, Ubuntu, openSUSE)
---
## Quick Install
```bash
curl -fsSL https://install.danklinux.com | sh
```
*Installs dms & dependencies*
*Or skip to [Installation](https://github.com/AvengeMedia/DankMaterialShell?tab=readme-ov-file#installation)*
That's it. One command installs dms and all dependencies on Arch, Fedora, Debian, Ubuntu, or openSUSE.
<details><summary><strong>Features</strong></summary>
**[Manual Installation Guide →](https://danklinux.com/docs/dankmaterialshell/installation)**
**Core Widgets:**
- **TopBar**: fully customizable bar where widgets can be added, removed, and re-arranged.
- **App Launcher** with fuzzy search, categories, and auto-sorting by most used apps.
- **Workspace Switcher** Configurable workspace switcher.
- **Focused Window** Displays the currently focused window app name and title.
- **Running Apps** A view of all running apps, sorted by monitor, workspace, then position on workspace.
- **Media Player** Short form media player with equalizer, song title, and controls.
- **Clock** Clock and date widget
- **Weather** Weather widget with customizable location
- **System Tray** System tray applets with context menus.
- **Process Monitor** CPU, RAM, and GPU usage percentages, temperatures. (requires [dgop](https://github.com/AvengeMedia/dgop))
- **Power/Battery** Power/Battery widget for battery metrics and power profile changing.
- **Notifications** Notification bell with a notification center popup
- **Control Center** High-level view of network, bluetooth, and audio status
- **Privacy Indicator** Attempts to reveal if a microphone or screen recording session is active, relying on Pipewire data sources
- **Idle Inhibitor** Creates a systemd idle inhibitor to prevent sleep/locking from occuring.
- **Spotlight Launcher** A central search/launcher - apps, files, emojis, running apps, calculator, command running - and basically anything since it can be enriched with plugins.
- **Central Command** A combined music, weather, calendar, and events PopUp.
- **Process List** A process list, with system metrics and information. More detailed modal available via IPC.
- **Notification Center** A center for notifications that has support for grouping.
- **Dock** A dock with pinned apps support, recent apps support, and currently running application support.
- **Control Center** A full control center with user profile information, network, bluetooth, audio input/output, display controls, and night mode automation.
- **Lock Screen** Using quickshell's WlSessionLock with embedded virtual keyboard for Niri (Niri doesn't support placing virtual keyboard above lockscreen natively: [issue](https://github.com/YaLTeR/niri/issues/2201))
- **Notepad** A simple text notepad/scratchpad with auto-save to session data and file export/import functionality.
---
</details>
## What You Get
## Highlights
**Dynamic Theming**
Wallpaper-based color schemes that automatically theme GTK, Qt, terminals, editors (like vscode), and more with [matugen](https://github.com/InioX/matugen) and [dank16](https://github.com/AvengeMedia/danklinux/blob/master/internal/dank16/dank16.go).
- Auto-theming GTK, QT, Terminal apps, and more with [matugen](https://github.com/InioX/matugen) + optional theme generation from wallpaper.
- 20+ widgets that can be added and re-arranged on the bar.
- Process list, temperature monitoring, and resource monitoring with [dgop](https://github.com/AvengeMedia/dgop)
- Notification service with support for grouping and richtext
- App launcher + Spotlighht launcher with fuzzy search
- Control center with mpris player, weather, and calendar integration.
- Clipboard history view with image previews.
- A dock for running apps + pinned apps
- Configure bluetooth, wifi, and audio input+output devices.
- A lock screen
- Idle monitoring - configure auto lock, screen off, suspend, and hibernate with different knobs for battery + AC power.
- A greeter
- A comprehensive plugin system for endless customization possibilities.
**System Monitoring**
Real-time CPU, RAM, GPU metrics and temps with [dgop](https://github.com/AvengeMedia/dgop). Full process list with search and management.
**TL;DR** *dms replaces your waybar, swaylock, swayidle, hypridle, hyprlock, fuzzels, walker, mako, and basically everything you use to stitch a desktop together*
**Powerful Launcher**
Spotlight-style search for apps, files (via [dsearch](https://github.com/AvengeMedia/danksearch)), emojis, running windows, calculator, commands - extensible with plugins.
## Installation
**Control Center**
Network, Bluetooth, audio devices, display settings, night mode - all in one clean interface.
### Compositor Setup
**Smart Notifications**
Notification center with grouping, rich text support, and keyboard navigation.
DankMaterialShell particularly aims at supporting the **niri**, **Hyprland**, **sway**, and **dwl/MangoWC** compositors, but it does support more wayland compositors with a diminished feature set (no monitor off, workspace switcher, overview integration, etc.):
**Media Integration**
MPRIS player controls, calendar sync, weather widgets, clipboard history with image previews.
**Niri**:
```bash
# Arch Linux
sudo pacman -S niri
**Complete Session Management**
Lock screen, idle detection, auto-lock/suspend with separate AC/battery settings, greeter support.
# Fedora
sudo dnf copr enable yalter/niri && sudo dnf install niri
```
**Plugin System**
Endless customization with the [plugin registry](https://plugins.danklinux.com).
For detailed niri installation instructions, see the [niri Getting Started guide](https://yalter.github.io/niri/Getting-Started.html).
**TL;DR** - One shell replaces waybar, swaylock, swayidle, mako, fuzzel, polkit and everything else you normally piece together to create a linux desktop.
**Hyprland**:
```bash
# Arch Linux
sudo pacman -S hyprland
---
# Or from AUR for latest
paru -S hyprland-git
## Supported Compositors
# Fedora
sudo dnf install hyprland
DankMaterialShell works best with **[niri](https://github.com/YaLTeR/niri)**, **[Hyprland](https://hyprland.org/)**, **[sway](https://swaywm.org/)**, and **[dwl/MangoWC](https://github.com/DreamMaoMao/mangowc)** - with full workspace switching, overview integration, and monitor management.
# Or use Copr for latest builds
sudo dnf copr enable solopasha/hyprland && sudo dnf install hyprland
```
Other Wayland compositors work too, just with a reduced feature set.
For detailed Hyprland installation instructions, see the [Hyprland wiki](https://wiki.hypr.land/Getting-Started/Installation/).
**[Compositor configuration guide →](https://danklinux.com/docs/dankmaterialshell/compositors)**
**sway/dwl (MangoWC)**:
---
TODO - not documented.
## Keybinds & IPC
### Dank Shell Installation
Control everything from the command line or keybinds:
*feel free to contribute steps for other distributions*
#### Arch Linux - via AUR
```bash
# Stable release
paru -S dms-shell-bin
# Latest -git
paru -S dms-shell-git
```
#### Fedora - via COPR
```bash
# Stable release
sudo dnf copr enable avengemedia/dms && sudo dnf install dms
# Latest -git
sudo dnf copr enable avengemedia/dms-git && sudo dnf install dms
```
#### NixOS - via flake
```bash
nix profile install github:AvengeMedia/DankMaterialShell
```
#### NixOS - via home-manager
To install using home-manager, you need to add this repo into your flake inputs:
``` nix
dgop = {
url = "github:AvengeMedia/dgop";
inputs.nixpkgs.follows = "nixpkgs";
};
dms-cli = {
url = "github:AvengeMedia/danklinux";
inputs.nixpkgs.follows = "nixpkgs";
};
dankMaterialShell = {
url = "github:AvengeMedia/DankMaterialShell";
inputs.nixpkgs.follows = "nixpkgs";
inputs.dgop.follows = "dgop";
inputs.dms-cli.follows = "dms-cli";
};
```
Then somewhere in your home-manager config, add this to the imports:
``` nix
imports = [
inputs.dankMaterialShell.homeModules.dankMaterialShell.default
];
```
If you use Niri, the `niri` homeModule provides additional options for Niri integration, such as key bindings and spawn:
``` nix
imports = [
inputs.dankMaterialShell.homeModules.dankMaterialShell.default
inputs.dankMaterialShell.homeModules.dankMaterialShell.niri
];
```
> [!IMPORTANT]
> To use the `niri` homeModule, you must have `sobidoo/niri-flake` in your inputs:
``` nix
niri = {
url = "github:sodiboo/niri-flake";
inputs.nixpkgs.follows = "nixpkgs";
};
```
And import it in home-manager:
``` nix
imports = [
inputs.niri.homeModules.niri
];
```
Now you can enable it with:
``` nix
programs.dankMaterialShell.enable = true;
```
There are a lot of possible configurations that you can enable/disable in the flake, check [nix/default.nix](nix/default.nix) and [nix/niri.nix](nix/niri.nix) to see them all.
#### Other Distributions - via manual installation
#### 1. Install Quickshell (Varies by Distribution)
```bash
# Arch
paru -S quickshell-git
# Fedora
sudo dnf copr enable avengemedia/danklinux && sudo dnf install quickshell-git
# ! TODO - document other distros
```
#### 2. Install the shell
#### 2.1. Clone latest QML
```bash
mkdir ~/.config/quickshell && git clone https://github.com/AvengeMedia/DankMaterialShell.git ~/.config/quickshell/dms
```
**FOR Stable Version, Checkout the latest tag**
```bash
cd ~/.config/quickshell/dms
# You'll have to re-run this, to update to the latest version.
git checkout $(git describe --tags --abbrev=0)
```
#### 2.2. Install latest dms CLI
```bash
sudo sh -c "curl -L https://github.com/AvengeMedia/danklinux/releases/latest/download/dms-$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').gz | gunzip | tee /usr/local/bin/dms > /dev/null && chmod +x /usr/local/bin/dms"
```
**Note:** this is the latest *stable* dms CLI. If you are using QML/master (not pinned to a tag), then you may periodically be missing features, etc.
If preferred, you can build the dms-cli yourself (requires GO 1.24+)
```bash
git clone https://github.com/AvengeMedia/danklinux.git && cd danklinux
make && sudo make install
```
#### 3. Optional Features (system monitoring, clipboard history, brightness controls, etc.)
#### 3.1 Core optional dependencies
```bash
# Arch Linux
sudo pacman -S cava wl-clipboard cliphist brightnessctl qt6-multimedia accountsservice
paru -S matugen-bin dgop
# Fedora
sudo dnf install cava wl-clipboard brightnessctl qt6-qtmultimedia accountsservice
sudo dnf copr enable avengemedia/danklinux && sudo dnf install cliphist ghostty hyprpicker matugen
```
Note: by enabling and installing the avengemedia/dms copr above, these core dependencies will automatically be available for use.
*Other distros will just need to find sources for the above packages*
#### 3.2 - dgop manual installation
`dgop` is available via AUR and a nix flake, other distributions can install it manually.
```bash
sudo sh -c "curl -L https://github.com/AvengeMedia/dgop/releases/latest/download/dgop-linux-$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').gz | gunzip | tee /usr/local/bin/dgop > /dev/null && chmod +x /usr/local/bin/dgop"
```
**Optional Requirement Overview**
- `dgop`: Ability to have system resource widgets, process list modal, and temperature monitoring.
- `matugen`: Wallpaper-based dynamic theming
- `brightnessctl`: Backlight and LED brightness control
- `wl-clipboard`: Required for copying various elements to clipboard.
- `cava`: Audio visualizer
- `cliphist`: Clipboard history
- `qt6-multimedia`: System sound support
- `accountsservice`: Ability to sync
## Compositor Configuration
A lot of options are subject to personal preference, but the below sets a good starting point for most features.
### niri Integration
Add to your niri config
```kdl
// Required for clipboard history integration
spawn-at-startup "bash" "-c" "wl-paste --watch cliphist store &"
// Recommended (must install polkit-mate before hand) for elevation prompts
spawn-at-startup "/usr/lib/mate-polkit/polkit-mate-authentication-agent-1"
// This may be a different path on different distributions, the above is for the arch linux mate-polkit package
// Starts DankShell
spawn-at-startup "dms" "run"
// If using niri newer than 271534e115e5915231c99df287bbfe396185924d (~aug 17 2025)
// you can add this to disable built in config load errors since dank shell provides this
config-notification {
disable-failed
}
// Dank keybinds
// 1. These should not be in conflict with any pre-existing keybindings
// 2. You need to merge them with your existing config if you want to use these
// 3. You can change the keys to whatever you want, if you prefer something different
// 4. For the increment/decrement ones you can change the steps to whatever you like too
binds {
Mod+Space hotkey-overlay-title="Application Launcher" {
spawn "dms" "ipc" "call" "spotlight" "toggle";
}
Mod+V hotkey-overlay-title="Clipboard Manager" {
spawn "dms" "ipc" "call" "clipboard" "toggle";
}
Mod+M hotkey-overlay-title="Task Manager" {
spawn "dms" "ipc" "call" "processlist" "toggle";
}
Mod+N hotkey-overlay-title="Notification Center" {
spawn "dms" "ipc" "call" "notifications" "toggle";
}
Mod+Comma hotkey-overlay-title="Settings" {
spawn "dms" "ipc" "call" "settings" "toggle";
}
Mod+P hotkey-overlay-title="Notepad" {
spawn "dms" "ipc" "call" "notepad" "toggle";
}
Super+Alt+L hotkey-overlay-title="Lock Screen" {
spawn "dms" "ipc" "call" "lock" "lock";
}
Mod+X hotkey-overlay-title="Power Menu" {
spawn "dms" "ipc" "call" "powermenu" "toggle";
}
Mod+C hotkey-overlay-title="Control Center" {
spawn "dms" "ipc" "call" "control-center" "toggle";
}
Mod+Y hotkey-overlay-title="Browse Wallpapers" {
spawn "dms" "ipc" "call" "dankdash" "wallpaper";
}
XF86AudioRaiseVolume allow-when-locked=true {
spawn "dms" "ipc" "call" "audio" "increment" "3";
}
XF86AudioLowerVolume allow-when-locked=true {
spawn "dms" "ipc" "call" "audio" "decrement" "3";
}
XF86AudioMute allow-when-locked=true {
spawn "dms" "ipc" "call" "audio" "mute";
}
XF86AudioMicMute allow-when-locked=true {
spawn "dms" "ipc" "call" "audio" "micmute";
}
XF86MonBrightnessUp allow-when-locked=true {
spawn "dms" "ipc" "call" "brightness" "increment" "5" "";
}
// You can override the default device for e.g. keyboards by adding the device name to the last param
XF86MonBrightnessDown allow-when-locked=true {
spawn "dms" "ipc" "call" "brightness" "decrement" "5" "";
}
// Night mode toggle
Mod+Shift+N allow-when-locked=true {
spawn "dms" "ipc" "call" "night" "toggle";
}
}
// You probably want this too
debug {
honor-xdg-activation-with-invalid-serial
}
```
#### niri - place wallpaper on overview (blurred or non-blurred)
Place the wallpaper on backdrop using a layer-rule for a contiguous surface.
```kdl
layer-rule {
match namespace="quickshell"
place-within-backdrop true
}
```
If using "Blur Layer" option, you may want the blurred layer to appear on overview only, that can be done with some layer rules:
```kdl
layer-rule {
match namespace="dms:blurwallpaper"
place-within-backdrop true
}
```
#### niri theming
If using a niri build newer than [3933903](https://github.com/YaLTeR/niri/commit/39339032cee3453faa54c361a38db6d83756f750), you can synchronize colors and gaps with the shell settings by adding the following to your niri config.
```bash
# For colors
echo -e 'include "dms/colors.kdl"' >> ~/.config/niri/config.kdl
# For gaps, border widths, certain window rules
echo -e 'include "dms/layout.kdl"' >> ~/.config/niri/config.kdl
```
### Hyprland Integration
Add to your Hyprland config (`~/.config/hypr/hyprland.conf`):
```bash
# Required for clipboard history integration
exec-once = bash -c "wl-paste --watch cliphist store &"
# Recommended (must install polkit-mate beforehand) for elevation prompts
exec-once = /usr/lib/mate-polkit/polkit-mate-authentication-agent-1
# This may be a different path on different distributions, the above is for the arch linux mate-polkit package
# Starts DankShell
exec-once = dms run
# Dank keybinds
# 1. These should not be in conflict with any pre-existing keybindings
# 2. You need to merge them with your existing config if you want to use these
# 3. You can change the keys to whatever you want, if you prefer something different
# 4. For the increment/decrement ones you can change the steps to whatever you like too
# Application and system controls
bind = SUPER, Space, exec, dms ipc call spotlight toggle
bind = SUPER, V, exec, dms ipc call clipboard toggle
bind = SUPER, M, exec, dms ipc call processlist toggle
bind = SUPER, N, exec, dms ipc call notifications toggle
bind = SUPER, comma, exec, dms ipc call settings toggle
bind = SUPER, P, exec, dms ipc call notepad toggle
bind = SUPERALT, L, exec, dms ipc call lock lock
bind = SUPER, X, exec, dms ipc call powermenu toggle
bind = SUPER, Y, exec, dms ipc call dankdash wallpaper
bind = SUPER, C, exec, dms ipc call control-center toggle
bind = SUPER, TAB, exec, dms ipc call hypr toggleOverview
# Audio controls (function keys)
bindl = , XF86AudioRaiseVolume, exec, dms ipc call audio increment 3
bindl = , XF86AudioLowerVolume, exec, dms ipc call audio decrement 3
bindl = , XF86AudioMute, exec, dms ipc call audio mute
bindl = , XF86AudioMicMute, exec, dms ipc call audio micmute
# Brightness controls (function keys)
bindl = , XF86MonBrightnessUp, exec, dms ipc call brightness increment 5 ""
# You can override the default device for e.g. keyboards by adding the device name to the last param
bindl = , XF86MonBrightnessDown, exec, dms ipc call brightness decrement 5 ""
# Night mode toggle
bind = SUPERSHIFT, N, exec, dms ipc call night toggle
```
## Greeter
You can install a matching [greetd](https://github.com/kennylevinsen/greetd) greeter, that will give you a greeter that matches the lock screen.
It's as simple as running `dms greeter install` in most cases, but more information is in the [Greetd module](Modules/Greetd/README.md)
## IPC Commands
Control everything from the command line, or via keybinds. For comprehensive documentation of all available IPC commands, see [docs/IPC.md](docs/IPC.md).
### Audio control
```bash
dms ipc call audio setvolume 50
dms ipc call audio mute
```
### Launch applications
```bash
dms ipc call spotlight toggle
dms ipc call notepad toggle
dms ipc call processlist toggle
dms ipc call powermenu toggle
```
### System control
```
dms ipc call audio setvolume 50
dms ipc call wallpaper set /path/to/image.jpg
dms ipc call theme toggle
dms ipc call night toggle
dms ipc call lock lock
```
### Media control
```
dms ipc call mpris playPause
dms ipc call mpris next
```
**[Full keybind and IPC documentation →](https://danklinux.com/docs/dankmaterialshell/keybinds-ipc)**
---
## Theming
dms will spawn a matugen process on theme changes to generate color palettes for installed and supported apps. If you do not want these files generated, you can set the env variable `DMS_DISABLE_MATUGEN=1` to disable it entirely.
DankMaterialShell automatically generates color schemes from your wallpaper or theme and applies them to GTK, Qt, terminals, and more.
### Custom Themes
DMS is not opinionated or forcing these themes - they are created as optional themes you can enable. You can refer to the documentation if you want to use them:
DankMaterialShell supports custom color themes! You can create your own Material Design 3 color schemes or use pre-made themes like Cyberpunk Electric, Hotline Miami, and Miami Vice.
**Application theming:** [GTK, Qt, Firefox, terminals, vscode →](https://danklinux.com/docs/dankmaterialshell/application-themes)
For detailed instructions on creating and using custom themes, see [docs/CUSTOM_THEMES.md](docs/CUSTOM_THEMES.md).
**Custom themes:** [Create your own color schemes →](https://danklinux.com/docs/dankmaterialshell/custom-themes)
### System App Integration
There's two toggles in the appearance section of settings, for GTK and QT apps.
These settings will override some local GTK and QT configuration files, you can still integrate auto-theming if you do not wish DankShell to mess with your QTCT/GTK files.
No matter what when matugen is enabled the files will be created on wallpaper changes:
- ~/.config/gtk-3.0/dank-colors.css
- ~/.config/gtk-4.0/dank-colors.css
- ~/.config/qt6ct/colors/matugen.conf
- ~/.config/qt5ct/colors/matugen.conf
If you do not like our theme path, you can integrate this with other GTK themes, matugen themes, etc.
#### GTK Apps
1. Install adw-gtk3
```bash
# Arch
sudo pacman -S adw-gtk-theme
# Fedora
sudo dnf install adw-gtk3-theme
```
In dms settings, navigate to Theme & Colors, and "apply GTK themes"
This will create symlinks from `~/.config/gtk-3.0/4.0/dank-colors.css` to `~/.config/gtk-3.0/4.0/gtk.css` which enables theming.
#### QT: basic gtk3 based theme (Option 1)
If you mostly use gtk apps, you'll probably be happy to just set the QT platform theme to gtk3.
```kdl
environment {
// Add to existing environment block
QT_QPA_PLATFORMTHEME "gtk3"
QT_QPA_PLATFORMTHEME_QT6 "gtk3"
}
```
#### QT: better theming (Option 2)
1. Install qt6ct-kde
```bash
# Arch
paru -S qt6ct-kde
```
*I'm not sure what it is on other distros, but you can manually install via instructions provides on [qt6ct-kde github](https://www.opencode.net/trialuser/qt6ct)
2. **Configure Environment in niri**
```kdl
// Add to existing environment block
QT_QPA_PLATFORMTHEME "qt6ct"
QT_QPA_PLATFORMTHEME_QT6 "qt6ct"
```
You'll have to restart your session for themes to take effect.
Nevigate to dms settings -> themes & colors -> and click "Apply QT Themes"
#### Firefox
There are two theme paths for Firefox, using with [pywalfox](https://github.com/Frewacom/pywalfox) or [material fox](https://github.com/edelvarden/material-fox-updated)
**(Option 1) - pywalfox**
1. **Install [pywalfox](https://github.com/Frewacom/pywalfox)** on system.
- Available in AUR via `paru -S python-pywalfox`
2. **Install [pywalfox extension](https://addons.mozilla.org/firefox/addon/pywalfox/)** in firefox.
3. **Restart dms and create symlink** to generate palette and then enable dank colors.
- Run `ln -sf ~/.cache/wal/dank-pywalfox.json ~/.cache/wal/colors.json`
**(Option 2) - Chrome-like theme with dynamic colors**
Firefox does use the GTK3 theme, but it doesn't look that good on the stock theme IMO. A separate matugen css is generated for the [material fox](https://github.com/edelvarden/material-fox-updated) theme, you can configure that theme with dynamic colors by following the steps below.
1. **In firefox, navigate to `about:config`**
- set `toolkit.legacyuserprofilecustomizations.stylesheets` to `true`
- set `svg.context-properties.content.enabled` to `true`
- Create a new property called `userChrome.theme-material` and type `boolean`
- set to `true`
<details><summary><strong>Expand for firefox screenshots</strong></summary>
<img width="1262" height="104" alt="image" src="https://github.com/user-attachments/assets/4bca43d1-5735-4401-9b91-5ee4f0b1e357" />
<img width="1262" height="104" alt="image" src="https://github.com/user-attachments/assets/348d37e0-5c6c-4db8-b7c9-89cabf282c25" />
<img width="1244" height="106" alt="image" src="https://github.com/user-attachments/assets/75fd4972-bc4a-4657-b756-b31ef8061b3b" />
</details>
2. **Install material fox theme**
```bash
# Find Firefox profile directory
export PROFILE_DIR=$(find ~/.mozilla/firefox -maxdepth 1 -type d -name "*.default-release" | head -n 1)
# Download, extract to profile dir, and cleanup
curl -L -o "$PROFILE_DIR/chrome.zip" https://github.com/edelvarden/material-fox-updated/releases/download/v2.0.0/chrome.zip
unzip -o "$PROFILE_DIR/chrome.zip" -d "$PROFILE_DIR"
rm "$PROFILE_DIR/chrome.zip"
```
3. **Configure dynamic colors for material fox theme**
```bash
export PROFILE_DIR=$(find ~/.mozilla/firefox -maxdepth 1 -type d -name "*.default-release" | head -n 1)
rm -f "$PROFILE_DIR/chrome/theme-material-blue.css"
ln -sf ~/.config/DankMaterialShell/firefox.css "$PROFILE_DIR/chrome/theme-material-blue.css"
```
### Terminal Integration
The matugen integration will automatically generate new colors for certain apps only if they are installed.
You can enable the dynamic color schemes in supported terminal apps by modifying their configurations:
**Ghostty**:
```bash
echo "config-file = ./config-dankcolors" >> ~/.config/ghostty/config
```
If you want to disable excessive config reloaded popup sin ghostty, you may wish to also add this:
```bash
# These are the default danklinux options, if you still want config reloaded and copied to clipboard popups you can skip it.
echo "app-notifications = no-clipboard-copy,no-config-reload" >> ~/.config/ghostty/config
```
**kitty**:
```bash
echo "include dank-theme.conf" >> ~/.config/kitty/kitty.conf
```
---
## Plugins
[Plugin registry](https://github.com/AvengeMedia/dms-plugin-registry) - collection of available dms plugins.
Extend dms with the plugin system. Browse community plugins at [plugins.danklinux.com](https://plugins.danklinux.com).
dms features a plugin system - meaning you can create your own widgets and load other user widgets.
**[Plugin development guide →](https://danklinux.com/docs/dankmaterialshell/plugins-overview)**
More comprehensive details available in the [PLUGINS](PLUGINS/README.md) - and examples [Emoji Plugin](PLUGINS/ExampleEmojiPlugin) and [Wallpaper Change Hook](PLUGINS/WallpaperWatcherDaemon) are available for reference.
---
Install an example plugin by:
## Documentation
```bash
mkdir ~/.config/DankMaterialShell/plugins
cp -R ./PLUGINS/ExampleEmojiPlugin ~/.config/DankMaterialShell/plugins
```
**Website:** [danklinux.com](https://danklinux.com)
**Only install plugins from TRUSTED sources.** Plugins execute QML and javascript at runtime, plugins from third parties should be reviewed before enabling them in dms.
**Docs:** [danklinux.com/docs](https://danklinux.com/docs)
### NixOS - via home-manager
**Support:** [Ko-fi](https://ko-fi.com/avengemediallc)
Add the following to your home-manager config to install a plugin:
```nix
programs.dankMaterialShell.plugins = {
ExampleEmojiPlugin.src = "${inputs.dankMaterialShell}/PLUGINS/ExampleEmojiPlugin";
};
```
### Calendar Setup
Sync your caldev compatible calendar (Google, Office365, etc.) for dashboard integration:
<details><summary>Configuration Steps</summary>
**Install dependencies:**
#### Arch
```bash
sudo pacman -S vdirsyncer khal python-aiohttp-oauthlib
```
#### Fedora
```bash
sudo dnf install python3-vdirsyncer khal python3-aiohttp-oauthlib
```
**Configure vdirsyncer** (`~/.vdirsyncer/config`):
```ini
[general]
status_path = "~/.calendars/status"
[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 personallocal]
type = "filesystem"
path = "~/.calendars/Personal"
fileext = ".ics"
```
**Setup sync:**
```bash
vdirsyncer sync
khal configure
```
#### Auto-sync every 5 minutes
```bash
crontab -e
# Add: */5 * * * * /usr/bin/vdirsyncer sync
```
</details>
## Configuration
All settings are configurable in
```
~/.config/DankMaterialShell/settings.json`, or more intuitively the built-in settings modal.
```
**Key configuration areas:**
- Widget positioning and behavior
- Theme and color preferences
- Time format, weather units and location
- Light/Dark modes
- Wallpaper and Profile picture
- Dock enable/disable and various tunes.
## Troubleshooting
**Common issues:**
- **No dynamic theming:** Install matugen and enable in settings
- **Qt apps not themed:** Configure qt5ct/qt6ct and set QT_QPA_PLATFORMTHEME
- **Calendar not syncing:** Check vdirsyncer credentials and network connectivity
**Getting help:**
- Check the [issues](https://github.com/AvengeMedia/DankMaterialShell/issues) for known problems
- Re-run the shell with `dms kill && dms run` to capture logs.
- Join the niri community for compositor-specific questions
---
## Contributing
DankMaterialShell welcomes contributions! Whether it's bug fixes, new widgets, theme improvements, or documentation updates - all help is appreciated.
Contributions welcome! Bug fixes, new widgets, theme improvements, or docs - it all helps.
**Areas that need attention:**
**Contributing Code:**
1. Fork the repository
2. Make your changes
3. Open a pull request
- More widget options and customization
- Additional compositor compatibility
- Performance optimizations
- Documentation and examples
**Contributing Documentation:**
1. Fork the [DankLinux-Docs](https://github.com/AvengeMedia/DankLinux-Docs) repository
2. Update files in the `docs/` folder
3. Open a pull request
Check the [issues](https://github.com/AvengeMedia/DankMaterialShell/issues) or join the community.
---
## Credits

View File

@@ -28,6 +28,9 @@ Singleton {
property var normalNotificationSound: null
property var criticalNotificationSound: null
property var mediaDevices: null
property var mediaDevicesConnections: null
signal micMuteChanged
Timer {
@@ -241,6 +244,42 @@ Singleton {
}
}
function setupMediaDevices() {
if (!soundsAvailable || mediaDevices) {
return
}
try {
mediaDevices = Qt.createQmlObject(`
import QtQuick
import QtMultimedia
MediaDevices {
id: devices
Component.onCompleted: {
console.log("AudioService: MediaDevices initialized, default output:", defaultAudioOutput?.description)
}
}
`, root, "AudioService.MediaDevices")
if (mediaDevices) {
mediaDevicesConnections = Qt.createQmlObject(`
import QtQuick
Connections {
target: root.mediaDevices
function onDefaultAudioOutputChanged() {
console.log("AudioService: Default audio output changed, recreating sound players")
root.destroySoundPlayers()
root.createSoundPlayers()
}
}
`, root, "AudioService.MediaDevicesConnections")
}
} catch (e) {
console.log("AudioService: MediaDevices not available, using default audio output")
mediaDevices = null
}
}
function destroySoundPlayers() {
if (volumeChangeSound) {
volumeChangeSound.destroy()
@@ -269,14 +308,20 @@ Singleton {
return
}
setupMediaDevices()
try {
const deviceProperty = mediaDevices ? `device: root.mediaDevices.defaultAudioOutput\n ` : ""
const volumeChangePath = getSoundPath("audio-volume-change")
volumeChangeSound = Qt.createQmlObject(`
import QtQuick
import QtMultimedia
MediaPlayer {
source: "${volumeChangePath}"
audioOutput: AudioOutput { volume: 1.0 }
audioOutput: AudioOutput {
${deviceProperty}volume: 1.0
}
}
`, root, "AudioService.VolumeChangeSound")
@@ -286,7 +331,9 @@ Singleton {
import QtMultimedia
MediaPlayer {
source: "${powerPlugPath}"
audioOutput: AudioOutput { volume: 1.0 }
audioOutput: AudioOutput {
${deviceProperty}volume: 1.0
}
}
`, root, "AudioService.PowerPlugSound")
@@ -296,7 +343,9 @@ Singleton {
import QtMultimedia
MediaPlayer {
source: "${powerUnplugPath}"
audioOutput: AudioOutput { volume: 1.0 }
audioOutput: AudioOutput {
${deviceProperty}volume: 1.0
}
}
`, root, "AudioService.PowerUnplugSound")
@@ -306,7 +355,9 @@ Singleton {
import QtMultimedia
MediaPlayer {
source: "${messagePath}"
audioOutput: AudioOutput { volume: 1.0 }
audioOutput: AudioOutput {
${deviceProperty}volume: 1.0
}
}
`, root, "AudioService.NormalNotificationSound")
@@ -316,7 +367,9 @@ Singleton {
import QtMultimedia
MediaPlayer {
source: "${messageNewInstantPath}"
audioOutput: AudioOutput { volume: 1.0 }
audioOutput: AudioOutput {
${deviceProperty}volume: 1.0
}
}
`, root, "AudioService.CriticalNotificationSound")
} catch (e) {

View File

@@ -869,4 +869,22 @@ Singleton {
getState()
}
}
function setWifiAutoconnect(ssid, autoconnect) {
if (!networkAvailable || DMSService.apiVersion <= 13) return
const params = {
ssid: ssid,
autoconnect: autoconnect
}
DMSService.sendRequest("network.wifi.setAutoconnect", params, response => {
if (response.error) {
ToastService.showError(I18n.tr("Failed to update autoconnect"))
} else {
ToastService.showInfo(autoconnect ? I18n.tr("Autoconnect enabled") : I18n.tr("Autoconnect disabled"))
Qt.callLater(() => getState())
}
})
}
}

View File

@@ -1,6 +1,6 @@
pragma Singleton
pragma ComponentBehavior: Bound
pragma ComponentBehavior
import QtCore
import QtQuick
@@ -34,15 +34,18 @@ Singleton {
signal searchResultsReceived(var plugins)
signal operationSuccess(string message)
signal operationError(string error)
signal connectionStateChanged()
signal connectionStateChanged
signal networkStateUpdate(var data)
signal cupsStateUpdate(var data)
signal loginctlStateUpdate(var data)
signal loginctlEvent(var event)
signal capabilitiesReceived()
signal capabilitiesReceived
signal credentialsRequest(var data)
signal bluetoothPairingRequest(var data)
signal dwlStateUpdate(var data)
signal brightnessStateUpdate(var data)
signal brightnessDeviceUpdate(var device)
Component.onCompleted: {
if (socketPath && socketPath.length > 0) {
@@ -226,11 +229,7 @@ Singleton {
if (response.error.includes("unknown method") && response.error.includes("subscribe")) {
if (!shownOutdatedError) {
console.error("DMSService: Server does not support subscribe method")
ToastService.showError(
I18n.tr("DMS out of date"),
I18n.tr("To update, run the following command:"),
updateCommand
)
ToastService.showError(I18n.tr("DMS out of date"), I18n.tr("To update, run the following command:"), updateCommand)
shownOutdatedError = true
}
}
@@ -267,8 +266,16 @@ Singleton {
}
} else if (service === "bluetooth.pairing") {
bluetoothPairingRequest(data)
} else if (service === "cups") {
cupsStateUpdate(data)
} else if (service === "dwl") {
dwlStateUpdate(data)
} else if (service === "brightness") {
brightnessStateUpdate(data)
} else if (service === "brightness.update") {
if (data.device) {
brightnessDeviceUpdate(data.device)
}
}
}
@@ -277,8 +284,8 @@ Singleton {
console.warn("DMSService.sendRequest: Not connected, method:", method)
if (callback) {
callback({
"error": "not connected to DMS socket"
})
"error": "not connected to DMS socket"
})
}
return
}

File diff suppressed because it is too large Load Diff

View File

@@ -10,8 +10,6 @@ import qs.Common
Singleton {
id: root
readonly property string shellDir: Paths.strip(Qt.resolvedUrl(".").toString()).replace("/Services/", "")
property string scriptPath: `${shellDir}/scripts/hyprland_keybinds.py`
readonly property string _configUrl: StandardPaths.writableLocation(StandardPaths.ConfigLocation)
readonly property string _configDir: Paths.strip(_configUrl)
property string hyprConfigPath: `${_configDir}/hypr`
@@ -20,7 +18,7 @@ Singleton {
Process {
id: getKeybinds
running: false
command: [root.scriptPath, "--path", root.hyprConfigPath]
command: ["dms", "hyprland", "keybinds", "--path", root.hyprConfigPath]
stdout: SplitParser {
onRead: data => {

View File

@@ -283,4 +283,10 @@ Singleton {
activeService.cancelCredentials(token)
}
}
function setWifiAutoconnect(ssid, autoconnect) {
if (activeService && activeService.setWifiAutoconnect) {
activeService.setWifiAutoconnect(ssid, autoconnect)
}
}
}

View File

@@ -21,6 +21,10 @@ Singleton {
property var tabsBeingCreated: ({})
property bool metadataLoaded: false
Component.onCompleted: {
ensureDirectories()
}
FileView {
id: metadataFile
path: root.refCount > 0 ? root.metadataPath : ""
@@ -33,15 +37,15 @@ Singleton {
root.tabs = data.tabs || []
root.currentTabIndex = data.currentTabIndex || 0
root.metadataLoaded = true
validateTabs()
root.validateTabs()
} catch(e) {
console.warn("Failed to parse notepad metadata:", e)
createDefaultTab()
root.createDefaultTab()
}
}
onLoadFailed: {
createDefaultTab()
root.createDefaultTab()
}
}
@@ -52,6 +56,9 @@ Singleton {
}
}
function ensureDirectories() {
mkdirProcess.running = true
}
function loadMetadata() {
metadataFile.path = ""
@@ -67,7 +74,7 @@ Singleton {
newTabsBeingCreated[id] = true
tabsBeingCreated = newTabsBeingCreated
createEmptyFile(fullPath, function() {
root.createEmptyFile(fullPath, function() {
root.tabs = [{
id: id,
title: I18n.tr("Untitled"),
@@ -82,7 +89,7 @@ Singleton {
var updatedTabsBeingCreated = Object.assign({}, tabsBeingCreated)
delete updatedTabsBeingCreated[id]
tabsBeingCreated = updatedTabsBeingCreated
saveMetadata()
root.saveMetadata()
})
}
@@ -112,9 +119,20 @@ Singleton {
})
return
}
var loader = tabFileLoaderComponent.createObject(root, {
var fileChecker = fileExistsComponent.createObject(root, {
path: fullPath,
callback: callback
callback: (exists) => {
if (exists) {
var loader = tabFileLoaderComponent.createObject(root, {
path: fullPath,
callback: callback
})
} else {
console.warn("Tab file does not exist:", fullPath)
callback("")
}
}
})
}
@@ -268,7 +286,7 @@ Singleton {
tabs = validTabs
if (tabs.length === 0) {
createDefaultTab()
root.createDefaultTab()
}
}
@@ -291,6 +309,22 @@ Singleton {
}
}
Component {
id: fileExistsComponent
Process {
property string path
property var callback
command: ["test", "-f", path]
Component.onCompleted: running = true
onExited: (exitCode) => {
callback(exitCode === 0)
destroy()
}
}
}
Component {
id: tabFileSaverComponent
FileView {
@@ -305,7 +339,7 @@ Singleton {
onSaved: {
if (tabIndex >= 0) {
updateTabMetadata(tabIndex, {})
root.updateTabMetadata(tabIndex, {})
}
if (creationCallback) {
creationCallback()
@@ -390,4 +424,9 @@ Singleton {
property string filePath
command: ["rm", "-f", filePath]
}
Process {
id: mkdirProcess
command: ["mkdir", "-p", root.baseDir, root.filesDir]
}
}

View File

@@ -123,7 +123,7 @@ Singleton {
var settings = SessionData.getMonitorCyclingSettings(screenName)
var wallpaper = SessionData.getMonitorWallpaper(screenName)
if (settings.enabled && wallpaper && !wallpaper.startsWith("#") && !wallpaper.startsWith("we:")) {
if (settings.enabled && wallpaper && !wallpaper.startsWith("#")) {
startMonitorCycling(screenName, settings)
} else {
stopMonitorCycling(screenName)
@@ -330,7 +330,7 @@ Singleton {
var settings = SessionData.getMonitorCyclingSettings(screenName)
var wallpaper = SessionData.getMonitorWallpaper(screenName)
if (settings.enabled && settings.mode === "time" && wallpaper && !wallpaper.startsWith("#") && !wallpaper.startsWith("we:")) {
if (settings.enabled && settings.mode === "time" && wallpaper && !wallpaper.startsWith("#")) {
var lastCheck = monitorLastTimeChecks[screenName] || ""
if (currentTime === settings.time && currentTime !== lastCheck) {

View File

@@ -120,5 +120,7 @@ void main() {
// Mix the textures (factor = 0 inside disc, 1 outside)
fragColor = mix(color2, color1, factor);
if (ubuf.progress <= 0.0) fragColor = color1;
fragColor *= ubuf.qt_Opacity;
}

Binary file not shown.

View File

@@ -1 +1 @@
v0.3.1
v0.3.3

View File

@@ -0,0 +1,80 @@
import QtQuick
import QtQuick.Controls
import Quickshell
import Quickshell.Widgets
import qs.Common
Item {
id: root
required property string iconValue
required property int iconSize
property string fallbackText: "A"
property color iconColor: Theme.surfaceText
property color fallbackBackgroundColor: Theme.surfaceLight
property color fallbackTextColor: Theme.primary
property real materialIconSizeAdjustment: Theme.spacingM
property real unicodeIconScale: 0.7
property real fallbackTextScale: 0.4
property alias iconMargins: iconImg.anchors.margins
property real fallbackLeftMargin: 0
property real fallbackRightMargin: 0
property real fallbackTopMargin: 0
property real fallbackBottomMargin: 0
property bool isMaterial: iconValue.indexOf("material:") === 0
property bool isUnicode: iconValue.indexOf("unicode:") === 0
property string materialName: isMaterial ? iconValue.substring(9) : ""
property string unicodeChar: isUnicode ? iconValue.substring(8) : ""
visible: iconValue !== undefined && iconValue !== ""
DankIcon {
anchors.centerIn: parent
name: root.materialName
size: root.iconSize - root.materialIconSizeAdjustment
color: root.iconColor
visible: root.isMaterial
}
StyledText {
anchors.centerIn: parent
text: root.unicodeChar
font.pixelSize: root.iconSize * root.unicodeIconScale
color: root.iconColor
visible: root.isUnicode
}
IconImage {
id: iconImg
anchors.fill: parent
source: root.isMaterial || root.isUnicode ? "" : Quickshell.iconPath(root.iconValue, true)
smooth: true
asynchronous: true
visible: !root.isMaterial && !root.isUnicode && status === Image.Ready
}
Rectangle {
id: fallbackRect
anchors.fill: parent
anchors.leftMargin: root.fallbackLeftMargin
anchors.rightMargin: root.fallbackRightMargin
anchors.topMargin: root.fallbackTopMargin
anchors.bottomMargin: root.fallbackBottomMargin
visible: !root.isMaterial && !root.isUnicode && iconImg.status !== Image.Ready
color: root.fallbackBackgroundColor
radius: Theme.cornerRadius
border.width: 0
border.color: Theme.primarySelected
StyledText {
anchors.centerIn: parent
text: root.fallbackText
font.pixelSize: root.iconSize * root.fallbackTextScale
color: root.fallbackTextColor
font.weight: Font.Bold
}
}
}

View File

@@ -0,0 +1,104 @@
import QtQuick
import QtQuick.Controls
import Quickshell
import qs.Common
import qs.Widgets
Rectangle {
id: root
required property var model
required property int index
required property var gridView
property int cellWidth: 120
property int cellHeight: 120
property int cellPadding: 8
property int minIconSize: 32
property int maxIconSize: 64
property real iconSizeRatio: 0.5
property bool hoverUpdatesSelection: true
property bool keyboardNavigationActive: false
property int currentIndex: -1
property bool isPlugin: model?.isPlugin || false
property real mouseAreaLeftMargin: 0
property real mouseAreaRightMargin: 0
property real mouseAreaBottomMargin: 0
property real iconFallbackLeftMargin: 0
property real iconFallbackRightMargin: 0
property real iconFallbackBottomMargin: 0
property real iconMaterialSizeAdjustment: 0
property real iconUnicodeScale: 0.8
signal itemClicked(int index, var modelData)
signal itemRightClicked(int index, var modelData, real mouseX, real mouseY)
signal keyboardNavigationReset()
width: cellWidth - cellPadding
height: cellHeight - cellPadding
radius: Theme.cornerRadius
color: currentIndex === index ? Theme.primaryPressed : mouseArea.containsMouse ? Theme.primaryHoverLight : Theme.surfaceContainerHigh
Column {
anchors.centerIn: parent
spacing: Theme.spacingS
AppIconRenderer {
property int computedIconSize: Math.min(root.maxIconSize, Math.max(root.minIconSize, root.cellWidth * root.iconSizeRatio))
width: computedIconSize
height: computedIconSize
anchors.horizontalCenter: parent.horizontalCenter
iconValue: model.icon || ""
iconSize: computedIconSize
fallbackText: (model.name && model.name.length > 0) ? model.name.charAt(0).toUpperCase() : "A"
materialIconSizeAdjustment: root.iconMaterialSizeAdjustment
unicodeIconScale: root.iconUnicodeScale
fallbackTextScale: Math.min(28, computedIconSize * 0.5) / computedIconSize
iconMargins: 0
fallbackLeftMargin: root.iconFallbackLeftMargin
fallbackRightMargin: root.iconFallbackRightMargin
fallbackBottomMargin: root.iconFallbackBottomMargin
}
StyledText {
anchors.horizontalCenter: parent.horizontalCenter
width: root.cellWidth - 12
text: model.name || ""
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
font.weight: Font.Medium
elide: Text.ElideRight
horizontalAlignment: Text.AlignHCenter
maximumLineCount: 1
wrapMode: Text.NoWrap
}
}
MouseArea {
id: mouseArea
anchors.fill: parent
anchors.leftMargin: root.mouseAreaLeftMargin
anchors.rightMargin: root.mouseAreaRightMargin
anchors.bottomMargin: root.mouseAreaBottomMargin
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton
z: 10
onEntered: {
if (root.hoverUpdatesSelection && !root.keyboardNavigationActive)
root.gridView.currentIndex = root.index
}
onPositionChanged: {
root.keyboardNavigationReset()
}
onClicked: mouse => {
if (mouse.button === Qt.LeftButton) {
root.itemClicked(root.index, root.model)
} else if (mouse.button === Qt.RightButton && !root.isPlugin) {
const globalPos = mapToItem(null, mouse.x, mouse.y)
root.itemRightClicked(root.index, root.model, globalPos.x, globalPos.y)
}
}
}
}

View File

@@ -0,0 +1,114 @@
import QtQuick
import QtQuick.Controls
import Quickshell
import qs.Common
import qs.Widgets
Rectangle {
id: root
required property var model
required property int index
required property var listView
property int itemHeight: 60
property int iconSize: 40
property bool showDescription: true
property bool hoverUpdatesSelection: true
property bool keyboardNavigationActive: false
property bool isCurrentItem: false
property bool isPlugin: model?.isPlugin || false
property real mouseAreaLeftMargin: 0
property real mouseAreaRightMargin: 0
property real mouseAreaBottomMargin: 0
property real iconMargins: 0
property real iconFallbackLeftMargin: 0
property real iconFallbackRightMargin: 0
property real iconFallbackBottomMargin: 0
property real iconMaterialSizeAdjustment: Theme.spacingM
property real iconUnicodeScale: 0.7
signal itemClicked(int index, var modelData)
signal itemRightClicked(int index, var modelData, real mouseX, real mouseY)
signal keyboardNavigationReset()
width: listView.width
height: itemHeight
radius: Theme.cornerRadius
color: isCurrentItem ? Theme.primaryPressed : mouseArea.containsMouse ? Theme.primaryHoverLight : Theme.surfaceContainerHigh
Row {
anchors.fill: parent
anchors.margins: Theme.spacingM
spacing: Theme.spacingL
AppIconRenderer {
width: root.iconSize
height: root.iconSize
anchors.verticalCenter: parent.verticalCenter
iconValue: model.icon || ""
iconSize: root.iconSize
fallbackText: (model.name && model.name.length > 0) ? model.name.charAt(0).toUpperCase() : "A"
iconMargins: root.iconMargins
fallbackLeftMargin: root.iconFallbackLeftMargin
fallbackRightMargin: root.iconFallbackRightMargin
fallbackBottomMargin: root.iconFallbackBottomMargin
materialIconSizeAdjustment: root.iconMaterialSizeAdjustment
unicodeIconScale: root.iconUnicodeScale
}
Column {
anchors.verticalCenter: parent.verticalCenter
width: (model.icon !== undefined && model.icon !== "") ? (parent.width - root.iconSize - Theme.spacingL) : parent.width
spacing: Theme.spacingXS
StyledText {
width: parent.width
text: model.name || ""
font.pixelSize: Theme.fontSizeLarge
color: Theme.surfaceText
font.weight: Font.Medium
elide: Text.ElideRight
wrapMode: Text.NoWrap
maximumLineCount: 1
}
StyledText {
width: parent.width
text: model.comment || "Application"
font.pixelSize: Theme.fontSizeMedium
color: Theme.surfaceVariantText
elide: Text.ElideRight
maximumLineCount: 1
visible: root.showDescription && model.comment && model.comment.length > 0
}
}
}
MouseArea {
id: mouseArea
anchors.fill: parent
anchors.leftMargin: root.mouseAreaLeftMargin
anchors.rightMargin: root.mouseAreaRightMargin
anchors.bottomMargin: root.mouseAreaBottomMargin
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton
z: 10
onEntered: {
if (root.hoverUpdatesSelection && !root.keyboardNavigationActive)
root.listView.currentIndex = root.index
}
onPositionChanged: {
root.keyboardNavigationReset()
}
onClicked: mouse => {
if (mouse.button === Qt.LeftButton) {
root.itemClicked(root.index, root.model)
} else if (mouse.button === Qt.RightButton && !root.isPlugin) {
const globalPos = mapToItem(null, mouse.x, mouse.y)
root.itemRightClicked(root.index, root.model, globalPos.x, globalPos.y)
}
}
}
}

View File

@@ -1,4 +1,5 @@
import QtQuick
import QtQuick.Effects
import qs.Common
Item {
@@ -37,27 +38,27 @@ Item {
visible: !isColorWallpaper
}
Item {
Image {
anchors.left: parent.left
anchors.bottom: parent.bottom
anchors.leftMargin: Theme.spacingXL * 2
anchors.bottomMargin: Theme.spacingXL * 2
width: 200
height: width * (569.94629 / 506.50931)
fillMode: Image.PreserveAspectFit
smooth: true
mipmap: true
asynchronous: true
source: "file://" + Theme.shellDir + "/assets/danklogonormal.svg"
opacity: 0.25
visible: !isColorWallpaper
StyledText {
anchors.left: parent.left
anchors.bottom: parent.bottom
// ! TODO qmlfmt will brick this
text: `
`
isMonospace: true
font.pixelSize: Theme.fontSizeLarge * 1.2
color: Theme.primary
layer.enabled: true
layer.smooth: true
layer.mipmap: true
layer.effect: MultiEffect {
saturation: 0
colorization: 1
colorizationColor: Theme.primary
}
}
}

113
assets/danklogo2.svg Normal file
View File

@@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg1"
width="482.90668"
height="558.15088"
viewBox="0 0 482.90667 558.15088"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
shape-rendering="auto"
style="image-rendering: auto; filter: url(#smoothing);">
<defs
id="defs1">
<filter id="smoothing" x="-0.05" y="-0.05" width="1.1" height="1.1">
<feGaussianBlur in="SourceGraphic" stdDeviation="0.5" />
</filter>
<color-profile
name="sRGB IEC61966-2.1"
xlink:href="data:application/vnd.iccprofile;base64,AAAMbExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAACQd3RwdAAAAhQAAAAUYmtwdAAAAigAAAAUclhZWgAAAjwAAAAUZ1hZWgAAAlAAAAAUYlhZWgAAAmQAAAAUZG1uZAAAAngAAABwZG1kZAAAAugAAACIdnVlZAAAA3AAAACGdmlldwAAA/gAAAAkbHVtaQAABBwAAAAUbWVhcwAABDAAAAAkdGVjaAAABFQAAAAMclRSQwAABGAAAAgMZ1RSQwAABGAAAAgMYlRSQwAABGAAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAASAHMAUgBHAEIAIABJAEUAQwA2ADEAOQA2ADYALQAyAC4AMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//"
id="color-profile1" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath21">
<path
d="M 0,1200 H 2000 V 0 H 0 Z"
transform="translate(-673.87432,-704.25842)"
id="path21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath25">
<path
d="M 0,1200 H 2000 V 0 H 0 Z"
transform="translate(-466.30451,-703.59782)"
id="path25" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath27">
<path
d="M 0,1200 H 2000 V 0 H 0 Z"
transform="translate(-695.28002,-473.92741)"
id="path27" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath29">
<path
d="M 0,1200 H 2000 V 0 H 0 Z"
transform="translate(-457.93881,-632.99062)"
id="path29" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath31">
<path
d="M 0,1200 H 2000 V 0 H 0 Z"
transform="translate(-466.30451,-703.59782)"
id="path31" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath33">
<path
d="M 0,1200 H 2000 V 0 H 0 Z"
transform="translate(-614.51722,-638.93302)"
id="path33" />
</clipPath>
</defs>
<g
id="layer-MC0"
transform="translate(-486.31024,-515.02722)">
<path
id="path20"
d="M 0,0 C -1.568,1.568 -3.163,3.098 -4.787,4.61 -5.944,3.966 -7.185,3.35 -8.529,2.762 -9.658,2.277 -10.815,1.82 -11.981,1.4 c 1.885,-1.689 3.742,-3.425 5.552,-5.207 0.448,-0.429 0.886,-0.868 1.325,-1.306 2.221,-2.221 4.386,-4.498 6.476,-6.84 27.639,-30.784 44.453,-71.459 44.453,-116.089 0,-29.347 -7.259,-56.977 -20.09,-81.21 -2.192,-4.134 -4.544,-8.174 -7.054,-12.102 -6.83,-10.74 -14.827,-20.669 -23.785,-29.636 -5.944,-5.944 -12.317,-11.459 -19.073,-16.498 -0.56,-0.42 -1.12,-0.83 -1.689,-1.231 -28.675,-20.893 -63.975,-33.201 -102.186,-33.201 -48.018,0 -91.464,19.456 -122.948,50.93 -0.737,0.737 -1.465,1.474 -2.174,2.221 -0.55,0.569 -1.101,1.147 -1.633,1.726 -15.545,16.553 -27.881,36.14 -36.018,57.779 -3.098,8.211 -5.58,16.712 -7.409,25.464 -2.417,11.534 -3.686,23.496 -3.686,35.758 0.01,42.326 15.117,81.097 40.246,111.246 -2.072,1.278 -3.975,2.809 -5.534,4.637 -26.174,-31.399 -41.934,-71.822 -41.934,-115.883 0,-18.187 2.678,-35.748 7.67,-52.311 3.359,-11.142 7.754,-21.835 13.092,-31.95 8.528,-16.208 19.446,-30.961 32.276,-43.801 1.251,-1.25 2.529,-2.491 3.817,-3.685 0.662,-0.644 1.334,-1.26 2.006,-1.876 10.862,-9.938 22.945,-18.578 36,-25.661 25.632,-13.913 55.016,-21.816 86.229,-21.816 2.454,0 4.908,0.047 7.334,0.14 36.056,1.446 69.424,13.427 97.054,32.976 0.569,0.392 1.148,0.793 1.698,1.204 7.82,5.655 15.164,11.925 21.966,18.718 7.904,7.904 15.07,16.526 21.406,25.773 2.556,3.723 4.973,7.558 7.25,11.477 15.499,26.697 24.382,57.723 24.382,90.812 C 53.038,-78.055 32.762,-32.762 0,0"
style="fill:#D0BCFF;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,898.49907,660.9888)"
clip-path="url(#clipPath21)" />
<path
id="path24"
d="M 0,0 -0.169,-0.292 C 1.43,-0.2 3.091,-0.108 4.798,0 Z"
style="fill:#D0BCFF;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,621.73933,661.8696)"
clip-path="url(#clipPath25)" />
<path
id="path26"
d="m 0,0 c -6.336,-9.247 -13.502,-17.869 -21.406,-25.773 -6.802,-6.793 -14.146,-13.063 -21.965,-18.718 -0.551,-0.411 -1.129,-0.812 -1.699,-1.204 -27.629,-19.549 -60.998,-31.53 -97.053,-32.976 -33.247,1.129 -64.852,8.762 -93.564,21.676 -13.054,7.082 -25.138,15.723 -36,25.661 -0.672,0.616 -1.343,1.232 -2.006,1.876 -1.288,1.194 -2.566,2.435 -3.816,3.685 -12.831,12.84 -23.748,27.593 -32.277,43.801 -1.092,7.651 -1.941,15.378 -2.445,23.039 -0.102,1.502 -0.186,3.004 -0.261,4.497 0,0 -2.865,29.795 23.944,36.634 26.827,6.84 65.654,19.745 87.722,50.305 0,0 0.327,-8.38 5.506,-15.779 8.034,-11.422 46.674,-100.46 46.674,-100.46 l 6.121,51.135 -13.978,15.079 -4.553,-1.987 15.228,16.544 c 0,0 8.94,4.218 16.554,-0.653 7.605,-4.899 14.146,-16.153 14.146,-16.153 l -5.879,3.892 -4.227,-12.364 c -0.756,-2.184 -0.83,-4.535 -0.233,-6.784 l 16.796,-62.687 c 0,0 -0.243,87.415 -2.781,111.685 0,0 14.221,-10.367 21.621,-14.454 7.381,-4.078 47.215,-20.407 53.738,-22.395 6.504,-1.987 13.222,-5.841 15.882,-11.916 1.026,-2.351 8.594,-26.939 17.486,-56.229 C -1.829,6.028 -0.914,3.023 0,0"
style="fill:#D0BCFF;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,927.04,968.0968)"
clip-path="url(#clipPath27)" />
<path
id="path28"
d="m 0,0 c 0,0 -3.081,-67.22 -8.64,-90.616 -5.559,-23.397 30.316,0 30.316,0 l 20.9,68.629 z"
style="fill:#D0BCFF;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,610.58507,756.01253)"
clip-path="url(#clipPath29)" />
<path
id="path30"
d="M 0,0 -0.169,-0.292 C 1.43,-0.2 3.091,-0.108 4.798,0 Z"
style="fill:#D0BCFF;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,621.73933,661.8696)"
clip-path="url(#clipPath31)" />
<path
id="path32"
d="m 0,0 c 0,0 12.178,7.604 15.029,18.355 0,0 36.913,-9.243 52.904,-26.719 C 66.887,-8.091 29.642,2.031 0,0 m -36.152,-5.643 c -26.791,0.404 -31.781,16.05 -34.086,29.523 -0.511,2.958 -3.148,5.073 -6.13,4.883 l -46.275,-4.764 14.922,7.14 c 3.505,1.687 7.164,3.077 10.895,4.17 3.742,1.093 7.556,1.901 11.429,2.376 4.051,0.499 8.542,1.01 13.46,1.509 0,0 6.19,2.459 7.414,-4.479 1.259,-6.926 0.499,-31.864 28.287,-31.103 27.777,0.76 32.612,19.412 32.612,19.412 0,0 3.458,14.471 9.232,14.257 5.263,-0.202 7.27,-6.142 7.853,-10.479 0.142,-1.045 -0.06,-3.54 0.582,-4.324 -0.939,1.152 -2.162,2.032 -3.564,2.554 C 7.604,26.113 3.065,26.945 2.471,21.658 1.616,13.877 -9.599,-6.059 -36.152,-5.643 m 13.306,48.354 9.528,-2.377 c 0,0 -2.388,-17.5 -11.227,-21.979 -0.25,-0.13 4.194,14.281 1.699,24.356 m 59.022,3.041 3.79,-1.687 c 0,0 2.198,-14.209 -3.79,-20.577 0,0 2.174,12.474 0,22.264 m -187.451,35.63 c 12.225,2.067 24.45,4.229 36.664,6.332 l 36.663,6.392 73.303,12.748 c 2.958,0.522 5.774,-1.462 6.285,-4.408 0.522,-2.947 -1.462,-5.762 -4.42,-6.285 -0.119,-0.024 -0.261,-0.036 -0.38,-0.047 H -3.184 L -114.243,85.029 c -12.344,-1.224 -24.676,-2.495 -37.032,-3.647 M 43.97,16.93 c 3.54,4.693 5.215,23.096 5.215,23.096 l 1.497,2.518 v 8.744 C 29.381,61.327 11.869,50.682 11.869,50.682 l -16.491,0.749 c -3.112,0.142 -7.449,2.637 -10.644,3.433 -4.42,1.093 -8.804,2.068 -13.342,2.566 -16.407,1.735 -32.933,0 -49.091,-2.934 -7.021,-1.271 -13.971,-2.851 -20.957,-4.325 -6.701,-1.425 -12.878,-3.908 -19.151,-6.605 -4.313,-1.842 -8.649,-3.659 -12.641,-6.119 -2.436,-1.496 -4.741,-3.243 -6.737,-5.31 -2.126,-2.21 -3.659,-4.859 -5.476,-7.319 -1.545,-2.091 -4.907,-0.463 -4.147,2.032 0.024,0.059 0.048,0.119 0.06,0.154 0.867,2.044 2.221,4.646 3.659,6.345 3.588,4.241 8.958,8.292 13.686,11.12 10.039,6.071 21.48,9.766 32.767,12.985 24.771,7.057 51.442,8.138 77.009,10.55 14.114,1.331 28.43,2.091 42.473,4.016 12.784,1.734 37.935,4.859 36.176,22.882 -1.71,18.129 -59.355,18.712 -59.355,18.712 0,0 -21.943,45.027 -27.372,50.468 -5.418,5.418 -16.503,18.474 -74.254,4.384 -57.739,-14.078 -55.327,-42.259 -55.327,-42.259 l -2.412,-39.622 c 0,0 -43.198,-11.179 -41.832,-23.321 1.391,-12.142 39.171,-12.819 39.171,-12.819 0,0 8.577,0.439 20.696,1.152 l -5.382,-9.683 c -6.749,-12.13 -6.38,-25.258 -8.851,-38.908 -4.277,-23.631 11.963,-52.702 33.978,-62.147 21.1,-9.053 53.949,-13.782 99.012,6.368 11.085,4.954 20.328,13.282 26.66,23.618 l 0.499,0.796 c 22.728,26.125 80.574,9.386 80.574,9.386 C 81.774,1.699 43.97,16.93 43.97,16.93"
style="fill:#D0BCFF;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,819.35627,748.08933)"
clip-path="url(#clipPath33)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -3,12 +3,15 @@ Description=Dank Material Shell (DMS)
PartOf=graphical-session.target
After=graphical-session-pre.target
Wants=graphical-session-pre.target
Requisite=graphical-session.target
[Service]
Type=simple
ExecStart=/usr/bin/dms run
ExecReload=/usr/bin/pkill -USR1 -x dms
Restart=on-failure
RestartSec=1
TimeoutStopSec=10
[Install]
WantedBy=graphical-session.target

View File

@@ -1,7 +1,7 @@
# Spec for DMS Greeter - Git builds using rpkg macros
%global debug_package %{nil}
%global version {{{ git_dir_version }}}
%global version {{{ git_repo_version }}}
%global pkg_summary DankMaterialShell greeter for greetd
Name: dms-greeter
@@ -11,8 +11,8 @@ Summary: %{pkg_summary}
License: GPL-3.0-only
URL: https://github.com/AvengeMedia/DankMaterialShell
VCS: {{{ git_dir_vcs }}}
Source0: {{{ git_dir_pack }}}
VCS: {{{ git_repo_vcs }}}
Source0: {{{ git_repo_pack }}}
BuildRequires: git-core
BuildRequires: rpkg
@@ -41,7 +41,7 @@ compositor detection and configuration. Features session selection, user
authentication, and dynamic theming.
%prep
{{{ git_dir_setup_macro }}}
{{{ git_repo_setup_macro }}}
%build
# QML-based application
@@ -353,4 +353,4 @@ if [ "$1" -eq 0 ] && [ -x /usr/sbin/semanage ]; then
fi
%changelog
{{{ git_dir_changelog }}}
{{{ git_repo_changelog }}}

View File

@@ -1,7 +1,7 @@
# Spec for DMS - uses rpkg macros for git builds
%global debug_package %{nil}
%global version {{{ git_dir_version }}}
%global version {{{ git_repo_version }}}
%global pkg_summary DankMaterialShell - Material 3 inspired shell for Wayland compositors
Name: dms
@@ -12,8 +12,8 @@ Summary: %{pkg_summary}
License: GPL-3.0-only
URL: https://github.com/AvengeMedia/DankMaterialShell
VCS: {{{ git_dir_vcs }}}
Source0: {{{ git_dir_pack }}}
VCS: {{{ git_repo_vcs }}}
Source0: {{{ git_repo_pack }}}
# DMS CLI from danklinux latest commit
Source1: https://github.com/AvengeMedia/danklinux/archive/refs/heads/master.tar.gz
@@ -24,6 +24,7 @@ BuildRequires: gzip
BuildRequires: golang >= 1.24
BuildRequires: make
BuildRequires: wget
BuildRequires: systemd-rpm-macros
# Core requirements
Requires: (quickshell-git or quickshell)
@@ -32,9 +33,9 @@ Requires: dms-cli
Requires: dgop
# Core utilities (Highly recommended for DMS functionality)
Recommends: brightnessctl
Recommends: cava
Recommends: cliphist
Recommends: danksearch
Recommends: hyprpicker
Recommends: matugen
Recommends: quickshell-git
@@ -75,7 +76,7 @@ network statistics. Designed for integration with DankMaterialShell but can be
used standalone. This package always includes the latest stable dgop release.
%prep
{{{ git_dir_setup_macro }}}
{{{ git_repo_setup_macro }}}
# Extract DankLinux source
tar -xzf %{SOURCE1} -C %{_builddir}
@@ -126,6 +127,9 @@ install -Dm755 %{_builddir}/danklinux-master/bin/${DMS_BINARY} %{buildroot}%{_bi
# Install dgop binary
install -Dm755 %{_builddir}/dgop %{buildroot}%{_bindir}/dgop
# Install systemd user service
install -Dm644 assets/systemd/dms.service %{buildroot}%{_userunitdir}/dms.service
# Install shell files to shared data location
install -dm755 %{buildroot}%{_datadir}/quickshell/dms
cp -r * %{buildroot}%{_datadir}/quickshell/dms/
@@ -181,6 +185,7 @@ fi
%license LICENSE
%doc README.md CONTRIBUTING.md
%{_datadir}/quickshell/dms/
%{_userunitdir}/dms.service
%files -n dms-cli
%{_bindir}/dms
@@ -189,4 +194,4 @@ fi
%{_bindir}/dgop
%changelog
{{{ git_dir_changelog }}}
{{{ git_repo_changelog }}}

View File

@@ -25,9 +25,9 @@
["aarch64-darwin" "aarch64-linux" "x86_64-darwin" "x86_64-linux"]
(system: fn system nixpkgs.legacyPackages.${system});
buildDmsPkgs = pkgs: {
dmsCli = dms-cli.packages.${pkgs.system}.default;
dgop = dgop.packages.${pkgs.system}.dgop;
dankMaterialShell = self.packages.${pkgs.system}.dankMaterialShell;
dmsCli = dms-cli.packages.${pkgs.stdenv.hostPlatform.system}.default;
dgop = dgop.packages.${pkgs.stdenv.hostPlatform.system}.dgop;
dankMaterialShell = self.packages.${pkgs.stdenv.hostPlatform.system}.dankMaterialShell;
};
in {
formatter = forEachSystem (_: pkgs: pkgs.alejandra);

View File

@@ -0,0 +1,3 @@
[templates.dmsalacritty]
input_path = './matugen/templates/alacritty.toml'
output_path = '~/.config/alacritty/dank-theme.toml'

View File

@@ -0,0 +1,3 @@
[templates.dmsfoot]
input_path = './matugen/templates/foot.ini'
output_path = '~/.config/foot/dank-colors.ini'

View File

@@ -1,3 +1,4 @@
[templates.dmspywalfox]
input_path = './matugen/templates/pywalfox-colors.json'
output_path = '~/.cache/wal/dank-pywalfox.json'
output_path = '~/.cache/wal/dank-pywalfox.json'
post_hook = 'command -v pywalfox && test -f ~/.cache/wal/colors.json && pywalfox update'

View File

@@ -0,0 +1,13 @@
[templates.dmsvscodedefault]
input_path = './matugen/templates/vscode-color-theme.json'
output_path = '~/.vscode/extensions/local.dynamic-base16-dankshell-0.0.1/themes/dankshell-default-base.json'
[templates.dmsvscodedark]
input_path = './matugen/templates/vscode-color-theme.json'
output_path = '~/.vscode/extensions/local.dynamic-base16-dankshell-0.0.1/themes/dankshell-dark-base.json'
mode = 'Dark'
[templates.dmsvscodelight]
input_path = './matugen/templates/vscode-color-theme.json'
output_path = '~/.vscode/extensions/local.dynamic-base16-dankshell-0.0.1/themes/dankshell-light-base.json'
mode = 'Light'

View File

@@ -1,252 +0,0 @@
#!/usr/bin/env python3
import colorsys
import sys
def hex_to_rgb(hex_color):
hex_color = hex_color.lstrip('#')
return tuple(int(hex_color[i:i+2], 16)/255.0 for i in (0, 2, 4))
def rgb_to_hex(r, g, b):
r = max(0, min(1, r))
g = max(0, min(1, g))
b = max(0, min(1, b))
return f"#{int(r*255):02x}{int(g*255):02x}{int(b*255):02x}"
def luminance(hex_color):
r, g, b = hex_to_rgb(hex_color)
def srgb_to_linear(c):
return c/12.92 if c <= 0.03928 else ((c + 0.055)/1.055) ** 2.4
return 0.2126 * srgb_to_linear(r) + 0.7152 * srgb_to_linear(g) + 0.0722 * srgb_to_linear(b)
def contrast_ratio(hex_fg, hex_bg):
lum_fg = luminance(hex_fg)
lum_bg = luminance(hex_bg)
lighter = max(lum_fg, lum_bg)
darker = min(lum_fg, lum_bg)
return (lighter + 0.05) / (darker + 0.05)
def ensure_contrast(hex_color, hex_bg, min_ratio=4.5, is_light_mode=False):
current_ratio = contrast_ratio(hex_color, hex_bg)
if current_ratio >= min_ratio:
return hex_color
r, g, b = hex_to_rgb(hex_color)
h, s, v = colorsys.rgb_to_hsv(r, g, b)
for step in range(1, 30):
delta = step * 0.02
if is_light_mode:
new_v = max(0, v - delta)
candidate = rgb_to_hex(*colorsys.hsv_to_rgb(h, s, new_v))
if contrast_ratio(candidate, hex_bg) >= min_ratio:
return candidate
new_v = min(1, v + delta)
candidate = rgb_to_hex(*colorsys.hsv_to_rgb(h, s, new_v))
if contrast_ratio(candidate, hex_bg) >= min_ratio:
return candidate
else:
new_v = min(1, v + delta)
candidate = rgb_to_hex(*colorsys.hsv_to_rgb(h, s, new_v))
if contrast_ratio(candidate, hex_bg) >= min_ratio:
return candidate
new_v = max(0, v - delta)
candidate = rgb_to_hex(*colorsys.hsv_to_rgb(h, s, new_v))
if contrast_ratio(candidate, hex_bg) >= min_ratio:
return candidate
return hex_color
def generate_palette(base_color, is_light=False, honor_primary=None, background=None):
r, g, b = hex_to_rgb(base_color)
h, s, v = colorsys.rgb_to_hsv(r, g, b)
palette = []
if background:
bg_color = background
palette.append(bg_color)
elif is_light:
bg_color = "#f8f8f8"
palette.append(bg_color)
else:
bg_color = "#1a1a1a"
palette.append(bg_color)
red_h = 0.0
if is_light:
red_color = rgb_to_hex(*colorsys.hsv_to_rgb(red_h, 0.75, 0.85))
palette.append(ensure_contrast(red_color, bg_color, 4.5, is_light))
else:
red_color = rgb_to_hex(*colorsys.hsv_to_rgb(red_h, 0.6, 0.8))
palette.append(ensure_contrast(red_color, bg_color, 4.5, is_light))
green_h = 0.33
if is_light:
green_color = rgb_to_hex(*colorsys.hsv_to_rgb(green_h, max(s * 0.9, 0.75), v * 0.6))
palette.append(ensure_contrast(green_color, bg_color, 4.5, is_light))
else:
green_color = rgb_to_hex(*colorsys.hsv_to_rgb(green_h, max(s * 0.65, 0.5), v * 0.9))
palette.append(ensure_contrast(green_color, bg_color, 4.5, is_light))
yellow_h = 0.08
if is_light:
yellow_color = rgb_to_hex(*colorsys.hsv_to_rgb(yellow_h, max(s * 0.85, 0.7), v * 0.7))
palette.append(ensure_contrast(yellow_color, bg_color, 4.5, is_light))
else:
yellow_color = rgb_to_hex(*colorsys.hsv_to_rgb(yellow_h, max(s * 0.5, 0.45), v * 1.4))
palette.append(ensure_contrast(yellow_color, bg_color, 4.5, is_light))
if is_light:
blue_color = rgb_to_hex(*colorsys.hsv_to_rgb(h, max(s * 0.9, 0.7), v * 1.1))
palette.append(ensure_contrast(blue_color, bg_color, 4.5, is_light))
else:
blue_color = rgb_to_hex(*colorsys.hsv_to_rgb(h, max(s * 0.8, 0.6), min(v * 1.6, 1.0)))
palette.append(ensure_contrast(blue_color, bg_color, 4.5, is_light))
mag_h = h - 0.03 if h >= 0.03 else h + 0.97
if honor_primary:
hr, hg, hb = hex_to_rgb(honor_primary)
hh, hs, hv = colorsys.rgb_to_hsv(hr, hg, hb)
if is_light:
mag_color = rgb_to_hex(*colorsys.hsv_to_rgb(hh, max(hs * 0.9, 0.7), hv * 0.85))
palette.append(ensure_contrast(mag_color, bg_color, 4.5, is_light))
else:
mag_color = rgb_to_hex(*colorsys.hsv_to_rgb(hh, hs * 0.8, hv * 0.75))
palette.append(ensure_contrast(mag_color, bg_color, 4.5, is_light))
elif is_light:
mag_color = rgb_to_hex(*colorsys.hsv_to_rgb(mag_h, max(s * 0.75, 0.6), v * 0.9))
palette.append(ensure_contrast(mag_color, bg_color, 4.5, is_light))
else:
mag_color = rgb_to_hex(*colorsys.hsv_to_rgb(mag_h, max(s * 0.7, 0.6), v * 0.85))
palette.append(ensure_contrast(mag_color, bg_color, 4.5, is_light))
cyan_h = h + 0.08
if honor_primary:
palette.append(ensure_contrast(honor_primary, bg_color, 4.5, is_light))
elif is_light:
cyan_color = rgb_to_hex(*colorsys.hsv_to_rgb(cyan_h, max(s * 0.8, 0.65), v * 1.05))
palette.append(ensure_contrast(cyan_color, bg_color, 4.5, is_light))
else:
cyan_color = rgb_to_hex(*colorsys.hsv_to_rgb(cyan_h, max(s * 0.6, 0.5), min(v * 1.25, 0.85)))
palette.append(ensure_contrast(cyan_color, bg_color, 4.5, is_light))
if is_light:
palette.append("#2e2e2e")
palette.append("#4a4a4a")
else:
palette.append("#abb2bf")
palette.append("#5c6370")
if is_light:
bright_red = rgb_to_hex(*colorsys.hsv_to_rgb(red_h, 0.6, 0.9))
palette.append(ensure_contrast(bright_red, bg_color, 3.0, is_light))
bright_green = rgb_to_hex(*colorsys.hsv_to_rgb(green_h, max(s * 0.8, 0.7), v * 0.65))
palette.append(ensure_contrast(bright_green, bg_color, 3.0, is_light))
bright_yellow = rgb_to_hex(*colorsys.hsv_to_rgb(yellow_h, max(s * 0.75, 0.65), v * 0.75))
palette.append(ensure_contrast(bright_yellow, bg_color, 3.0, is_light))
if honor_primary:
hr, hg, hb = hex_to_rgb(honor_primary)
hh, hs, hv = colorsys.rgb_to_hsv(hr, hg, hb)
bright_blue = rgb_to_hex(*colorsys.hsv_to_rgb(hh, min(hs * 1.1, 1.0), min(hv * 1.2, 1.0)))
palette.append(ensure_contrast(bright_blue, bg_color, 3.0, is_light))
else:
bright_blue = rgb_to_hex(*colorsys.hsv_to_rgb(h, max(s * 0.8, 0.7), min(v * 1.3, 1.0)))
palette.append(ensure_contrast(bright_blue, bg_color, 3.0, is_light))
bright_mag = rgb_to_hex(*colorsys.hsv_to_rgb(mag_h, max(s * 0.9, 0.75), min(v * 1.25, 1.0)))
palette.append(ensure_contrast(bright_mag, bg_color, 3.0, is_light))
bright_cyan = rgb_to_hex(*colorsys.hsv_to_rgb(cyan_h, max(s * 0.75, 0.65), min(v * 1.25, 1.0)))
palette.append(ensure_contrast(bright_cyan, bg_color, 3.0, is_light))
else:
bright_red = rgb_to_hex(*colorsys.hsv_to_rgb(red_h, 0.45, min(1.0, 0.9)))
palette.append(ensure_contrast(bright_red, bg_color, 3.0, is_light))
bright_green = rgb_to_hex(*colorsys.hsv_to_rgb(green_h, max(s * 0.5, 0.4), min(v * 1.5, 0.9)))
palette.append(ensure_contrast(bright_green, bg_color, 3.0, is_light))
bright_yellow = rgb_to_hex(*colorsys.hsv_to_rgb(yellow_h, max(s * 0.4, 0.35), min(v * 1.6, 0.95)))
palette.append(ensure_contrast(bright_yellow, bg_color, 3.0, is_light))
if honor_primary:
hr, hg, hb = hex_to_rgb(honor_primary)
hh, hs, hv = colorsys.rgb_to_hsv(hr, hg, hb)
bright_blue = rgb_to_hex(*colorsys.hsv_to_rgb(hh, min(hs * 1.2, 1.0), min(hv * 1.1, 1.0)))
palette.append(ensure_contrast(bright_blue, bg_color, 3.0, is_light))
else:
bright_blue = rgb_to_hex(*colorsys.hsv_to_rgb(h, max(s * 0.6, 0.5), min(v * 1.5, 0.9)))
palette.append(ensure_contrast(bright_blue, bg_color, 3.0, is_light))
bright_mag = rgb_to_hex(*colorsys.hsv_to_rgb(mag_h, max(s * 0.7, 0.6), min(v * 1.3, 0.9)))
palette.append(ensure_contrast(bright_mag, bg_color, 3.0, is_light))
bright_cyan = rgb_to_hex(*colorsys.hsv_to_rgb(h + 0.02 if h + 0.02 <= 1.0 else h + 0.02 - 1.0, max(s * 0.6, 0.5), min(v * 1.2, 0.85)))
palette.append(ensure_contrast(bright_cyan, bg_color, 3.0, is_light))
if is_light:
palette.append("#1a1a1a")
else:
palette.append("#ffffff")
return palette
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Usage: dank16.py <hex_color> [--light] [--kitty] [--honor-primary HEX] [--background HEX]", file=sys.stderr)
sys.exit(1)
base = sys.argv[1]
if not base.startswith('#'):
base = '#' + base
is_light = "--light" in sys.argv
is_kitty = "--kitty" in sys.argv
honor_primary = None
if "--honor-primary" in sys.argv:
try:
honor_idx = sys.argv.index("--honor-primary")
if honor_idx + 1 < len(sys.argv):
honor_primary = sys.argv[honor_idx + 1]
if not honor_primary.startswith('#'):
honor_primary = '#' + honor_primary
except (ValueError, IndexError):
print("Error: --honor-primary requires a hex color", file=sys.stderr)
sys.exit(1)
background = None
if "--background" in sys.argv:
try:
bg_idx = sys.argv.index("--background")
if bg_idx + 1 < len(sys.argv):
background = sys.argv[bg_idx + 1]
if not background.startswith('#'):
background = '#' + background
except (ValueError, IndexError):
print("Error: --background requires a hex color", file=sys.stderr)
sys.exit(1)
colors = generate_palette(base, is_light, honor_primary, background)
if is_kitty:
# Kitty color format mapping
kitty_colors = [
("color0", colors[0]),
("color1", colors[1]),
("color2", colors[2]),
("color3", colors[3]),
("color4", colors[4]),
("color5", colors[5]),
("color6", colors[6]),
("color7", colors[7]),
("color8", colors[8]),
("color9", colors[9]),
("color10", colors[10]),
("color11", colors[11]),
("color12", colors[12]),
("color13", colors[13]),
("color14", colors[14]),
("color15", colors[15])
]
for name, color in kitty_colors:
print(f"{name} {color}")
else:
for i, color in enumerate(colors):
print(f"palette = {i}={color}")

View File

@@ -0,0 +1,11 @@
[colors.primary]
background = '{{colors.surface.default.hex}}'
foreground = '{{colors.on_surface.default.hex}}'
[colors.selection]
text = '{{colors.on_surface.default.hex}}'
background = '{{colors.primary_container.default.hex}}'
[colors.cursor]
text = '{{colors.surface.default.hex}}'
cursor = '{{colors.primary.default.hex}}'

View File

@@ -0,0 +1,5 @@
[colors]
foreground={{colors.on_surface.default.hex_stripped}}
background={{colors.surface.default.hex_stripped}}
selection-foreground={{colors.on_surface.default.hex_stripped}}
selection-background={{colors.primary_container.default.hex_stripped}}

View File

@@ -0,0 +1,316 @@
{
"$schema": "vscode://schemas/color-theme",
"name": "Dynamic Base16 DankShell",
"type": "dark",
"colors": {
"editor.background": "{{colors.surface.default.hex}}",
"editor.foreground": "{{colors.on_surface.default.hex}}",
"editorLineNumber.foreground": "{{colors.outline.default.hex}}",
"editorLineNumber.activeForeground": "{{colors.on_surface.default.hex}}",
"editorCursor.foreground": "{{colors.primary.default.hex}}",
"editor.selectionBackground": "{{colors.primary_container.default.hex}}",
"editor.inactiveSelectionBackground": "{{colors.surface_container.default.hex}}",
"editor.lineHighlightBackground": "{{colors.surface_container.default.hex}}",
"editorIndentGuide.background": "{{colors.surface_container_high.default.hex}}",
"editorIndentGuide.activeBackground": "{{colors.outline.default.hex}}",
"editorWhitespace.foreground": "{{colors.outline_variant.default.hex}}",
"editorBracketMatch.background": "{{colors.surface_container_high.default.hex}}",
"editorBracketMatch.border": "{{colors.primary.default.hex}}",
"activityBar.background": "{{colors.surface.default.hex}}",
"activityBar.foreground": "{{colors.on_surface.default.hex}}",
"activityBar.activeBorder": "{{colors.primary.default.hex}}",
"activityBar.activeBackground": "{{colors.surface_container.default.hex}}",
"activityBarBadge.background": "{{colors.primary.default.hex}}",
"activityBarBadge.foreground": "{{colors.on_primary.default.hex}}",
"sideBar.background": "{{colors.surface.default.hex}}",
"sideBar.foreground": "{{colors.on_surface.default.hex}}",
"sideBar.border": "{{colors.surface_container.default.hex}}",
"sideBarTitle.foreground": "{{colors.on_surface.default.hex}}",
"sideBarSectionHeader.background": "{{colors.surface_container.default.hex}}",
"sideBarSectionHeader.foreground": "{{colors.on_surface.default.hex}}",
"list.activeSelectionBackground": "{{colors.surface_container_high.default.hex}}",
"list.activeSelectionForeground": "{{colors.on_surface.default.hex}}",
"list.inactiveSelectionBackground": "{{colors.surface_container.default.hex}}",
"list.inactiveSelectionForeground": "{{colors.on_surface.default.hex}}",
"list.hoverBackground": "{{colors.surface_container.default.hex}}",
"list.hoverForeground": "{{colors.on_surface.default.hex}}",
"list.focusBackground": "{{colors.surface_container_high.default.hex}}",
"list.focusForeground": "{{colors.on_surface.default.hex}}",
"list.highlightForeground": "{{colors.primary.default.hex}}",
"statusBar.background": "{{colors.surface.default.hex}}",
"statusBar.foreground": "{{colors.on_surface.default.hex}}",
"statusBar.border": "{{colors.surface_container.default.hex}}",
"statusBar.noFolderBackground": "{{colors.surface.default.hex}}",
"statusBar.debuggingBackground": "{{colors.error.default.hex}}",
"statusBar.debuggingForeground": "{{colors.on_error.default.hex}}",
"tab.activeBackground": "{{colors.surface.default.hex}}",
"tab.inactiveBackground": "{{colors.surface_container.default.hex}}",
"tab.activeForeground": "{{colors.on_surface.default.hex}}",
"tab.inactiveForeground": "{{colors.outline.default.hex}}",
"tab.border": "{{colors.surface.default.hex}}",
"tab.activeBorder": "{{colors.primary.default.hex}}",
"tab.unfocusedActiveBorder": "{{colors.outline.default.hex}}",
"editorGroupHeader.tabsBackground": "{{colors.surface_container.default.hex}}",
"editorGroupHeader.noTabsBackground": "{{colors.surface.default.hex}}",
"titleBar.activeBackground": "{{colors.surface.default.hex}}",
"titleBar.activeForeground": "{{colors.on_surface.default.hex}}",
"titleBar.inactiveBackground": "{{colors.surface.default.hex}}",
"titleBar.inactiveForeground": "{{colors.outline.default.hex}}",
"titleBar.border": "{{colors.surface_container.default.hex}}",
"input.background": "{{colors.surface_container.default.hex}}",
"input.foreground": "{{colors.on_surface.default.hex}}",
"input.border": "{{colors.outline.default.hex}}",
"input.placeholderForeground": "{{colors.outline.default.hex}}",
"inputOption.activeBorder": "{{colors.primary.default.hex}}",
"inputValidation.errorBackground": "{{colors.error.default.hex}}",
"inputValidation.errorBorder": "{{colors.error.default.hex}}",
"dropdown.background": "{{colors.surface_container.default.hex}}",
"dropdown.foreground": "{{colors.on_surface.default.hex}}",
"dropdown.border": "{{colors.outline.default.hex}}",
"quickInput.background": "{{colors.surface_container.default.hex}}",
"quickInput.foreground": "{{colors.on_surface.default.hex}}",
"quickInputList.focusBackground": "{{colors.surface_container_high.default.hex}}",
"quickInputList.focusForeground": "{{colors.on_surface.default.hex}}",
"button.background": "{{colors.primary.default.hex}}",
"button.foreground": "{{colors.on_primary.default.hex}}",
"button.hoverBackground": "{{colors.primary_container.default.hex}}",
"focusBorder": "{{colors.primary.default.hex}}",
"badge.background": "{{colors.secondary.default.hex}}",
"badge.foreground": "{{colors.on_secondary.default.hex}}",
"panel.background": "{{colors.surface.default.hex}}",
"panel.border": "{{colors.primary.default.hex}}",
"panelTitle.activeBorder": "{{colors.primary.default.hex}}",
"panelTitle.activeForeground": "{{colors.on_surface.default.hex}}",
"panelTitle.inactiveForeground": "{{colors.outline.default.hex}}",
"terminal.background": "{{colors.surface.default.hex}}",
"terminal.foreground": "{{colors.on_surface.default.hex}}",
"gitDecoration.modifiedResourceForeground": "{{colors.primary.default.hex}}",
"gitDecoration.addedResourceForeground": "{{colors.primary.default.hex}}",
"gitDecoration.stageModifiedResourceForeground": "{{colors.primary.default.hex}}",
"gitDecoration.stageDeletedResourceForeground": "{{colors.error.default.hex}}",
"gitDecoration.deletedResourceForeground": "{{colors.error.default.hex}}",
"gitDecoration.untrackedResourceForeground": "{{colors.secondary.default.hex}}",
"gitDecoration.ignoredResourceForeground": "{{colors.outline.default.hex}}",
"gitDecoration.conflictingResourceForeground": "{{colors.error_container.default.hex}}",
"gitDecoration.submoduleResourceForeground": "{{colors.primary.default.hex}}",
"editorWidget.background": "{{colors.surface_container.default.hex}}",
"editorWidget.border": "{{colors.outline.default.hex}}",
"editorSuggestWidget.background": "{{colors.surface_container.default.hex}}",
"editorSuggestWidget.border": "{{colors.outline.default.hex}}",
"editorSuggestWidget.selectedBackground": "{{colors.surface_container_high.default.hex}}",
"editorSuggestWidget.highlightForeground": "{{colors.primary.default.hex}}",
"peekView.border": "{{colors.primary.default.hex}}",
"peekViewEditor.background": "{{colors.surface_container.default.hex}}",
"peekViewResult.background": "{{colors.surface_container.default.hex}}",
"peekViewTitle.background": "{{colors.surface_container.default.hex}}",
"notificationCenter.border": "{{colors.outline.default.hex}}",
"notifications.background": "{{colors.surface_container.default.hex}}",
"notifications.border": "{{colors.outline.default.hex}}",
"breadcrumb.foreground": "{{colors.outline.default.hex}}",
"breadcrumb.focusForeground": "{{colors.on_surface.default.hex}}",
"breadcrumb.activeSelectionForeground": "{{colors.primary.default.hex}}",
"scrollbarSlider.background": "{{colors.outline.default.hex}}40",
"scrollbarSlider.hoverBackground": "{{colors.outline.default.hex}}60",
"scrollbarSlider.activeBackground": "{{colors.outline.default.hex}}80",
"editorError.foreground": "{{colors.error.default.hex}}",
"editorWarning.foreground": "{{colors.tertiary.default.hex}}",
"editorInfo.foreground": "{{colors.primary.default.hex}}",
"editorGutter.addedBackground": "{{colors.secondary.default.hex}}",
"editorGutter.modifiedBackground": "{{colors.tertiary.default.hex}}",
"editorGutter.deletedBackground": "{{colors.error.default.hex}}",
"diffEditor.insertedTextBackground": "{{colors.secondary.default.hex}}20",
"diffEditor.removedTextBackground": "{{colors.error.default.hex}}20",
"merge.currentHeaderBackground": "{{colors.primary.default.hex}}40",
"merge.incomingHeaderBackground": "{{colors.secondary.default.hex}}40",
"menubar.selectionBackground": "{{colors.surface_container_high.default.hex}}",
"menu.background": "{{colors.surface_container.default.hex}}",
"menu.foreground": "{{colors.on_surface.default.hex}}",
"menu.selectionBackground": "{{colors.surface_container_high.default.hex}}",
"menu.selectionForeground": "{{colors.on_surface.default.hex}}",
"debugToolBar.background": "{{colors.surface_container.default.hex}}",
"debugExceptionWidget.background": "{{colors.surface_container.default.hex}}",
"debugExceptionWidget.border": "{{colors.error.default.hex}}"
},
"tokenColors": [
{
"scope": ["comment", "punctuation.definition.comment"],
"settings": {
"foreground": "{{colors.outline.default.hex}}",
"fontStyle": "italic"
}
},
{
"scope": ["keyword", "storage.type", "storage.modifier"],
"settings": {
"foreground": "{{colors.primary.default.hex}}"
}
},
{
"scope": ["variable", "meta.object-literal.key"],
"settings": {
"foreground": "{{colors.on_surface.default.hex}}"
}
},
{
"scope": ["string", "constant.other.symbol"],
"settings": {
"foreground": "{{colors.secondary.default.hex}}"
}
},
{
"scope": ["constant.numeric", "constant.language", "constant.character"],
"settings": {
"foreground": "{{colors.tertiary.default.hex}}"
}
},
{
"scope": ["entity.name.type", "support.type", "entity.name.class"],
"settings": {
"foreground": "{{colors.tertiary.default.hex}}"
}
},
{
"scope": ["entity.name.function", "support.function"],
"settings": {
"foreground": "{{colors.primary.default.hex}}"
}
},
{
"scope": ["support.class", "support.variable", "variable.language"],
"settings": {
"foreground": "{{colors.secondary.default.hex}}"
}
},
{
"scope": ["invalid"],
"settings": {
"foreground": "{{colors.error.default.hex}}"
}
},
{
"scope": ["invalid.deprecated"],
"settings": {
"foreground": "{{colors.outline.default.hex}}"
}
},
{
"scope": ["markup.heading"],
"settings": {
"foreground": "{{colors.primary.default.hex}}",
"fontStyle": "bold"
}
},
{
"scope": ["markup.bold"],
"settings": {
"foreground": "{{colors.tertiary.default.hex}}",
"fontStyle": "bold"
}
},
{
"scope": ["markup.italic"],
"settings": {
"foreground": "{{colors.primary.default.hex}}",
"fontStyle": "italic"
}
},
{
"scope": ["markup.underline"],
"settings": {
"fontStyle": "underline"
}
},
{
"scope": ["markup.quote"],
"settings": {
"foreground": "{{colors.secondary.default.hex}}"
}
},
{
"scope": ["markup.list"],
"settings": {
"foreground": "{{colors.on_surface.default.hex}}"
}
},
{
"scope": ["markup.raw", "markup.inline.raw"],
"settings": {
"foreground": "{{colors.secondary.default.hex}}"
}
}
],
"semanticHighlighting": true,
"semanticTokenColors": {
"variable.readonly": {
"foreground": "{{colors.tertiary.default.hex}}"
},
"property": {
"foreground": "{{colors.on_surface.default.hex}}"
},
"function": {
"foreground": "{{colors.primary.default.hex}}"
},
"method": {
"foreground": "{{colors.primary.default.hex}}"
},
"type": {
"foreground": "{{colors.tertiary.default.hex}}"
},
"class": {
"foreground": "{{colors.tertiary.default.hex}}"
},
"enumMember": {
"foreground": "{{colors.tertiary.default.hex}}"
},
"string": {
"foreground": "{{colors.secondary.default.hex}}"
},
"number": {
"foreground": "{{colors.tertiary.default.hex}}"
},
"comment": {
"foreground": "{{colors.outline.default.hex}}",
"fontStyle": "italic"
},
"keyword": {
"foreground": "{{colors.primary.default.hex}}"
},
"operator": {
"foreground": "{{colors.on_surface.default.hex}}"
},
"parameter": {
"foreground": "{{colors.on_surface.default.hex}}"
},
"namespace": {
"foreground": "{{colors.secondary.default.hex}}"
}
}
}

View File

@@ -0,0 +1,31 @@
{
"name": "dynamic-base16-dankshell",
"displayName": "Dynamic Base16 DankShell",
"publisher": "local",
"version": "0.0.1",
"engines": {
"vscode": "^1.70.0"
},
"categories": [
"Themes"
],
"contributes": {
"themes": [
{
"label": "Dynamic Base16 DankShell",
"uiTheme": "vs-dark",
"path": "./themes/dankshell-default.json"
},
{
"label": "Dynamic Base16 DankShell (Dark)",
"uiTheme": "vs-dark",
"path": "./themes/dankshell-dark.json"
},
{
"label": "Dynamic Base16 DankShell (Light)",
"uiTheme": "vs",
"path": "./themes/dankshell-light.json"
}
]
}
}

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
<Metadata>
<Identity Language="en-US" Id="dynamic-base16-dankshell" Version="0.0.1" Publisher="local" />
<DisplayName>Dynamic Base16 DankShell</DisplayName>
<Description xml:space="preserve">Dynamic Material You theme with base16 terminal colors</Description>
<Categories>Themes</Categories>
<Properties>
<Property Id="Microsoft.VisualStudio.Code.Engine" Value="^1.70.0" />
<Property Id="Microsoft.VisualStudio.Code.ExtensionKind" Value="ui,workspace" />
</Properties>
</Metadata>
<Installation>
<InstallationTarget Id="Microsoft.VisualStudio.Code"/>
</Installation>
<Dependencies/>
<Assets>
<Asset Type="Microsoft.VisualStudio.Code.Manifest" Path="package.json" Addressable="true" />
</Assets>
</PackageManifest>

View File

@@ -1,237 +0,0 @@
#!/usr/bin/env python3
# Based on end-4 dots-hyprland get_keybinds.py
# https://github.com/end-4/dots-hyprland/blob/main/.config/quickshell/ii/scripts/hyprland/get_keybinds.py
import argparse
import re
import os
import glob
from os.path import expandvars as os_expandvars
from typing import Dict, List
TITLE_REGEX = "#+!"
HIDE_COMMENT = "[hidden]"
MOD_SEPARATORS = ['+', ' ']
COMMENT_BIND_PATTERN = "#/#"
parser = argparse.ArgumentParser(description='Hyprland keybind reader')
parser.add_argument('--path', type=str, default="$HOME/.config/hypr", help='path to hyprland config directory')
args = parser.parse_args()
content_lines = []
reading_line = 0
Variables: Dict[str, str] = {}
class KeyBinding(dict):
def __init__(self, mods, key, dispatcher, params, comment) -> None:
self["mods"] = mods
self["key"] = key
self["dispatcher"] = dispatcher
self["params"] = params
self["comment"] = comment
class Section(dict):
def __init__(self, children, keybinds, name) -> None:
self["children"] = children
self["keybinds"] = keybinds
self["name"] = name
def read_content(directory: str) -> str:
expanded_dir = os.path.expanduser(os.path.expandvars(directory))
if not os.path.isdir(expanded_dir):
return "error"
conf_files = glob.glob(os.path.join(expanded_dir, "*.conf"))
if not conf_files:
return "error"
combined_content = []
for conf_file in sorted(conf_files):
if os.access(conf_file, os.R_OK):
with open(conf_file, "r") as file:
combined_content.append(file.read())
return "\n".join(combined_content) if combined_content else "error"
def autogenerate_comment(dispatcher: str, params: str = "") -> str:
match dispatcher:
case "resizewindow":
return "Resize window"
case "movewindow":
if(params == ""):
return "Move window"
else:
return "Window: move in {} direction".format({
"l": "left",
"r": "right",
"u": "up",
"d": "down",
}.get(params, "null"))
case "pin":
return "Window: pin (show on all workspaces)"
case "splitratio":
return "Window split ratio {}".format(params)
case "togglefloating":
return "Float/unfloat window"
case "resizeactive":
return "Resize window by {}".format(params)
case "killactive":
return "Close window"
case "fullscreen":
return "Toggle {}".format(
{
"0": "fullscreen",
"1": "maximization",
"2": "fullscreen on Hyprland's side",
}.get(params, "null")
)
case "fakefullscreen":
return "Toggle fake fullscreen"
case "workspace":
if params == "+1":
return "Workspace: focus right"
elif params == "-1":
return "Workspace: focus left"
return "Focus workspace {}".format(params)
case "movefocus":
return "Window: move focus {}".format(
{
"l": "left",
"r": "right",
"u": "up",
"d": "down",
}.get(params, "null")
)
case "swapwindow":
return "Window: swap in {} direction".format(
{
"l": "left",
"r": "right",
"u": "up",
"d": "down",
}.get(params, "null")
)
case "movetoworkspace":
if params == "+1":
return "Window: move to right workspace (non-silent)"
elif params == "-1":
return "Window: move to left workspace (non-silent)"
return "Window: move to workspace {} (non-silent)".format(params)
case "movetoworkspacesilent":
if params == "+1":
return "Window: move to right workspace"
elif params == "-1":
return "Window: move to right workspace"
return "Window: move to workspace {}".format(params)
case "togglespecialworkspace":
return "Workspace: toggle special"
case "exec":
return "Execute: {}".format(params)
case _:
return ""
def get_keybind_at_line(line_number, line_start = 0):
global content_lines
line = content_lines[line_number]
_, keys = line.split("=", 1)
keys, *comment = keys.split("#", 1)
mods, key, dispatcher, *params = list(map(str.strip, keys.split(",", 4)))
params = "".join(map(str.strip, params))
# Remove empty spaces
comment = list(map(str.strip, comment))
# Add comment if it exists, else generate it
if comment:
comment = comment[0]
if comment.startswith("[hidden]"):
return None
else:
comment = autogenerate_comment(dispatcher, params)
if mods:
modstring = mods + MOD_SEPARATORS[0] # Add separator at end to ensure last mod is read
mods = []
p = 0
for index, char in enumerate(modstring):
if(char in MOD_SEPARATORS):
if(index - p > 1):
mods.append(modstring[p:index])
p = index+1
else:
mods = []
return KeyBinding(mods, key, dispatcher, params, comment)
def get_binds_recursive(current_content, scope):
global content_lines
global reading_line
# print("get_binds_recursive({0}, {1}) [@L{2}]".format(current_content, scope, reading_line + 1))
while reading_line < len(content_lines): # TODO: Adjust condition
line = content_lines[reading_line]
heading_search_result = re.search(TITLE_REGEX, line)
# print("Read line {0}: {1}\tisHeading: {2}".format(reading_line + 1, content_lines[reading_line], "[{0}, {1}, {2}]".format(heading_search_result.start(), heading_search_result.start() == 0, ((heading_search_result != None) and (heading_search_result.start() == 0))) if heading_search_result != None else "No"))
if ((heading_search_result != None) and (heading_search_result.start() == 0)): # Found title
# Determine scope
heading_scope = line.find('!')
# Lower? Return
if(heading_scope <= scope):
reading_line -= 1
return current_content
section_name = line[(heading_scope+1):].strip()
# print("[[ Found h{0} at line {1} ]] {2}".format(heading_scope, reading_line+1, content_lines[reading_line]))
reading_line += 1
current_content["children"].append(get_binds_recursive(Section([], [], section_name), heading_scope))
elif line.startswith(COMMENT_BIND_PATTERN):
keybind = get_keybind_at_line(reading_line, line_start=len(COMMENT_BIND_PATTERN))
if(keybind != None):
current_content["keybinds"].append(keybind)
elif line == "" or not line.lstrip().startswith("bind"): # Comment, ignore
pass
else: # Normal keybind
keybind = get_keybind_at_line(reading_line)
if(keybind != None):
current_content["keybinds"].append(keybind)
reading_line += 1
return current_content;
def parse_keys(path: str) -> Dict[str, List[KeyBinding]]:
global content_lines
content_lines = read_content(path).splitlines()
if content_lines[0] == "error":
return "error"
return get_binds_recursive(Section([], [], ""), 0)
if __name__ == "__main__":
import json
ParsedKeys = parse_keys(args.path)
print(json.dumps(ParsedKeys))

View File

@@ -41,6 +41,16 @@ LOCK="$STATE_DIR/matugen-worker.lock"
exec 9>"$LOCK"
flock 9
rm -f "$BUILT_KEY"
get_matugen_major_version() {
local version_output=$(matugen --version 2>&1)
local version=$(echo "$version_output" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -n1)
local major=$(echo "$version" | cut -d. -f1)
echo "$major"
}
MATUGEN_VERSION=$(get_matugen_major_version)
read_desired() {
[[ ! -f "$DESIRED_JSON" ]] && { echo "no desired state" >&2; exit 0; }
@@ -178,8 +188,8 @@ EOF
trap 'rm -rf "$TMP_TEMPLATES_DIR"' RETURN
# Create shifted versions of templates
for template in "$SHELL_DIR/matugen/templates"/*.{css,conf,json,kdl,colors} \
"$USER_MATUGEN_DIR/templates"/*.{css,conf,json,kdl,colors,toml}; do
for template in "$SHELL_DIR/matugen/templates"/*.{css,conf,json,kdl,colors,ini,toml} \
"$USER_MATUGEN_DIR/templates"/*.{css,conf,json,kdl,colors,toml,ini}; do
[[ -f "$template" ]] || continue
template_name="$(basename "$template")"
shifted_template="$TMP_TEMPLATES_DIR/$template_name"
@@ -239,12 +249,30 @@ EOF
echo "" >> "$TMP_CONTENT_CFG"
fi
if command -v foot >/dev/null 2>&1; then
cat "$SHELL_DIR/matugen/configs/foot.toml" >> "$TMP_CONTENT_CFG"
sed -i "s|input_path = './matugen/templates/|input_path = '${CONTENT_TEMPLATES_PATH}|g" "$TMP_CONTENT_CFG"
echo "" >> "$TMP_CONTENT_CFG"
fi
if command -v alacritty >/dev/null 2>&1; then
cat "$SHELL_DIR/matugen/configs/alacritty.toml" >> "$TMP_CONTENT_CFG"
sed -i "s|input_path = './matugen/templates/|input_path = '${CONTENT_TEMPLATES_PATH}|g" "$TMP_CONTENT_CFG"
echo "" >> "$TMP_CONTENT_CFG"
fi
if command -v dgop >/dev/null 2>&1; then
cat "$SHELL_DIR/matugen/configs/dgop.toml" >> "$TMP_CONTENT_CFG"
sed -i "s|input_path = './matugen/templates/|input_path = '${CONTENT_TEMPLATES_PATH}|g" "$TMP_CONTENT_CFG"
echo "" >> "$TMP_CONTENT_CFG"
fi
if command -v code >/dev/null 2>&1; then
cat "$SHELL_DIR/matugen/configs/vscode.toml" >> "$TMP_CONTENT_CFG"
sed -i "s|input_path = './matugen/templates/|input_path = '${CONTENT_TEMPLATES_PATH}|g" "$TMP_CONTENT_CFG"
echo "" >> "$TMP_CONTENT_CFG"
fi
if [[ -s "$TMP_CONTENT_CFG" ]] && grep -q '\[templates\.' "$TMP_CONTENT_CFG"; then
case "$kind" in
image)
@@ -279,22 +307,30 @@ EOF
gsettings set org.gnome.desktop.interface gtk-theme "adw-gtk3-${mode}" >/dev/null 2>&1 || true
fi
if [ "$mode" = "light" ]; then
SECTION=$(echo "$JSON" | sed -n 's/.*"light":{\([^}]*\)}.*/\1/p')
if [[ "$MATUGEN_VERSION" == "2" ]]; then
PRIMARY=$(echo "$JSON" | sed -n "s/.*\"$mode\":{[^}]*\"primary_container\":\"\\(#[0-9a-fA-F]\\{6\\}\\)\".*/\\1/p")
HONOR=$(echo "$JSON" | sed -n "s/.*\"$mode\":{[^}]*\"primary\":\"\\(#[0-9a-fA-F]\\{6\\}\\)\".*/\\1/p")
SURFACE=$(echo "$JSON" | sed -n "s/.*\"$mode\":{[^}]*\"surface\":\"\\(#[0-9a-fA-F]\\{6\\}\\)\".*/\\1/p")
else
SECTION=$(echo "$JSON" | sed -n 's/.*"dark":{\([^}]*\)}.*/\1/p')
JSON_FLAT=$(echo "$JSON" | tr -d '\n')
PRIMARY=$(echo "$JSON_FLAT" | sed -n "s/.*\"primary_container\" *: *{ *[^}]*\"$mode\" *: *\"\\(#[0-9a-fA-F]\\{6\\}\\)\".*/\\1/p")
HONOR=$(echo "$JSON_FLAT" | sed -n "s/.*\"primary\" *: *{ *[^}]*\"$mode\" *: *\"\\(#[0-9a-fA-F]\\{6\\}\\)\".*/\\1/p")
SURFACE=$(echo "$JSON_FLAT" | sed -n "s/.*\"surface\" *: *{ *[^}]*\"$mode\" *: *\"\\(#[0-9a-fA-F]\\{6\\}\\)\".*/\\1/p")
fi
PRIMARY=$(echo "$SECTION" | sed -n 's/.*"primary_container":"\(#[0-9a-fA-F]\{6\}\)".*/\1/p')
HONOR=$(echo "$SECTION" | sed -n 's/.*"primary":"\(#[0-9a-fA-F]\{6\}\)".*/\1/p')
SURFACE=$(echo "$SECTION" | sed -n 's/.*"surface":"\(#[0-9a-fA-F]\{6\}\)".*/\1/p')
if [[ -z "$PRIMARY" ]]; then
echo "Error: Failed to extract PRIMARY color from matugen JSON (mode: $mode)" >&2
echo "This may indicate an incompatible matugen JSON format" >&2
set_system_color_scheme "$mode"
return 2
fi
if command -v ghostty >/dev/null 2>&1 && [[ -f "$CONFIG_DIR/ghostty/config-dankcolors" ]]; then
OUT=$("$SHELL_DIR/matugen/dank16.py" "$PRIMARY" $([[ "$mode" == "light" ]] && echo --light) ${HONOR:+--honor-primary "$HONOR"} ${SURFACE:+--background "$SURFACE"} 2>/dev/null || true)
OUT=$(dms dank16 "$PRIMARY" $([[ "$mode" == "light" ]] && echo --light) ${HONOR:+--honor-primary "$HONOR"} ${SURFACE:+--background "$SURFACE"} 2>/dev/null || true)
if [[ -n "${OUT:-}" ]]; then
TMP="$(mktemp)"
printf "%s\n\n" "$OUT" > "$TMP"
cat "$CONFIG_DIR/ghostty/config-dankcolors" >> "$TMP"
sed '/^palette = /d' "$CONFIG_DIR/ghostty/config-dankcolors" > "$TMP"
printf "\n%s\n" "$OUT" >> "$TMP"
mv "$TMP" "$CONFIG_DIR/ghostty/config-dankcolors"
if [[ -f "$CONFIG_DIR/ghostty/config" ]] && grep -q "^[^#]*config-dankcolors" "$CONFIG_DIR/ghostty/config" 2>/dev/null; then
pkill -USR2 -x 'ghostty|.ghostty-wrappe' >/dev/null 2>&1 || true
@@ -303,11 +339,11 @@ EOF
fi
if command -v kitty >/dev/null 2>&1 && [[ -f "$CONFIG_DIR/kitty/dank-theme.conf" ]]; then
OUT=$("$SHELL_DIR/matugen/dank16.py" "$PRIMARY" $([[ "$mode" == "light" ]] && echo --light) ${HONOR:+--honor-primary "$HONOR"} ${SURFACE:+--background "$SURFACE"} --kitty 2>/dev/null || true)
OUT=$(dms dank16 "$PRIMARY" $([[ "$mode" == "light" ]] && echo --light) ${HONOR:+--honor-primary "$HONOR"} ${SURFACE:+--background "$SURFACE"} --kitty 2>/dev/null || true)
if [[ -n "${OUT:-}" ]]; then
TMP="$(mktemp)"
printf "%s\n\n" "$OUT" > "$TMP"
cat "$CONFIG_DIR/kitty/dank-theme.conf" >> "$TMP"
sed '/^color[0-9]/d' "$CONFIG_DIR/kitty/dank-theme.conf" > "$TMP"
printf "\n%s\n" "$OUT" >> "$TMP"
mv "$TMP" "$CONFIG_DIR/kitty/dank-theme.conf"
if [[ -f "$CONFIG_DIR/kitty/kitty.conf" ]] && grep -q "^[^#]*dank-theme.conf" "$CONFIG_DIR/kitty/kitty.conf" 2>/dev/null; then
pkill -USR1 -x kitty >/dev/null 2>&1 || true
@@ -315,13 +351,68 @@ EOF
fi
fi
if command -v foot >/dev/null 2>&1; then
FOOT_CONFIG="$CONFIG_DIR/foot/dank-colors.ini"
if [[ ! -f "$FOOT_CONFIG" ]]; then
mkdir -p "$(dirname "$FOOT_CONFIG")"
echo "[colors]" > "$FOOT_CONFIG"
fi
OUT=$(dms dank16 "$PRIMARY" $([[ "$mode" == "light" ]] && echo --light) ${HONOR:+--honor-primary "$HONOR"} ${SURFACE:+--background "$SURFACE"} --foot 2>/dev/null || true)
if [[ -n "${OUT:-}" ]]; then
TMP="$(mktemp)"
echo "[colors]" > "$TMP"
sed '/^regular[0-9]/d;/^bright[0-9]/d;/^\[colors\]/d' "$FOOT_CONFIG" >> "$TMP"
printf "\n%s\n" "$OUT" >> "$TMP"
mv "$TMP" "$FOOT_CONFIG"
fi
fi
if command -v alacritty >/dev/null 2>&1; then
ALACRITTY_CONFIG="$CONFIG_DIR/alacritty/dank-theme.toml"
if [[ ! -f "$ALACRITTY_CONFIG" ]]; then
mkdir -p "$(dirname "$ALACRITTY_CONFIG")"
touch "$ALACRITTY_CONFIG"
fi
OUT=$(dms dank16 "$PRIMARY" $([[ "$mode" == "light" ]] && echo --light) ${HONOR:+--honor-primary "$HONOR"} ${SURFACE:+--background "$SURFACE"} --alacritty 2>/dev/null || true)
if [[ -n "${OUT:-}" ]]; then
TMP="$(mktemp)"
sed '/^\[colors\.normal\]/,/^$/d;/^\[colors\.bright\]/,/^$/d' "$ALACRITTY_CONFIG" > "$TMP"
printf "\n%s\n" "$OUT" >> "$TMP"
mv "$TMP" "$ALACRITTY_CONFIG"
fi
fi
if command -v code >/dev/null 2>&1; then
VSCODE_EXT_DIR="$HOME/.vscode/extensions/local.dynamic-base16-dankshell-0.0.1"
VSCODE_THEME_DIR="$VSCODE_EXT_DIR/themes"
VSCODE_BASE_THEME="$VSCODE_THEME_DIR/dankshell-color-theme-base.json"
VSCODE_FINAL_THEME="$VSCODE_THEME_DIR/dankshell-color-theme.json"
mkdir -p "$VSCODE_THEME_DIR"
cp "$SHELL_DIR/matugen/templates/vscode-package.json" "$VSCODE_EXT_DIR/package.json"
cp "$SHELL_DIR/matugen/templates/vscode-vsixmanifest.xml" "$VSCODE_EXT_DIR/.vsixmanifest"
for variant in default dark light; do
VSCODE_BASE="$VSCODE_THEME_DIR/dankshell-${variant}-base.json"
VSCODE_FINAL="$VSCODE_THEME_DIR/dankshell-${variant}.json"
if [[ -f "$VSCODE_BASE" ]]; then
VARIANT_LIGHT=""
[[ "$variant" == "light" ]] && VARIANT_LIGHT="--light"
dms dank16 "$PRIMARY" $VARIANT_LIGHT ${HONOR:+--honor-primary "$HONOR"} ${SURFACE:+--background "$SURFACE"} --vscode-enrich "$VSCODE_BASE" > "$VSCODE_FINAL" 2>/dev/null || cp "$VSCODE_BASE" "$VSCODE_FINAL"
fi
done
fi
set_system_color_scheme "$mode"
}
if command -v pywalfox >/dev/null 2>&1 && [[ -f "$HOME/.cache/wal/colors.json" ]]; then
pywalfox update >/dev/null 2>&1 || true
fi
while :; do
DESIRED="$(read_desired)"
WANT_KEY="$(key_of "$DESIRED")"

View File

@@ -38,7 +38,7 @@
{
"term": "24-hour format",
"context": "24-hour format",
"reference": "Modules/Settings/PersonalizationTab.qml:963",
"reference": "Modules/Settings/PersonalizationTab.qml:1334",
"comment": ""
},
{
@@ -128,7 +128,7 @@
{
"term": "All displays",
"context": "All displays",
"reference": "Modules/Settings/DisplaysTab.qml:680",
"reference": "Modules/Settings/DisplaysTab.qml:704",
"comment": ""
},
{
@@ -152,7 +152,7 @@
{
"term": "Animation Speed",
"context": "Animation Speed",
"reference": "Modules/Settings/PersonalizationTab.qml:1185",
"reference": "Modules/Settings/PersonalizationTab.qml:1556",
"comment": ""
},
{
@@ -341,16 +341,28 @@
"reference": "Modules/Notepad/NotepadTextEditor.qml:581",
"comment": ""
},
{
"term": "Autoconnect disabled",
"context": "Autoconnect disabled",
"reference": "Services/DMSNetworkService.qml:885",
"comment": ""
},
{
"term": "Autoconnect enabled",
"context": "Autoconnect enabled",
"reference": "Services/DMSNetworkService.qml:885",
"comment": ""
},
{
"term": "Automatic Control",
"context": "Automatic Control",
"reference": "Modules/Settings/DisplaysTab.qml:175",
"reference": "Modules/Settings/DisplaysTab.qml:199",
"comment": ""
},
{
"term": "Automatic Cycling",
"context": "Automatic Cycling",
"reference": "Modules/Settings/PersonalizationTab.qml:716",
"reference": "Modules/Settings/PersonalizationTab.qml:1087",
"comment": ""
},
{
@@ -362,13 +374,13 @@
{
"term": "Automatically cycle through wallpapers in the same folder",
"context": "Automatically cycle through wallpapers in the same folder",
"reference": "Modules/Settings/PersonalizationTab.qml:723",
"reference": "Modules/Settings/PersonalizationTab.qml:1094",
"comment": ""
},
{
"term": "Automatically detect location based on IP address",
"context": "Automatically detect location based on IP address",
"reference": "Modules/Settings/DisplaysTab.qml:380",
"reference": "Modules/Settings/DisplaysTab.qml:404",
"comment": ""
},
{
@@ -380,7 +392,7 @@
{
"term": "Automatically extract colors from wallpaper",
"context": "Automatically extract colors from wallpaper",
"reference": "Modules/Settings/PersonalizationTab.qml:1389",
"reference": "Modules/Settings/PersonalizationTab.qml:1760",
"comment": ""
},
{
@@ -416,7 +428,7 @@
{
"term": "Available Screens (",
"context": "Available Screens (",
"reference": "Modules/Settings/DisplaysTab.qml:524",
"reference": "Modules/Settings/DisplaysTab.qml:548",
"comment": ""
},
{
@@ -428,7 +440,7 @@
{
"term": "Balanced palette with focused accents (default).",
"context": "Balanced palette with focused accents (default).",
"reference": "Common/Theme.qml:215",
"reference": "Common/Theme.qml:202",
"comment": ""
},
{
@@ -470,19 +482,19 @@
{
"term": "Blur Layer",
"context": "Blur Layer",
"reference": "Modules/Settings/PersonalizationTab.qml:1072",
"reference": "Modules/Settings/PersonalizationTab.qml:1443",
"comment": ""
},
{
"term": "Blur on Overview",
"context": "Blur on Overview",
"reference": "Modules/Settings/PersonalizationTab.qml:483",
"reference": "Modules/Settings/PersonalizationTab.qml:912",
"comment": ""
},
{
"term": "Blur wallpaper when niri overview is open",
"context": "Blur wallpaper when niri overview is open",
"reference": "Modules/Settings/PersonalizationTab.qml:490",
"reference": "Modules/Settings/PersonalizationTab.qml:919",
"comment": ""
},
{
@@ -689,6 +701,12 @@
"reference": "Modules/Settings/DankBarTab.qml:181",
"comment": ""
},
{
"term": "Color temperature for day time",
"context": "Color temperature for day time",
"reference": "Modules/Settings/DisplaysTab.qml:177",
"comment": ""
},
{
"term": "Color temperature for night mode",
"context": "Color temperature for night mode",
@@ -698,7 +716,7 @@
{
"term": "Colorful mix of bright contrasting accents.",
"context": "Colorful mix of bright contrasting accents.",
"reference": "Common/Theme.qml:239",
"reference": "Common/Theme.qml:226",
"comment": ""
},
{
@@ -770,7 +788,7 @@
{
"term": "Configure which displays show shell components",
"context": "Configure which displays show shell components",
"reference": "Modules/Settings/DisplaysTab.qml:508",
"reference": "Modules/Settings/DisplaysTab.qml:532",
"comment": ""
},
{
@@ -806,7 +824,7 @@
{
"term": "Connected Displays",
"context": "Connected Displays",
"reference": "Modules/Settings/DisplaysTab.qml:501",
"reference": "Modules/Settings/DisplaysTab.qml:525",
"comment": ""
},
{
@@ -938,7 +956,7 @@
{
"term": "DEMO MODE - Click anywhere to exit",
"context": "DEMO MODE - Click anywhere to exit",
"reference": "Modules/Lock/LockScreenContent.qml:749",
"reference": "Modules/Lock/LockScreenContent.qml:747",
"comment": ""
},
{
@@ -950,7 +968,7 @@
{
"term": "DMS out of date",
"context": "DMS out of date",
"reference": "Services/DMSService.qml:230",
"reference": "Services/DMSService.qml:232",
"comment": ""
},
{
@@ -962,7 +980,7 @@
{
"term": "Daily at:",
"context": "Daily at:",
"reference": "Modules/Settings/PersonalizationTab.qml:888",
"reference": "Modules/Settings/PersonalizationTab.qml:1259",
"comment": ""
},
{
@@ -1001,12 +1019,24 @@
"reference": "Modals/Spotlight/FileSearchResults.qml:225",
"comment": ""
},
{
"term": "Dark Mode",
"context": "Dark Mode",
"reference": "Modules/Settings/PersonalizationTab.qml:699",
"comment": ""
},
{
"term": "Date Format",
"context": "Date Format",
"reference": "Modules/Settings/TimeWeatherTab.qml:179",
"comment": ""
},
{
"term": "Day Temperature",
"context": "Day Temperature",
"reference": "Modules/Settings/DisplaysTab.qml:176",
"comment": ""
},
{
"term": "Default",
"context": "Default",
@@ -1028,7 +1058,7 @@
{
"term": "Derives colors that closely match the underlying image.",
"context": "Derives colors that closely match the underlying image.",
"reference": "Common/Theme.qml:227",
"reference": "Common/Theme.qml:214",
"comment": ""
},
{
@@ -1055,6 +1085,12 @@
"reference": "Modules/ControlCenter/Details/BluetoothDetail.qml:42",
"comment": ""
},
{
"term": "Disable Autoconnect",
"context": "Disable Autoconnect",
"reference": "Modules/ControlCenter/Details/NetworkDetail.qml:623",
"comment": ""
},
{
"term": "Disconnect",
"context": "Disconnect",
@@ -1130,7 +1166,7 @@
{
"term": "Diverse palette spanning the full spectrum.",
"context": "Diverse palette spanning the full spectrum.",
"reference": "Common/Theme.qml:251",
"reference": "Common/Theme.qml:238",
"comment": ""
},
{
@@ -1178,13 +1214,13 @@
{
"term": "Duration",
"context": "Duration",
"reference": "Modules/Settings/PersonalizationTab.qml:1238",
"reference": "Modules/Settings/PersonalizationTab.qml:1609",
"comment": ""
},
{
"term": "Dynamic Theming",
"context": "Dynamic Theming",
"reference": "Modules/Settings/PersonalizationTab.qml:1382",
"reference": "Modules/Settings/PersonalizationTab.qml:1753",
"comment": ""
},
{
@@ -1205,6 +1241,12 @@
"reference": "Modules/Notepad/NotepadTextEditor.qml:565",
"comment": ""
},
{
"term": "Enable Autoconnect",
"context": "Enable Autoconnect",
"reference": "Modules/ControlCenter/Details/NetworkDetail.qml:623",
"comment": ""
},
{
"term": "Enable GPU Temperature",
"context": "Enable GPU Temperature",
@@ -1214,7 +1256,7 @@
{
"term": "Enable System Sounds",
"context": "Enable System Sounds",
"reference": "Modules/Settings/PersonalizationTab.qml:1538",
"reference": "Modules/Settings/PersonalizationTab.qml:1909",
"comment": ""
},
{
@@ -1232,7 +1274,7 @@
{
"term": "Enable compositor-targetable blur layer (namespace: dms:blurwallpaper). Requires manual niri configuration.",
"context": "Enable compositor-targetable blur layer (namespace: dms:blurwallpaper). Requires manual niri configuration.",
"reference": "Modules/Settings/PersonalizationTab.qml:1079",
"reference": "Modules/Settings/PersonalizationTab.qml:1450",
"comment": ""
},
{
@@ -1250,7 +1292,7 @@
{
"term": "End",
"context": "End",
"reference": "Modules/Settings/DisplaysTab.qml:329",
"reference": "Modules/Settings/DisplaysTab.qml:353",
"comment": ""
},
{
@@ -1322,7 +1364,7 @@
{
"term": "Execute templates from ~/.config/matugen/config.toml",
"context": "Execute templates from ~/.config/matugen/config.toml",
"reference": "Modules/Settings/PersonalizationTab.qml:1475",
"reference": "Modules/Settings/PersonalizationTab.qml:1846",
"comment": ""
},
{
@@ -1397,6 +1439,12 @@
"reference": "Services/DMSNetworkService.qml:437",
"comment": ""
},
{
"term": "Failed to update autoconnect",
"context": "Failed to update autoconnect",
"reference": "Services/DMSNetworkService.qml:883",
"comment": ""
},
{
"term": "Feels Like",
"context": "Feels Like",
@@ -1478,7 +1526,7 @@
{
"term": "Forget Network",
"context": "Forget Network",
"reference": "Modules/ControlCenter/Details/NetworkDetail.qml:610",
"reference": "Modules/ControlCenter/Details/NetworkDetail.qml:646",
"comment": ""
},
{
@@ -1610,25 +1658,25 @@
{
"term": "High-contrast palette for strong visual distinction.",
"context": "High-contrast palette for strong visual distinction.",
"reference": "Common/Theme.qml:223",
"reference": "Common/Theme.qml:210",
"comment": ""
},
{
"term": "High-fidelity palette that preserves source hues.",
"context": "High-fidelity palette that preserves source hues.",
"reference": "Common/Theme.qml:235",
"reference": "Common/Theme.qml:222",
"comment": ""
},
{
"term": "Hour",
"context": "Hour",
"reference": "Modules/Settings/DisplaysTab.qml:266",
"reference": "Modules/Settings/DisplaysTab.qml:290",
"comment": ""
},
{
"term": "How often to change wallpaper",
"context": "How often to change wallpaper",
"reference": "Modules/Settings/PersonalizationTab.qml:834",
"reference": "Modules/Settings/PersonalizationTab.qml:1205",
"comment": ""
},
{
@@ -1682,7 +1730,7 @@
{
"term": "Include Transitions",
"context": "Include Transitions",
"reference": "Modules/Settings/PersonalizationTab.qml:1000",
"reference": "Modules/Settings/PersonalizationTab.qml:1371",
"comment": ""
},
{
@@ -1724,7 +1772,7 @@
{
"term": "Interval",
"context": "Interval",
"reference": "Modules/Settings/PersonalizationTab.qml:833",
"reference": "Modules/Settings/PersonalizationTab.qml:1204",
"comment": ""
},
{
@@ -1778,13 +1826,13 @@
{
"term": "Latitude",
"context": "Latitude",
"reference": "Modules/Settings/DisplaysTab.qml:413, Modules/Settings/TimeWeatherTab.qml:665",
"reference": "Modules/Settings/DisplaysTab.qml:437, Modules/Settings/TimeWeatherTab.qml:665",
"comment": ""
},
{
"term": "Launch",
"context": "Launch",
"reference": "Modules/AppDrawer/AppDrawerPopout.qml:923, Modals/Spotlight/SpotlightContextMenu.qml:251",
"reference": "Modules/AppDrawer/AppDrawerPopout.qml:744, Modals/Spotlight/SpotlightContextMenu.qml:251",
"comment": ""
},
{
@@ -1796,7 +1844,7 @@
{
"term": "Launch on dGPU",
"context": "Launch on dGPU",
"reference": "Modules/AppDrawer/AppDrawerPopout.qml:983, Modules/Dock/DockContextMenu.qml:417, Modals/Spotlight/SpotlightContextMenu.qml:312",
"reference": "Modules/AppDrawer/AppDrawerPopout.qml:804, Modules/Dock/DockContextMenu.qml:417, Modals/Spotlight/SpotlightContextMenu.qml:312",
"comment": ""
},
{
@@ -1826,7 +1874,7 @@
{
"term": "Light Mode",
"context": "Light Mode",
"reference": "Modules/Settings/PersonalizationTab.qml:1129",
"reference": "Modules/Settings/PersonalizationTab.qml:510, Modules/Settings/PersonalizationTab.qml:1500",
"comment": ""
},
{
@@ -1838,7 +1886,7 @@
{
"term": "Lively palette with saturated accents.",
"context": "Lively palette with saturated accents.",
"reference": "Common/Theme.qml:219",
"reference": "Common/Theme.qml:206",
"comment": ""
},
{
@@ -1886,7 +1934,7 @@
{
"term": "Longitude",
"context": "Longitude",
"reference": "Modules/Settings/DisplaysTab.qml:436, Modules/Settings/TimeWeatherTab.qml:716",
"reference": "Modules/Settings/DisplaysTab.qml:460, Modules/Settings/TimeWeatherTab.qml:716",
"comment": ""
},
{
@@ -1904,7 +1952,7 @@
{
"term": "Manual Coordinates",
"context": "Manual Coordinates",
"reference": "Modules/Settings/DisplaysTab.qml:401",
"reference": "Modules/Settings/DisplaysTab.qml:425",
"comment": ""
},
{
@@ -1928,19 +1976,19 @@
{
"term": "Matugen Palette",
"context": "Matugen Palette",
"reference": "Modules/Settings/PersonalizationTab.qml:1414, Modules/Settings/ThemeColorsTab.qml:629",
"reference": "Modules/Settings/PersonalizationTab.qml:1785, Modules/Settings/ThemeColorsTab.qml:629",
"comment": ""
},
{
"term": "Matugen Settings",
"context": "Matugen Settings",
"reference": "Modules/Settings/PersonalizationTab.qml:1357",
"reference": "Modules/Settings/PersonalizationTab.qml:1728",
"comment": ""
},
{
"term": "Matugen Target Monitor",
"context": "Matugen Target Monitor",
"reference": "Modules/Settings/PersonalizationTab.qml:657",
"reference": "Modules/Settings/PersonalizationTab.qml:1028",
"comment": ""
},
{
@@ -1994,31 +2042,31 @@
{
"term": "Minimal palette built around a single hue.",
"context": "Minimal palette built around a single hue.",
"reference": "Common/Theme.qml:243",
"reference": "Common/Theme.qml:230",
"comment": ""
},
{
"term": "Minute",
"context": "Minute",
"reference": "Modules/Settings/DisplaysTab.qml:274",
"reference": "Modules/Settings/DisplaysTab.qml:298",
"comment": ""
},
{
"term": "Mode:",
"context": "Mode:",
"reference": "Modules/Settings/PersonalizationTab.qml:765",
"reference": "Modules/Settings/PersonalizationTab.qml:1136",
"comment": ""
},
{
"term": "Monitor Selection:",
"context": "Monitor Selection:",
"reference": "Modules/Settings/PersonalizationTab.qml:629",
"reference": "Modules/Settings/PersonalizationTab.qml:1000",
"comment": ""
},
{
"term": "Monitor whose wallpaper drives dynamic theming colors",
"context": "Monitor whose wallpaper drives dynamic theming colors",
"reference": "Modules/Settings/PersonalizationTab.qml:658",
"reference": "Modules/Settings/PersonalizationTab.qml:1029",
"comment": ""
},
{
@@ -2036,7 +2084,7 @@
{
"term": "Muted palette with subdued, calming tones.",
"context": "Muted palette with subdued, calming tones.",
"reference": "Common/Theme.qml:247",
"reference": "Common/Theme.qml:234",
"comment": ""
},
{
@@ -2072,7 +2120,7 @@
{
"term": "Network Info",
"context": "Network Info",
"reference": "Modules/ControlCenter/Details/NetworkDetail.qml:344, Modules/ControlCenter/Details/NetworkDetail.qml:587",
"reference": "Modules/ControlCenter/Details/NetworkDetail.qml:344, Modules/ControlCenter/Details/NetworkDetail.qml:600",
"comment": ""
},
{
@@ -2108,7 +2156,7 @@
{
"term": "New Notification",
"context": "New Notification",
"reference": "Modules/Settings/PersonalizationTab.qml:1652",
"reference": "Modules/Settings/PersonalizationTab.qml:2023",
"comment": ""
},
{
@@ -2123,6 +2171,12 @@
"reference": "Modules/Settings/DisplaysTab.qml:129",
"comment": ""
},
{
"term": "Night Temperature",
"context": "Night Temperature",
"reference": "Modules/Settings/DisplaysTab.qml:155",
"comment": ""
},
{
"term": "No Active Players",
"context": "No Active Players",
@@ -2294,7 +2348,7 @@
{
"term": "Only adjust gamma based on time or location rules.",
"context": "Only adjust gamma based on time or location rules.",
"reference": "Modules/Settings/DisplaysTab.qml:176",
"reference": "Modules/Settings/DisplaysTab.qml:200",
"comment": ""
},
{
@@ -2372,13 +2426,13 @@
{
"term": "Per-Mode Wallpapers",
"context": "Per-Mode Wallpapers",
"reference": "Modules/Settings/PersonalizationTab.qml:540",
"reference": "Modules/Settings/PersonalizationTab.qml:470",
"comment": ""
},
{
"term": "Per-Monitor Wallpapers",
"context": "Per-Monitor Wallpapers",
"reference": "Modules/Settings/PersonalizationTab.qml:597",
"reference": "Modules/Settings/PersonalizationTab.qml:968",
"comment": ""
},
{
@@ -2408,7 +2462,7 @@
{
"term": "Pin to Dock",
"context": "Pin to Dock",
"reference": "Modules/AppDrawer/AppDrawerPopout.qml:786, Modules/Dock/DockContextMenu.qml:370, Modals/Spotlight/SpotlightContextMenu.qml:110, Modals/Spotlight/SpotlightContextMenu.qml:113",
"reference": "Modules/AppDrawer/AppDrawerPopout.qml:607, Modules/Dock/DockContextMenu.qml:370, Modals/Spotlight/SpotlightContextMenu.qml:110, Modals/Spotlight/SpotlightContextMenu.qml:113",
"comment": ""
},
{
@@ -2426,31 +2480,31 @@
{
"term": "Play sound when new notification arrives",
"context": "Play sound when new notification arrives",
"reference": "Modules/Settings/PersonalizationTab.qml:1658",
"reference": "Modules/Settings/PersonalizationTab.qml:2029",
"comment": ""
},
{
"term": "Play sound when power cable is connected",
"context": "Play sound when power cable is connected",
"reference": "Modules/Settings/PersonalizationTab.qml:1727",
"reference": "Modules/Settings/PersonalizationTab.qml:2098",
"comment": ""
},
{
"term": "Play sound when volume is adjusted",
"context": "Play sound when volume is adjusted",
"reference": "Modules/Settings/PersonalizationTab.qml:1692",
"reference": "Modules/Settings/PersonalizationTab.qml:2063",
"comment": ""
},
{
"term": "Play sounds for system events",
"context": "Play sounds for system events",
"reference": "Modules/Settings/PersonalizationTab.qml:1545",
"reference": "Modules/Settings/PersonalizationTab.qml:1916",
"comment": ""
},
{
"term": "Plugged In",
"context": "Plugged In",
"reference": "Modules/Settings/PersonalizationTab.qml:1721",
"reference": "Modules/Settings/PersonalizationTab.qml:2092",
"comment": ""
},
{
@@ -2672,7 +2726,7 @@
{
"term": "Run User Templates",
"context": "Run User Templates",
"reference": "Modules/Settings/PersonalizationTab.qml:1468",
"reference": "Modules/Settings/PersonalizationTab.qml:1839",
"comment": ""
},
{
@@ -2786,7 +2840,7 @@
{
"term": "Select a preset or drag the slider to customize",
"context": "Select a preset or drag the slider to customize",
"reference": "Modules/Settings/PersonalizationTab.qml:1319",
"reference": "Modules/Settings/PersonalizationTab.qml:1690",
"comment": ""
},
{
@@ -2810,7 +2864,7 @@
{
"term": "Select monitor to configure wallpaper",
"context": "Select monitor to configure wallpaper",
"reference": "Modules/Settings/PersonalizationTab.qml:639",
"reference": "Modules/Settings/PersonalizationTab.qml:1010",
"comment": ""
},
{
@@ -2828,19 +2882,19 @@
{
"term": "Select system sound theme",
"context": "Select system sound theme",
"reference": "Modules/Settings/PersonalizationTab.qml:1616",
"reference": "Modules/Settings/PersonalizationTab.qml:1987",
"comment": ""
},
{
"term": "Select the palette algorithm used for wallpaper-based colors",
"context": "Select the palette algorithm used for wallpaper-based colors",
"reference": "Modules/Settings/PersonalizationTab.qml:1415, Modules/Settings/ThemeColorsTab.qml:630",
"reference": "Modules/Settings/PersonalizationTab.qml:1786, Modules/Settings/ThemeColorsTab.qml:630",
"comment": ""
},
{
"term": "Select which transitions to include in randomization",
"context": "Select which transitions to include in randomization",
"reference": "Modules/Settings/PersonalizationTab.qml:1007",
"reference": "Modules/Settings/PersonalizationTab.qml:1378",
"comment": ""
},
{
@@ -2858,13 +2912,13 @@
{
"term": "Set different wallpapers for each connected monitor",
"context": "Set different wallpapers for each connected monitor",
"reference": "Modules/Settings/PersonalizationTab.qml:604",
"reference": "Modules/Settings/PersonalizationTab.qml:975",
"comment": ""
},
{
"term": "Set different wallpapers for light and dark mode",
"context": "Set different wallpapers for light and dark mode",
"reference": "Modules/Settings/PersonalizationTab.qml:547",
"reference": "Modules/Settings/PersonalizationTab.qml:477",
"comment": ""
},
{
@@ -2924,7 +2978,7 @@
{
"term": "Show on Last Display",
"context": "Show on Last Display",
"reference": "Modules/Settings/DisplaysTab.qml:697",
"reference": "Modules/Settings/DisplaysTab.qml:721",
"comment": ""
},
{
@@ -2936,13 +2990,13 @@
{
"term": "Show on all connected displays",
"context": "Show on all connected displays",
"reference": "Modules/Settings/DisplaysTab.qml:681",
"reference": "Modules/Settings/DisplaysTab.qml:705",
"comment": ""
},
{
"term": "Show on screens:",
"context": "Show on screens:",
"reference": "Modules/Settings/DisplaysTab.qml:666",
"reference": "Modules/Settings/DisplaysTab.qml:690",
"comment": ""
},
{
@@ -3026,7 +3080,7 @@
{
"term": "Sound Theme",
"context": "Sound Theme",
"reference": "Modules/Settings/PersonalizationTab.qml:1615",
"reference": "Modules/Settings/PersonalizationTab.qml:1986",
"comment": ""
},
{
@@ -3050,7 +3104,7 @@
{
"term": "Start",
"context": "Start",
"reference": "Modules/Settings/DisplaysTab.qml:286",
"reference": "Modules/Settings/DisplaysTab.qml:310",
"comment": ""
},
{
@@ -3104,7 +3158,7 @@
{
"term": "Switch User",
"context": "Switch User",
"reference": "Modules/Greetd/GreeterContent.qml:645",
"reference": "Modules/Greetd/GreeterContent.qml:641",
"comment": ""
},
{
@@ -3209,12 +3263,6 @@
"reference": "Modals/FileBrowser/KeyboardHints.qml:26",
"comment": ""
},
{
"term": "Temperature",
"context": "Temperature",
"reference": "Modules/Settings/DisplaysTab.qml:155",
"comment": ""
},
{
"term": "Terminal custom additional parameters",
"context": "Terminal custom additional parameters",
@@ -3290,7 +3338,7 @@
{
"term": "To update, run the following command:",
"context": "To update, run the following command:",
"reference": "Services/DMSService.qml:231",
"reference": "Services/DMSService.qml:232",
"comment": ""
},
{
@@ -3338,7 +3386,7 @@
{
"term": "Transition Effect",
"context": "Transition Effect",
"reference": "Modules/Settings/PersonalizationTab.qml:980",
"reference": "Modules/Settings/PersonalizationTab.qml:1351",
"comment": ""
},
{
@@ -3356,7 +3404,7 @@
{
"term": "Unpin from Dock",
"context": "Unpin from Dock",
"reference": "Modules/AppDrawer/AppDrawerPopout.qml:786, Modules/Dock/DockContextMenu.qml:370, Modals/Spotlight/SpotlightContextMenu.qml:113",
"reference": "Modules/AppDrawer/AppDrawerPopout.qml:607, Modules/Dock/DockContextMenu.qml:370, Modals/Spotlight/SpotlightContextMenu.qml:113",
"comment": ""
},
{
@@ -3380,7 +3428,7 @@
{
"term": "Untitled",
"context": "Untitled",
"reference": "Services/NotepadStorageService.qml:73, Services/NotepadStorageService.qml:143, Services/NotepadStorageService.qml:184",
"reference": "Services/NotepadStorageService.qml:80, Services/NotepadStorageService.qml:161, Services/NotepadStorageService.qml:202",
"comment": ""
},
{
@@ -3422,7 +3470,7 @@
{
"term": "Use IP Location",
"context": "Use IP Location",
"reference": "Modules/Settings/DisplaysTab.qml:379",
"reference": "Modules/Settings/DisplaysTab.qml:403",
"comment": ""
},
{
@@ -3434,7 +3482,7 @@
{
"term": "Use System Theme",
"context": "Use System Theme",
"reference": "Modules/Settings/PersonalizationTab.qml:1587",
"reference": "Modules/Settings/PersonalizationTab.qml:1958",
"comment": ""
},
{
@@ -3458,13 +3506,13 @@
{
"term": "Use light theme instead of dark theme",
"context": "Use light theme instead of dark theme",
"reference": "Modules/Settings/PersonalizationTab.qml:1136",
"reference": "Modules/Settings/PersonalizationTab.qml:1507",
"comment": ""
},
{
"term": "Use sound theme from system settings",
"context": "Use sound theme from system settings",
"reference": "Modules/Settings/PersonalizationTab.qml:1593",
"reference": "Modules/Settings/PersonalizationTab.qml:1964",
"comment": ""
},
{
@@ -3488,7 +3536,7 @@
{
"term": "Uses sunrise/sunset times to automatically adjust night mode based on your location.",
"context": "Uses sunrise/sunset times to automatically adjust night mode based on your location.",
"reference": "Modules/Settings/DisplaysTab.qml:457",
"reference": "Modules/Settings/DisplaysTab.qml:481",
"comment": ""
},
{
@@ -3518,7 +3566,7 @@
{
"term": "Vibrant palette with playful saturation.",
"context": "Vibrant palette with playful saturation.",
"reference": "Common/Theme.qml:231",
"reference": "Common/Theme.qml:218",
"comment": ""
},
{
@@ -3536,13 +3584,13 @@
{
"term": "Visual effect used when wallpaper changes",
"context": "Visual effect used when wallpaper changes",
"reference": "Modules/Settings/PersonalizationTab.qml:981",
"reference": "Modules/Settings/PersonalizationTab.qml:1352",
"comment": ""
},
{
"term": "Volume Changed",
"context": "Volume Changed",
"reference": "Modules/Settings/PersonalizationTab.qml:1686",
"reference": "Modules/Settings/PersonalizationTab.qml:2057",
"comment": ""
},
{
@@ -3560,7 +3608,7 @@
{
"term": "Wallpaper Monitor",
"context": "Wallpaper Monitor",
"reference": "Modules/Settings/PersonalizationTab.qml:638",
"reference": "Modules/Settings/PersonalizationTab.qml:1009",
"comment": ""
},
{
@@ -3710,7 +3758,7 @@
{
"term": "matugen not detected - dynamic theming unavailable",
"context": "matugen not detected - dynamic theming unavailable",
"reference": "Modules/Settings/PersonalizationTab.qml:1495",
"reference": "Modules/Settings/PersonalizationTab.qml:1866",
"comment": ""
},
{

View File

@@ -138,13 +138,13 @@
"Audio Output Devices (": "Dispositivi Uscita Audio ("
},
"Authenticate": {
"Authenticate": ""
"Authenticate": "Autenticare"
},
"Authentication Required": {
"Authentication Required": ""
"Authentication Required": "Autenticazione Richiesta"
},
"Authentication failed, please try again": {
"Authentication failed, please try again": ""
"Authentication failed, please try again": "Autenticazione fallita, per favore prova ancora"
},
"Authorize": {
"Authorize": "Autorizza"
@@ -173,6 +173,12 @@
"Auto-saving...": {
"Auto-saving...": "Salvataggio automatico..."
},
"Autoconnect disabled": {
"Autoconnect disabled": ""
},
"Autoconnect enabled": {
"Autoconnect enabled": ""
},
"Automatic Control": {
"Automatic Control": "Controllo Automatico"
},
@@ -183,13 +189,13 @@
"Automatically calculate popup distance from bar edge.": "Calcola automaticamente la distanza del popup dall'angolo della barra"
},
"Automatically cycle through wallpapers in the same folder": {
"Automatically cycle through wallpapers in the same folder": "Scorrere automaticamente gli sfondi nella stessa cartella"
"Automatically cycle through wallpapers in the same folder": "Scorre automaticamente gli sfondi nella stessa cartella"
},
"Automatically detect location based on IP address": {
"Automatically detect location based on IP address": "Rileva automaticamente la posizione in base all'indirizzo IP"
},
"Automatically determine your location using your IP address": {
"Automatically determine your location using your IP address": "posizioneDetermina automaticamente la tua località usando l'indirizzo IP"
"Automatically determine your location using your IP address": "Determina automaticamente la tua posizione usando l'indirizzo IP"
},
"Automatically extract colors from wallpaper": {
"Automatically extract colors from wallpaper": "Estrai automaticamente i colori dallo sfondo"
@@ -347,6 +353,9 @@
"Color Picker": {
"Color Picker": "Prelievo Colore"
},
"Color temperature for day time": {
"Color temperature for day time": "Temperatura colore per il giorno"
},
"Color temperature for night mode": {
"Color temperature for night mode": "Temperatura colore per la modalità notturna"
},
@@ -378,7 +387,7 @@
"Compact Mode": "Modo Compatto"
},
"Compositor": {
"Compositor": ""
"Compositor": "Compositor\n"
},
"Compositor:": {
"Compositor:": "Compositor:"
@@ -492,7 +501,7 @@
"Daily at:": "Giornalmente alle:"
},
"Dank": {
"Dank": ""
"Dank": "Dank"
},
"Dank Bar": {
"Dank Bar": "Dank Bar"
@@ -510,11 +519,17 @@
"DankBar Font Scale": "Scala Font DankBar"
},
"DankSearch not available": {
"DankSearch not available": ""
"DankSearch not available": "DankSearch non disponibile"
},
"Dark Mode": {
"Dark Mode": ""
},
"Date Format": {
"Date Format": "Formato Data"
},
"Day Temperature": {
"Day Temperature": "Temperatura Giorno"
},
"Default": {
"Default": "Predefinito"
},
@@ -522,7 +537,7 @@
"Defaults": "Predefiniti"
},
"Del: Clear • Shift+Del: Clear All • 1-9: Actions • F10: Help • Esc: Close": {
"Del: Clear • Shift+Del: Clear All • 1-9: Actions • F10: Help • Esc: Close": "Del: Pulisce • Shift+Del: Pulisce Tutto • 1-9: Azioni • F10: Help • Esc: Chiude"
"Del: Clear • Shift+Del: Clear All • 1-9: Actions • F10: Help • Esc: Close": "Del: Elimina • Shift+Del: Elimina Tutto • 1-9: Azioni • F10: Help • Esc: Chiude"
},
"Derives colors that closely match the underlying image.": {
"Derives colors that closely match the underlying image.": "Deriva colori che si avvicinano all'immagine sottostante"
@@ -539,6 +554,9 @@
"Device paired": {
"Device paired": "Dispositivo accoppiato"
},
"Disable Autoconnect": {
"Disable Autoconnect": ""
},
"Disconnect": {
"Disconnect": "Disconnetti"
},
@@ -614,6 +632,9 @@
"Empty": {
"Empty": "Vuoto"
},
"Enable Autoconnect": {
"Enable Autoconnect": ""
},
"Enable GPU Temperature": {
"Enable GPU Temperature": "Abilita Temperatura GPU"
},
@@ -648,7 +669,7 @@
"Enter PIN for ": "Inserisci PIN per "
},
"Enter a search query": {
"Enter a search query": ""
"Enter a search query": "Inserisci una query di ricerca"
},
"Enter credentials for ": {
"Enter credentials for ": "Inserisci credenziali per "
@@ -710,8 +731,11 @@
"Failed to start connection to ": {
"Failed to start connection to ": "Impossibile avviare connessione a "
},
"Failed to update autoconnect": {
"Failed to update autoconnect": ""
},
"Feels Like": {
"Feels Like": "Sembra"
"Feels Like": "Temperatura"
},
"File Already Exists": {
"File Already Exists": "File già esistente"
@@ -789,7 +813,7 @@
"Github:": "Github:"
},
"Good": {
"Good": "Buono"
"Good": "Buona"
},
"Goth Corners": {
"Goth Corners": "Angoli Gotici"
@@ -990,7 +1014,7 @@
"Matugen Settings": "Impostazioni Matugen"
},
"Matugen Target Monitor": {
"Matugen Target Monitor": ""
"Matugen Target Monitor": "Monitor di destinazione Matugen"
},
"Max apps to show": {
"Max apps to show": "Applicazioni massime da mostrare"
@@ -1032,7 +1056,7 @@
"Monitor Selection:": "Selezione Monitor:"
},
"Monitor whose wallpaper drives dynamic theming colors": {
"Monitor whose wallpaper drives dynamic theming colors": ""
"Monitor whose wallpaper drives dynamic theming colors": "Monitor con lo sfondo che genera il tema di colori dinamico"
},
"Monospace Font": {
"Monospace Font": "Font Monospace"
@@ -1085,6 +1109,9 @@
"Night Mode": {
"Night Mode": "Modalità Notte"
},
"Night Temperature": {
"Night Temperature": "Temperatura Notte"
},
"No Active Players": {
"No Active Players": "Nessun Riproduttore Attivo"
},
@@ -1107,7 +1134,7 @@
"No clipboard entries found": "Nessun appunto trovato"
},
"No files found": {
"No files found": ""
"No files found": "Nessun file trovato"
},
"No items added yet": {
"No items added yet": "Nessun elemento aggiunto ancora"
@@ -1398,10 +1425,10 @@
"Scroll through windows, rather than workspaces": "Scorri tra le finestre, piuttosto che i workspaces"
},
"Search file contents": {
"Search file contents": ""
"Search file contents": "Cerca il contenuto dei files"
},
"Search filenames": {
"Search filenames": ""
"Search filenames": "Cerca i nomi dei files"
},
"Search for a location...": {
"Search for a location...": "Cerca una posizione..."
@@ -1413,7 +1440,7 @@
"Search...": "Cerca..."
},
"Searching...": {
"Searching...": ""
"Searching...": "Cercando..."
},
"Select Launcher Logo": {
"Select Launcher Logo": "Seleziona Logo Launcher"
@@ -1467,10 +1494,10 @@
"Settings": "Impostazioni"
},
"Shift+Del: Clear All • Esc: Close": {
"Shift+Del: Clear All • Esc: Close": "Shift+Del: Pulisce Tutto • Esc: Chiude"
"Shift+Del: Clear All • Esc: Close": "Shift+Del: Elimina tutto • Esc: Chiude"
},
"Show All Tags": {
"Show All Tags": ""
"Show All Tags": "Mostra tutti i tags"
},
"Show Confirmation on Power Actions": {
"Show Confirmation on Power Actions": "Chiedi Conferma per Azione Engertiche"
@@ -1488,7 +1515,7 @@
"Show Workspace Apps": "Mostra Apps Workspace"
},
"Show all 9 tags instead of only occupied tags (DWL only)": {
"Show all 9 tags instead of only occupied tags (DWL only)": ""
"Show all 9 tags instead of only occupied tags (DWL only)": "Mostra tutti i 9 tags invece dei soli tags occupati (solo DWL)"
},
"Show on Last Display": {
"Show on Last Display": "Mostra sull'ultimo display"
@@ -1803,7 +1830,7 @@
"Visual divider between widgets": "Speratore visivo tra i widget"
},
"Visual effect used when wallpaper changes": {
"Visual effect used when wallpaper changes": "Effetti visuali usati quando cambia lo sfondo"
"Visual effect used when wallpaper changes": "Effetto visivo usato quando cambia lo sfondo"
},
"Volume Changed": {
"Volume Changed": "Volume Cambiato"
@@ -1815,13 +1842,13 @@
"Wallpaper": "Sfondo"
},
"Wallpaper Monitor": {
"Wallpaper Monitor": ""
"Wallpaper Monitor": "Monitor dello sfondo"
},
"Wallpapers": {
"Wallpapers": "Sfondi"
},
"Wave Progress Bars": {
"Wave Progress Bars": "Progress Bar as Onde"
"Wave Progress Bars": "Progress Bar ad Onde"
},
"Weather": {
"Weather": "Meteo"
@@ -1833,7 +1860,7 @@
"Website:": "Sito web:"
},
"When enabled, apps are sorted alphabetically. When disabled, apps are sorted by usage frequency.": {
"When enabled, apps are sorted alphabetically. When disabled, apps are sorted by usage frequency.": "Quando abilitato, le apps sono ordinate alfabeticamente. Quando disabilitato, le apps sono ordinate per frequenza d'uso"
"When enabled, apps are sorted alphabetically. When disabled, apps are sorted by usage frequency.": "Quando abilitato, le applicazioni sono ordinate alfabeticamente. Quando disabilitato, le applicazioni sono ordinate per frequenza d'uso"
},
"WiFi disabled": {
"WiFi disabled": "WiFi disabilitato"

View File

@@ -173,6 +173,12 @@
"Auto-saving...": {
"Auto-saving...": "自動保存中..."
},
"Autoconnect disabled": {
"Autoconnect disabled": ""
},
"Autoconnect enabled": {
"Autoconnect enabled": ""
},
"Automatic Control": {
"Automatic Control": "自動制御"
},
@@ -347,6 +353,9 @@
"Color Picker": {
"Color Picker": "カラーピッカー"
},
"Color temperature for day time": {
"Color temperature for day time": "昼間の色温度"
},
"Color temperature for night mode": {
"Color temperature for night mode": "ナイトモードの色温度"
},
@@ -512,9 +521,15 @@
"DankSearch not available": {
"DankSearch not available": "DankSearchが利用できません"
},
"Dark Mode": {
"Dark Mode": "ダークモード"
},
"Date Format": {
"Date Format": "日付形式"
},
"Day Temperature": {
"Day Temperature": "昼間の温度"
},
"Default": {
"Default": "デフォルト"
},
@@ -539,6 +554,9 @@
"Device paired": {
"Device paired": "デバイスがペアリングされました"
},
"Disable Autoconnect": {
"Disable Autoconnect": ""
},
"Disconnect": {
"Disconnect": "切断"
},
@@ -614,6 +632,9 @@
"Empty": {
"Empty": "空白"
},
"Enable Autoconnect": {
"Enable Autoconnect": ""
},
"Enable GPU Temperature": {
"Enable GPU Temperature": "GPU温度を有効にする"
},
@@ -710,6 +731,9 @@
"Failed to start connection to ": {
"Failed to start connection to ": "接続ができませんでした "
},
"Failed to update autoconnect": {
"Failed to update autoconnect": ""
},
"Feels Like": {
"Feels Like": "どうやら"
},
@@ -1085,6 +1109,9 @@
"Night Mode": {
"Night Mode": "ナイトモード"
},
"Night Temperature": {
"Night Temperature": "夜間の温度"
},
"No Active Players": {
"No Active Players": "アクティブプレイヤーなし"
},

View File

@@ -9,16 +9,16 @@
"- Stateless System Monitoring": "- Monitoração de Sistema sem estado"
},
"- Support Us With a Star ⭐": {
"- Support Us With a Star ⭐": "- Suporte-nos com uma Estrela ⭐"
"- Support Us With a Star ⭐": "- Apoie-nos com uma Estrela ⭐"
},
"1 event": {
"1 event": "1 evento"
},
"24-Hour Format": {
"24-Hour Format": "Formato 24 Horas"
"24-Hour Format": "Formato de 24 Horas"
},
"24-hour format": {
"24-hour format": "formato 24 horas"
"24-hour format": "formato de 24 horas"
},
"3rd party": {
"3rd party": "Terceiros"
@@ -72,7 +72,7 @@
"Always Show OSD Percentage": "Sempre mostrar porcetagem no OSD"
},
"Always show a minimum of 3 workspaces, even if fewer are available": {
"Always show a minimum of 3 workspaces, even if fewer are available": ""
"Always show a minimum of 3 workspaces, even if fewer are available": "Sempre mostrar o mínimo de 3 áreas de trabalho, mesmo se menos estiverem disponíveis"
},
"Animation Speed": {
"Animation Speed": "Velocidade de Animação"
@@ -84,7 +84,7 @@
"App Launcher": "Lançador de Apps"
},
"Application Dock": {
"Application Dock": ""
"Application Dock": "Dock de Aplicativos"
},
"Applications": {
"Applications": "Aplicativos"
@@ -99,7 +99,7 @@
"Apply Qt Colors": "Aplicar cores no QT"
},
"Apply warm color temperature to reduce eye strain. Use automation settings below to control when it activates.": {
"Apply warm color temperature to reduce eye strain. Use automation settings below to control when it activates.": ""
"Apply warm color temperature to reduce eye strain. Use automation settings below to control when it activates.": "Aplicar temperatura de cor quente para reduzir a fadiga ocular. Use as configurações de automação abaixo para controlar quando ela será ativada."
},
"Apps Icon": {
"Apps Icon": "Ícones de Apps"
@@ -138,22 +138,22 @@
"Audio Output Devices (": "Dispositivos de Saída de Áudio ("
},
"Authenticate": {
"Authenticate": ""
"Authenticate": "Autenticar"
},
"Authentication Required": {
"Authentication Required": ""
"Authentication Required": "Autenticação Necessária"
},
"Authentication failed, please try again": {
"Authentication failed, please try again": ""
"Authentication failed, please try again": "Erro ao autenticar, por favor tente novamente"
},
"Authorize": {
"Authorize": ""
"Authorize": "Autorizar"
},
"Authorize pairing with ": {
"Authorize pairing with ": ""
"Authorize pairing with ": "Autorizar emparelhamento com "
},
"Authorize service for ": {
"Authorize service for ": ""
"Authorize service for ": "Autorizar serviço para "
},
"Auto Location": {
"Auto Location": "Localização Automática"
@@ -171,7 +171,13 @@
"Auto-location": "Localização-Automática"
},
"Auto-saving...": {
"Auto-saving...": "Salvamento Automático"
"Auto-saving...": "Salvando automáticamente..."
},
"Autoconnect disabled": {
"Autoconnect disabled": ""
},
"Autoconnect enabled": {
"Autoconnect enabled": ""
},
"Automatic Control": {
"Automatic Control": "Controle Automático"
@@ -186,7 +192,7 @@
"Automatically cycle through wallpapers in the same folder": "Circular automaticamente dentre os papéis de parede na mesma pasta"
},
"Automatically detect location based on IP address": {
"Automatically detect location based on IP address": ""
"Automatically detect location based on IP address": "Detectar localização automáticamente baseado no endereço IP"
},
"Automatically determine your location using your IP address": {
"Automatically determine your location using your IP address": "Detectar automaticamente a sua localização usando o seu endereço de IP"
@@ -216,7 +222,7 @@
"Back": "Voltar"
},
"Balanced palette with focused accents (default).": {
"Balanced palette with focused accents (default).": ""
"Balanced palette with focused accents (default).": "Paleta equilibrada com destaques de cor focados (padrão)."
},
"Battery": {
"Battery": "Bateria"
@@ -237,13 +243,13 @@
"Bluetooth Settings": "Configurações do Bluetooth"
},
"Blur Layer": {
"Blur Layer": ""
"Blur Layer": "Camada de Desfoque"
},
"Blur on Overview": {
"Blur on Overview": ""
"Blur on Overview": "Desfoque na Visão Geral"
},
"Blur wallpaper when niri overview is open": {
"Blur wallpaper when niri overview is open": ""
"Blur wallpaper when niri overview is open": "Desfoque de papel de parede quando a visão geral do niri estiver aberta"
},
"Border": {
"Border": "Borda"
@@ -258,13 +264,13 @@
"Border Thickness": "Espessura da Borda"
},
"Bottom": {
"Bottom": ""
"Bottom": "Inferior"
},
"Bottom Section": {
"Bottom Section": ""
"Bottom Section": "Seção Inferior"
},
"Bottom dock for pinned and running applications": {
"Bottom dock for pinned and running applications": ""
"Bottom dock for pinned and running applications": "Dock inferior para aplicativos fixados e rodando"
},
"Brightness": {
"Brightness": "Brilho"
@@ -309,7 +315,7 @@
"Choose icon": "Escolher Ícone"
},
"Choose the border accent color": {
"Choose the border accent color": "Escolha a cor de realce da borda\n"
"Choose the border accent color": "Escolha a cor de realce da borda"
},
"Choose the logo displayed on the launcher button in DankBar": {
"Choose the logo displayed on the launcher button in DankBar": "Escolher a logo que será exibida no botão do Lançador no DankBar"
@@ -347,17 +353,20 @@
"Color Picker": {
"Color Picker": "Seletor de Cores"
},
"Color temperature for day time": {
"Color temperature for day time": "Temperatura de cor durante o dia"
},
"Color temperature for night mode": {
"Color temperature for night mode": "Temperatura da cor para o modo noturno"
},
"Colorful mix of bright contrasting accents.": {
"Colorful mix of bright contrasting accents.": ""
"Colorful mix of bright contrasting accents.": "Mistura colorida de destaques de cor brilhantes e contrastantes."
},
"Command or script to run instead of the standard hibernate procedure": {
"Command or script to run instead of the standard hibernate procedure": "Comando ou script serão executados em vez do procedimento padrão de hibernação"
},
"Command or script to run instead of the standard lock procedure": {
"Command or script to run instead of the standard lock procedure": ""
"Command or script to run instead of the standard lock procedure": "Comando ou script para rodar ao invés do procedimento de bloqueio padrão"
},
"Command or script to run instead of the standard logout procedure": {
"Command or script to run instead of the standard logout procedure": "Comando ou script irão ser executados em vez do procedimento padrão de logout"
@@ -378,31 +387,31 @@
"Compact Mode": "Modo Compacto"
},
"Compositor": {
"Compositor": ""
"Compositor": "Compositor"
},
"Compositor:": {
"Compositor:": "Compositor:"
},
"Configuration activated": {
"Configuration activated": ""
"Configuration activated": "Configuração ativada"
},
"Configure icons for named workspaces. Icons take priority over numbers when both are enabled.": {
"Configure icons for named workspaces. Icons take priority over numbers when both are enabled.": "Configurações de ícones para área de trabalho nomeadas. Ícones tem prioridade sobre números, isso quando ambos estão habilitados. "
"Configure icons for named workspaces. Icons take priority over numbers when both are enabled.": "Configurações de ícones para área de trabalho nomeadas. Ícones têm prioridade sobre números quando ambos estão habilitados."
},
"Configure which displays show shell components": {
"Configure which displays show shell components": "Configurar em quais telas serão mostrados os componentes do shell"
},
"Confirm": {
"Confirm": ""
"Confirm": "Confirmar"
},
"Confirm passkey for ": {
"Confirm passkey for ": ""
"Confirm passkey for ": "Confirmar chave de acesso para "
},
"Connect": {
"Connect": "Conectar"
},
"Connect to VPN": {
"Connect to VPN": ""
"Connect to VPN": "Conectar à VPN"
},
"Connect to Wi-Fi": {
"Connect to Wi-Fi": "Conectar ao Wi-Fi"
@@ -411,7 +420,7 @@
"Connected Displays": "Telas Conectadas"
},
"Connection failed. Check password and try again.": {
"Connection failed. Check password and try again.": ""
"Connection failed. Check password and try again.": "Erro ao conectar. Cheque a senha e tente novamente."
},
"Contrast": {
"Contrast": "Contraste"
@@ -465,7 +474,7 @@
"Custom Location": "Customizar Localização"
},
"Custom Power Actions": {
"Custom Power Actions": ""
"Custom Power Actions": "Ações de Energia Customizadas"
},
"Custom Transparency": {
"Custom Transparency": "Transparência Customizada"
@@ -492,7 +501,7 @@
"Daily at:": "Diária:"
},
"Dank": {
"Dank": ""
"Dank": "Dank"
},
"Dank Bar": {
"Dank Bar": "Dank Bar"
@@ -510,11 +519,17 @@
"DankBar Font Scale": "Escala das fontes no Dank Bar"
},
"DankSearch not available": {
"DankSearch not available": ""
"DankSearch not available": "DankSearch não disponível"
},
"Dark Mode": {
"Dark Mode": ""
},
"Date Format": {
"Date Format": "Formatação de Data"
},
"Day Temperature": {
"Day Temperature": "Temperatura Diurna"
},
"Default": {
"Default": "Padrão"
},
@@ -525,10 +540,10 @@
"Del: Clear • Shift+Del: Clear All • 1-9: Actions • F10: Help • Esc: Close": "Del: Limpar • Shift+Del: Limpar Tudo • 1-9: Ações • F10: Ajuda • Esc: Fechar"
},
"Derives colors that closely match the underlying image.": {
"Derives colors that closely match the underlying image.": ""
"Derives colors that closely match the underlying image.": "Deriva cores que combinam de perto com a imagem de fundo."
},
"Desktop background images": {
"Desktop background images": ""
"Desktop background images": "Imagens de fundo da área de trabalho"
},
"Development": {
"Development": "Desenvolvimento"
@@ -537,13 +552,16 @@
"Device": "Dispositivo"
},
"Device paired": {
"Device paired": ""
"Device paired": "Dispositivo pareado"
},
"Disable Autoconnect": {
"Disable Autoconnect": ""
},
"Disconnect": {
"Disconnect": "Desconectar"
},
"Disconnected from WiFi": {
"Disconnected from WiFi": ""
"Disconnected from WiFi": "Disconectado do WiFi"
},
"Disk": {
"Disk": "Disco"
@@ -552,7 +570,7 @@
"Disk Usage": "Uso de Disco"
},
"Dismiss": {
"Dismiss": ""
"Dismiss": "Descartar"
},
"Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen": {
"Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen": "Exibir um dock com aplicativos que estão sendo utilizados, e que pode ser posicionada no superior, inferior, esquerda ou direita dos cantos da tela"
@@ -561,7 +579,7 @@
"Display all priorities over fullscreen apps": "Exibir todas as prioridades em aplicativos de tela cheia"
},
"Display application icons in workspace indicators": {
"Display application icons in workspace indicators": ""
"Display application icons in workspace indicators": "Mostrar ícones de aplicativos em indicadores de espaço de trabalho"
},
"Display currently focused application title": {
"Display currently focused application title": "Mostrar título do app em foco"
@@ -576,10 +594,10 @@
"Displays the active keyboard layout and allows switching": "Exibir Layout ativo do teclado, e permitir alterações"
},
"Diverse palette spanning the full spectrum.": {
"Diverse palette spanning the full spectrum.": ""
"Diverse palette spanning the full spectrum.": "Paleta diversa que abrange todo o espectro."
},
"Do Not Disturb": {
"Do Not Disturb": "Não Perturbe "
"Do Not Disturb": "Não Perturbe"
},
"Dock": {
"Dock": "Dock"
@@ -591,16 +609,16 @@
"Dock Transparency": "Transparência da Dock"
},
"Domain (optional)": {
"Domain (optional)": ""
"Domain (optional)": "Domínio (opcional)"
},
"Donate on Ko-fi": {
"Donate on Ko-fi": ""
"Donate on Ko-fi": "Doe no Ko-fi"
},
"Drag widgets to reorder within sections. Use the eye icon to hide/show widgets (maintains spacing), or X to remove them completely.": {
"Drag widgets to reorder within sections. Use the eye icon to hide/show widgets (maintains spacing), or X to remove them completely.": "Arraste Widgets para reordená-los nas seções. Use o ícone de olho para esconder ou mostrá-los (manter o espaçamento), ou clique no X para removê-los por completo."
},
"Duration": {
"Duration": ""
"Duration": "Duração"
},
"Dynamic Theming": {
"Dynamic Theming": "Tematização Dinâmica"
@@ -614,6 +632,9 @@
"Empty": {
"Empty": "Vázio"
},
"Enable Autoconnect": {
"Enable Autoconnect": ""
},
"Enable GPU Temperature": {
"Enable GPU Temperature": "Habilitar Temperatura da GPU"
},
@@ -624,10 +645,10 @@
"Enable Weather": "Habilitar Clima"
},
"Enable WiFi": {
"Enable WiFi": "Ativar Wi-fi "
"Enable WiFi": "Ativar WiFi"
},
"Enable compositor-targetable blur layer (namespace: dms:blurwallpaper). Requires manual niri configuration.": {
"Enable compositor-targetable blur layer (namespace: dms:blurwallpaper). Requires manual niri configuration.": ""
"Enable compositor-targetable blur layer (namespace: dms:blurwallpaper). Requires manual niri configuration.": "Habilitar camada de desfoque direcionável ao compositor (namespace: dms:blurwallpaper). Requer configuração manual do niri."
},
"Enable fingerprint authentication": {
"Enable fingerprint authentication": "Habilitar autenticação por impressão digital"
@@ -639,31 +660,31 @@
"End": "Fim"
},
"Enter 6-digit passkey": {
"Enter 6-digit passkey": ""
"Enter 6-digit passkey": "Entre a chave de acesso de 6 dígitos"
},
"Enter PIN": {
"Enter PIN": ""
"Enter PIN": "Entre código PIN"
},
"Enter PIN for ": {
"Enter PIN for ": ""
"Enter PIN for ": "Entre código PIN para "
},
"Enter a search query": {
"Enter a search query": ""
"Enter a search query": "Entre uma consulta de pesquisa"
},
"Enter credentials for ": {
"Enter credentials for ": "Insira as credenciais para "
},
"Enter custom lock screen format (e.g., dddd, MMMM d)": {
"Enter custom lock screen format (e.g., dddd, MMMM d)": "Insira uma formatação customizada para a tela de bloqueio (exemplo: dddd, MMMM d)"
"Enter custom lock screen format (e.g., dddd, MMMM d)": "Insira um formato customizado para a tela de bloqueio (exemplo: dddd, MMMM d)"
},
"Enter custom top bar format (e.g., ddd MMM d)": {
"Enter custom top bar format (e.g., ddd MMM d)": "Insira uma formatação customizada para a barra superior (exemplo: ddd MMM d)"
"Enter custom top bar format (e.g., ddd MMM d)": "Insira um formato customizado para a barra superior (exemplo: ddd MMM d)"
},
"Enter filename...": {
"Enter filename...": "Insira nome do arquivo..."
},
"Enter passkey for ": {
"Enter passkey for ": ""
"Enter passkey for ": "Entre chave de acesso para "
},
"Enter password for ": {
"Enter password for ": "Insira senha para "
@@ -678,37 +699,40 @@
"F1/I: Toggle • F10: Help": "F1/I: Ativar • F10: Ajuda"
},
"Failed to activate configuration": {
"Failed to activate configuration": ""
"Failed to activate configuration": "Erro ao ativar configuração"
},
"Failed to connect VPN": {
"Failed to connect VPN": ""
"Failed to connect VPN": "Erro ao conectar à VPN"
},
"Failed to connect to ": {
"Failed to connect to ": ""
"Failed to connect to ": "Erro ao conectar a "
},
"Failed to disconnect VPN": {
"Failed to disconnect VPN": ""
"Failed to disconnect VPN": "Erro ao desconectar VPN"
},
"Failed to disconnect VPNs": {
"Failed to disconnect VPNs": ""
"Failed to disconnect VPNs": "Erro ao desconectar VPNs"
},
"Failed to disconnect WiFi": {
"Failed to disconnect WiFi": ""
"Failed to disconnect WiFi": "Erro ao disconectar WiFi"
},
"Failed to enable WiFi": {
"Failed to enable WiFi": ""
"Failed to enable WiFi": "Erro ao habilitar WiFi"
},
"Failed to remove device": {
"Failed to remove device": ""
"Failed to remove device": "Erro ao remover dispositivo"
},
"Failed to set profile image": {
"Failed to set profile image": ""
"Failed to set profile image": "Erro ao definir imagem de perfil"
},
"Failed to set profile image: ": {
"Failed to set profile image: ": ""
"Failed to set profile image: ": "Erro ao definir imagem de perfil: "
},
"Failed to start connection to ": {
"Failed to start connection to ": ""
"Failed to start connection to ": "Erro ao iniciar conexão a "
},
"Failed to update autoconnect": {
"Failed to update autoconnect": ""
},
"Feels Like": {
"Feels Like": "Sensação Térmica"
@@ -723,7 +747,7 @@
"Find in Text": "Procurar no Texto"
},
"Find in note...": {
"Find in note...": "Procurar na nota"
"Find in note...": "Procurar na nota..."
},
"Focused Window": {
"Focused Window": "Janela Focada"
@@ -753,7 +777,7 @@
"Forget Network": "Esquecer Internet"
},
"Forgot network ": {
"Forgot network ": ""
"Forgot network ": "Esquecer rede "
},
"Format Legend": {
"Format Legend": "Formatar Legenda"
@@ -780,10 +804,10 @@
"Gamma Control": "Controle de Gama"
},
"Gamma control not available. Requires DMS API v6+.": {
"Gamma control not available. Requires DMS API v6+.": ""
"Gamma control not available. Requires DMS API v6+.": "Controle de gama não disponível. Necessário DMS API v6+."
},
"Geoclue service not running - cannot auto-detect location": {
"Geoclue service not running - cannot auto-detect location": ""
"Geoclue service not running - cannot auto-detect location": "Serviço do Geoclue não está rodando - não foi possível detectar a localização automaticamente"
},
"Github:": {
"Github:": "Github:"
@@ -822,10 +846,10 @@
"Hide the dock when not in use and reveal it when hovering near the dock area": "Esconder a dock quando não usada e mostrar ao passar o mouse próximo da área"
},
"High-contrast palette for strong visual distinction.": {
"High-contrast palette for strong visual distinction.": ""
"High-contrast palette for strong visual distinction.": "Paleta de alto contraste para forte distinção visual."
},
"High-fidelity palette that preserves source hues.": {
"High-fidelity palette that preserves source hues.": ""
"High-fidelity palette that preserves source hues.": "Paleta de alta fidelidade que preserva tons da fonte."
},
"Hour": {
"Hour": "Hora"
@@ -861,10 +885,10 @@
"Include Transitions": "Incluir Transições"
},
"Incorrect password": {
"Incorrect password": ""
"Incorrect password": "Senha incorreta"
},
"Indicator Style": {
"Indicator Style": ""
"Indicator Style": "Estilo de Indicador"
},
"Individual Batteries": {
"Individual Batteries": "Baterias Individuais"
@@ -894,19 +918,19 @@
"Language:": "Linguagem:"
},
"Last launched %1": {
"Last launched %1": ""
"Last launched %1": "Lançado pela última vez em %1"
},
"Last launched %1 day%2 ago": {
"Last launched %1 day%2 ago": ""
"Last launched %1 day%2 ago": "Lançado pela última vez %1 dia%2 atrás"
},
"Last launched %1 hour%2 ago": {
"Last launched %1 hour%2 ago": ""
"Last launched %1 hour%2 ago": "Lançado pela última vez %1 hora%2 atrás"
},
"Last launched %1 minute%2 ago": {
"Last launched %1 minute%2 ago": ""
"Last launched %1 minute%2 ago": "Lançado pela última vez %1 minuto%2 atrás"
},
"Last launched just now": {
"Last launched just now": ""
"Last launched just now": "Lançado pela última vez agora"
},
"Latitude": {
"Latitude": "Latitude"
@@ -930,7 +954,7 @@
"Left": "Esquerda"
},
"Left Section": {
"Left Section": ""
"Left Section": "Seção da Esquerda"
},
"Light Mode": {
"Light Mode": "Modo Claro"
@@ -939,7 +963,7 @@
"Lines: %1": "Linhas: %1"
},
"Lively palette with saturated accents.": {
"Lively palette with saturated accents.": ""
"Lively palette with saturated accents.": "Paleta vívida com destaques de cor saturados."
},
"Loading plugins...": {
"Loading plugins...": "Carregando plugins..."
@@ -990,7 +1014,7 @@
"Matugen Settings": "Configurações do Matugen"
},
"Matugen Target Monitor": {
"Matugen Target Monitor": ""
"Matugen Target Monitor": "Monitor-alvo do Matugen"
},
"Max apps to show": {
"Max apps to show": "Máximo de apps para mostrar"
@@ -1017,7 +1041,7 @@
"Memory usage indicator": "Indicador de uso de memória"
},
"Minimal palette built around a single hue.": {
"Minimal palette built around a single hue.": ""
"Minimal palette built around a single hue.": "Paleta mínima construída ao redor de um único tom."
},
"Minute": {
"Minute": "Minuto"
@@ -1032,7 +1056,7 @@
"Monitor Selection:": "Seleção de Monitor:"
},
"Monitor whose wallpaper drives dynamic theming colors": {
"Monitor whose wallpaper drives dynamic theming colors": ""
"Monitor whose wallpaper drives dynamic theming colors": "Monitor o qual papel de parede controla cores de tema dinâmicas"
},
"Monospace Font": {
"Monospace Font": "Fonte Mono espaço"
@@ -1041,7 +1065,7 @@
"Mount": "Ponto de montagem"
},
"Muted palette with subdued, calming tones.": {
"Muted palette with subdued, calming tones.": ""
"Muted palette with subdued, calming tones.": "Paleta suave com tons sutis e calmantes."
},
"NM not supported": {
"NM not supported": "NM não suportado"
@@ -1085,6 +1109,9 @@
"Night Mode": {
"Night Mode": "Modo Noturno"
},
"Night Temperature": {
"Night Temperature": "Temperatura Noturna"
},
"No Active Players": {
"No Active Players": "Sem Tocadores Ativos"
},
@@ -1107,7 +1134,7 @@
"No clipboard entries found": "Área de transferência vazia"
},
"No files found": {
"No files found": ""
"No files found": "Nenhum arquivo encontrado"
},
"No items added yet": {
"No items added yet": "Nenhum item adicionado"
@@ -1131,7 +1158,7 @@
"Notepad Font Settings": "Configurações da Fonte do Bloco de Notas"
},
"Notepad Slideout": {
"Notepad Slideout": ""
"Notepad Slideout": "Blocos de Notas Deslizante"
},
"Nothing to see here": {
"Nothing to see here": "Nada para ver aqui"
@@ -1152,7 +1179,7 @@
"Notification Timeouts": "Tempo Máximo de Notificação"
},
"Notification toast popups": {
"Notification toast popups": ""
"Notification toast popups": "Pop-ups de notificações toast"
},
"Notifications": {
"Notifications": "Notificações"
@@ -1167,10 +1194,10 @@
"Office": "Escritório"
},
"On-Screen Displays": {
"On-Screen Displays": ""
"On-Screen Displays": "Displays na Tela (OSDs)"
},
"Only adjust gamma based on time or location rules.": {
"Only adjust gamma based on time or location rules.": ""
"Only adjust gamma based on time or location rules.": "Apenas ajustar gama baseada em regras de tempo ou localização."
},
"Opacity": {
"Opacity": "Opacidade"
@@ -1194,16 +1221,16 @@
"Padding": "Preenchimento"
},
"Pair": {
"Pair": ""
"Pair": "Parear"
},
"Pair Bluetooth Device": {
"Pair Bluetooth Device": ""
"Pair Bluetooth Device": "Emparelhar Dispositivo Bluetooth"
},
"Pairing failed": {
"Pairing failed": ""
"Pairing failed": "Erro ao emparelhar"
},
"Passkey:": {
"Passkey:": ""
"Passkey:": "Chave de acesso:"
},
"Password": {
"Password": "Senha"
@@ -1221,7 +1248,7 @@
"Percentage": "Porcetagem"
},
"Permission denied to set profile image.": {
"Permission denied to set profile image.": ""
"Permission denied to set profile image.": "Permissão negada ao definir imagem de perfil."
},
"Personalization": {
"Personalization": "Personalização"
@@ -1263,7 +1290,7 @@
"Plugins": "Plugins"
},
"Plugins:": {
"Plugins:": ""
"Plugins:": "Plugins:"
},
"Popup Position": {
"Popup Position": "Posição do Popup"
@@ -1305,10 +1332,10 @@
"Process": "Processo"
},
"Profile Image Error": {
"Profile Image Error": ""
"Profile Image Error": "Erro da Imagem de Perfil"
},
"Profile image is too large. Please use a smaller image.": {
"Profile image is too large. Please use a smaller image.": ""
"Profile image is too large. Please use a smaller image.": "A imagem de perfil é muito grande. Por favor use uma imagem menor."
},
"QML, JavaScript, Go": {
"QML, JavaScript, Go": "QML, JavaScript, Go"
@@ -1323,7 +1350,7 @@
"Quick access to notepad": "Acesso rápido ao bloco de notas"
},
"Quick note-taking slideout panel": {
"Quick note-taking slideout panel": ""
"Quick note-taking slideout panel": "Painel deslizante para anotações rápidas"
},
"Rain Chance": {
"Rain Chance": "Chance de Chuva"
@@ -1341,7 +1368,7 @@
"Refresh": "Recarregar"
},
"Reload Plugin": {
"Reload Plugin": ""
"Reload Plugin": "Reiniciar Plugin"
},
"Remove": {
"Remove": "Remover"
@@ -1353,13 +1380,13 @@
"Reset": "Resetar"
},
"Resources": {
"Resources": ""
"Resources": "Recursos"
},
"Right": {
"Right": ""
"Right": "Direita"
},
"Right Section": {
"Right Section": ""
"Right Section": "Seção da Direita"
},
"Run User Templates": {
"Run User Templates": "Executar Templates do Usuário"
@@ -1395,13 +1422,13 @@
"Science": "Ciência"
},
"Scroll through windows, rather than workspaces": {
"Scroll through windows, rather than workspaces": ""
"Scroll through windows, rather than workspaces": "Role pelas janelas, ao invés de áreas de trabalho"
},
"Search file contents": {
"Search file contents": ""
"Search file contents": "Pesquisar conteúdos de arquivos"
},
"Search filenames": {
"Search filenames": ""
"Search filenames": "Pesquisar nomes de arquivos"
},
"Search for a location...": {
"Search for a location...": "Procurar um local..."
@@ -1413,7 +1440,7 @@
"Search...": "Buscar..."
},
"Searching...": {
"Searching...": ""
"Searching...": "Pesquisando..."
},
"Select Launcher Logo": {
"Select Launcher Logo": "Selecionar Logo do Lançador"
@@ -1422,7 +1449,7 @@
"Select a color from the palette or use custom sliders": "Escolha uma cor na paleta ou use controles deslizantes"
},
"Select a preset or drag the slider to customize": {
"Select a preset or drag the slider to customize": ""
"Select a preset or drag the slider to customize": "Selecione uma predefinição ou arraste o controle deslizante para customizar"
},
"Select a widget to add to the ": {
"Select a widget to add to the ": "Selecione um widget para adicionar a "
@@ -1446,13 +1473,13 @@
"Select system sound theme": "Selecionar tema do som do sistema"
},
"Select the palette algorithm used for wallpaper-based colors": {
"Select the palette algorithm used for wallpaper-based colors": ""
"Select the palette algorithm used for wallpaper-based colors": "Selecione o algoritmo usado para cores baseadas no papel de parede"
},
"Select which transitions to include in randomization": {
"Select which transitions to include in randomization": "Selecionar quais transições incluir na randomização"
},
"Selected image file not found.": {
"Selected image file not found.": ""
"Selected image file not found.": "Imagem selecionada não encontrada."
},
"Separator": {
"Separator": "Separador"
@@ -1470,7 +1497,7 @@
"Shift+Del: Clear All • Esc: Close": "Shift+Del: Apagar tudo • Esc: Fechar"
},
"Show All Tags": {
"Show All Tags": ""
"Show All Tags": "Mostrar Todas as Tags"
},
"Show Confirmation on Power Actions": {
"Show Confirmation on Power Actions": "Mostrar Confirmação em Ações de Energia"
@@ -1488,10 +1515,10 @@
"Show Workspace Apps": "Mostrar Aplicativos da Área de Trabalho Virtual"
},
"Show all 9 tags instead of only occupied tags (DWL only)": {
"Show all 9 tags instead of only occupied tags (DWL only)": ""
"Show all 9 tags instead of only occupied tags (DWL only)": "Mostrar todas as 9 tags ao invés de apenas tags ocupadas (apenas DWL)"
},
"Show on Last Display": {
"Show on Last Display": ""
"Show on Last Display": "Mostrar na Última Tela"
},
"Show on Overview": {
"Show on Overview": "Mostrar na Visão Geral"
@@ -1503,10 +1530,10 @@
"Show on screens:": "Mostrar nas telas:"
},
"Show only apps running in current workspace": {
"Show only apps running in current workspace": ""
"Show only apps running in current workspace": "Mostrar apenas aplicativos rodando na área de trabalho atual"
},
"Show only workspaces belonging to each specific monitor.": {
"Show only workspaces belonging to each specific monitor.": ""
"Show only workspaces belonging to each specific monitor.": "Mostrar apenas áreas de trabalho pertencentes a cada monitor específico."
},
"Show password": {
"Show password": "Mostrar senha"
@@ -1521,7 +1548,7 @@
"Show weather information in top bar and control center": "Mostrar informação de clima na barra superior e na central de controle"
},
"Show workspace index numbers in the top bar workspace switcher": {
"Show workspace index numbers in the top bar workspace switcher": ""
"Show workspace index numbers in the top bar workspace switcher": "Mostrar números de índice das áreas de trabalho no seletor de áreas de trabalho"
},
"Shows all running applications with focus indication": {
"Shows all running applications with focus indication": "Mostra todos os aplicativos em execução, destacando o que está em foco"
@@ -1566,7 +1593,7 @@
"Storage & Disks": "Armazenamento & Discos"
},
"Support Development": {
"Support Development": ""
"Support Development": "Apoie o Desenvolvimento"
},
"Surface": {
"Surface": "Superfície"
@@ -1602,7 +1629,7 @@
"System Monitor Unavailable": "Monitor do Sistema Indisponível"
},
"System Monitoring:": {
"System Monitoring:": "Monitoramento do Sistema"
"System Monitoring:": "Monitoramento do Sistema:"
},
"System Tray": {
"System Tray": "Bandeja do Sistema"
@@ -1617,16 +1644,16 @@
"System Updates": "Atualizações do Sistema"
},
"System bar with widgets and system information": {
"System bar with widgets and system information": ""
"System bar with widgets and system information": "Barra do sistema com widgets e informações do sistema"
},
"System notification area icons": {
"System notification area icons": "Área de ícones de notificações do sistema"
},
"System toast notifications": {
"System toast notifications": ""
"System toast notifications": "Notificações toast do sistema"
},
"System tray icons": {
"System tray icons": ""
"System tray icons": "Ícones da bandeja do sistema"
},
"System update custom command": {
"System update custom command": "Comando personalizado para atualização do sistema"
@@ -1647,7 +1674,7 @@
"Text": "Texto"
},
"The DMS_SOCKET environment variable is not set or the socket is unavailable. Automated plugin management requires the DMS_SOCKET.": {
"The DMS_SOCKET environment variable is not set or the socket is unavailable. Automated plugin management requires the DMS_SOCKET.": "A variável de ambiente DMS_SOCKET não está definida ou o socket está indisponível. O gerenciamento automático de plugins requer o DMS_SOCKET."
"The DMS_SOCKET environment variable is not set or the socket is unavailable. Automated plugin management requires the DMS_SOCKET.": "A variável de ambiente DMS_SOCKET não está definida ou o socket está indisponível. O gerenciamento automático de plugins requer a DMS_SOCKET."
},
"The below settings will modify your GTK and Qt settings. If you wish to preserve your current configurations, please back them up (qt5ct.conf|qt6ct.conf and ~/.config/gtk-3.0|gtk-4.0).": {
"The below settings will modify your GTK and Qt settings. If you wish to preserve your current configurations, please back them up (qt5ct.conf|qt6ct.conf and ~/.config/gtk-3.0|gtk-4.0).": "As configurações abaixo vão modificar suas configurações GTK e Qt. Se você deseja preservá-las, por favor faça um back up (qt5ct.conf|qt6ct.conf and ~/.config/gtk-3.0|gtk-4.0)."
@@ -1680,7 +1707,7 @@
"To update, run the following command:": "Para atualizar, execute o seguinte comando:"
},
"Toast Messages": {
"Toast Messages": ""
"Toast Messages": "Mensagens Toast"
},
"Today": {
"Today": "Hoje"
@@ -1692,13 +1719,13 @@
"Tomorrow": "Amanhã"
},
"Top": {
"Top": ""
"Top": "Topo"
},
"Top Bar Format": {
"Top Bar Format": "Formato da Barra Superior"
},
"Top Section": {
"Top Section": ""
"Top Section": "Seção do topo"
},
"Transition Effect": {
"Transition Effect": "Efeito de Transição"
@@ -1707,7 +1734,7 @@
"Turn off monitors after": "Desligar monitores depois de"
},
"Uninstall Plugin": {
"Uninstall Plugin": ""
"Uninstall Plugin": "Desinstalar Plugin"
},
"Unpin from Dock": {
"Unpin from Dock": "Desafixar do Dock"
@@ -1728,7 +1755,7 @@
"Update All": "Atualizar Tudo"
},
"Update Plugin": {
"Update Plugin": ""
"Update Plugin": "Atualizar Plugin"
},
"Use 24-hour time format instead of 12-hour AM/PM": {
"Use 24-hour time format instead of 12-hour AM/PM": "Usar relógio de 24 horas em vez de 12 horas com AM/PM"
@@ -1743,7 +1770,7 @@
"Use Fahrenheit instead of Celsius for temperature": "Usar Fahrenheit em vez de Celsius para temperatura"
},
"Use IP Location": {
"Use IP Location": ""
"Use IP Location": "Usar Localização do Endereço IP"
},
"Use Monospace Font": {
"Use Monospace Font": "Usar Fonte Monoespaçada"
@@ -1752,10 +1779,10 @@
"Use System Theme": "Usar Tema do Sistema"
},
"Use animated wave progress bars for media playback": {
"Use animated wave progress bars for media playback": ""
"Use animated wave progress bars for media playback": "Usar barras de progresso de ondas animadas para reprodução de mídia"
},
"Use automatic location detection (geoclue2)": {
"Use automatic location detection (geoclue2)": ""
"Use automatic location detection (geoclue2)": "Usar detecção automática de localização (geoclue2)"
},
"Use custom command for update your system": {
"Use custom command for update your system": "Usar comando personalizado para atualizar seu sistema"
@@ -1794,7 +1821,7 @@
"VPN status and quick connect": "Status de VPN e conexão rápida"
},
"Vibrant palette with playful saturation.": {
"Vibrant palette with playful saturation.": ""
"Vibrant palette with playful saturation.": "Paleta vibrante com saturação divertida."
},
"Visibility": {
"Visibility": "Visibilidade"
@@ -1809,16 +1836,16 @@
"Volume Changed": "Volume Alterado"
},
"Volume, brightness, and other system OSDs": {
"Volume, brightness, and other system OSDs": ""
"Volume, brightness, and other system OSDs": "Volume, brilho, e outros OSDs do sistema"
},
"Wallpaper": {
"Wallpaper": "Papel de parede"
},
"Wallpaper Monitor": {
"Wallpaper Monitor": ""
"Wallpaper Monitor": "Monitor do Papel de Parede"
},
"Wallpapers": {
"Wallpapers": ""
"Wallpapers": "Papéis de parede"
},
"Wave Progress Bars": {
"Wave Progress Bars": "Barra de Progresso de Ondas"
@@ -1830,16 +1857,16 @@
"Weather Widget": "Widget de Clima"
},
"Website:": {
"Website:": ""
"Website:": "Website:"
},
"When enabled, apps are sorted alphabetically. When disabled, apps are sorted by usage frequency.": {
"When enabled, apps are sorted alphabetically. When disabled, apps are sorted by usage frequency.": "Quando ativado, apps são ordenados alfabeticamente. Quando desativado, apps são ordenados por frequência de uso"
"When enabled, apps are sorted alphabetically. When disabled, apps are sorted by usage frequency.": "Quando ativado, apps são ordenados alfabeticamente. Quando desativado, apps são ordenados por frequência de uso."
},
"WiFi disabled": {
"WiFi disabled": ""
"WiFi disabled": "WiFi desativado"
},
"WiFi enabled": {
"WiFi enabled": ""
"WiFi enabled": "Wifi ativado"
},
"WiFi is off": {
"WiFi is off": "WiFi desligado"
@@ -1857,7 +1884,7 @@
"Wind": "Vento"
},
"Window Scrolling": {
"Window Scrolling": ""
"Window Scrolling": "Rolagem de Janelas"
},
"Workspace": {
"Workspace": "Área de Trabalho"
@@ -1932,7 +1959,7 @@
"• ddd - Day name (Mon)": "ddd - Nome do dia (seg)"
},
"• dddd - Day name (Monday)": {
"• dddd - Day name (Monday)": "dddd - Nome do dia (segunda-feira)\n"
"• dddd - Day name (Monday)": "dddd - Nome do dia (segunda-feira)"
},
"• yy - Year (24)": {
"• yy - Year (24)": "yy - Ano (24)"

View File

@@ -138,13 +138,13 @@
"Audio Output Devices (": "Ses Çıkış Aygıtları ("
},
"Authenticate": {
"Authenticate": ""
"Authenticate": "Kimlik Doğrula"
},
"Authentication Required": {
"Authentication Required": ""
"Authentication Required": "Kimlik Doğrulama Gerekli"
},
"Authentication failed, please try again": {
"Authentication failed, please try again": ""
"Authentication failed, please try again": "Kimlik doğrulama başarısız, lütfen tekrar deneyin"
},
"Authorize": {
"Authorize": "Yetkilendir"
@@ -173,6 +173,12 @@
"Auto-saving...": {
"Auto-saving...": "Otomatik kaydetme..."
},
"Autoconnect disabled": {
"Autoconnect disabled": ""
},
"Autoconnect enabled": {
"Autoconnect enabled": ""
},
"Automatic Control": {
"Automatic Control": "Otomatik Kontrol"
},
@@ -347,6 +353,9 @@
"Color Picker": {
"Color Picker": "Renk Seçici"
},
"Color temperature for day time": {
"Color temperature for day time": "Gündüz için renk sıcaklığı"
},
"Color temperature for night mode": {
"Color temperature for night mode": "Gece modu için renk sıcaklığı"
},
@@ -492,7 +501,7 @@
"Daily at:": "Her gün saat:"
},
"Dank": {
"Dank": ""
"Dank": "Dank"
},
"Dank Bar": {
"Dank Bar": "Dank Bar"
@@ -512,9 +521,15 @@
"DankSearch not available": {
"DankSearch not available": "DankSearch kullanılamıyor"
},
"Dark Mode": {
"Dark Mode": ""
},
"Date Format": {
"Date Format": "Tarih Biçimi"
},
"Day Temperature": {
"Day Temperature": "Gündüz Sıcaklığı"
},
"Default": {
"Default": "Varsayılan"
},
@@ -539,6 +554,9 @@
"Device paired": {
"Device paired": "Cihaz eşleştirildi"
},
"Disable Autoconnect": {
"Disable Autoconnect": ""
},
"Disconnect": {
"Disconnect": "Bağlantıyı Kes"
},
@@ -614,6 +632,9 @@
"Empty": {
"Empty": "Boş"
},
"Enable Autoconnect": {
"Enable Autoconnect": ""
},
"Enable GPU Temperature": {
"Enable GPU Temperature": "GPU Sıcaklığını Etkinleştir"
},
@@ -710,6 +731,9 @@
"Failed to start connection to ": {
"Failed to start connection to ": "Bağlantı başlatılamadı "
},
"Failed to update autoconnect": {
"Failed to update autoconnect": ""
},
"Feels Like": {
"Feels Like": "Hissedilen"
},
@@ -1085,6 +1109,9 @@
"Night Mode": {
"Night Mode": "Gece Modu"
},
"Night Temperature": {
"Night Temperature": "Gece Sıcaklığı"
},
"No Active Players": {
"No Active Players": "Aktif Oynatıcı Yok"
},
@@ -1470,7 +1497,7 @@
"Shift+Del: Clear All • Esc: Close": "Shift+Del: Tümünü Temizle • Esc: Kapat"
},
"Show All Tags": {
"Show All Tags": ""
"Show All Tags": "Tüm Etiketleri Göster"
},
"Show Confirmation on Power Actions": {
"Show Confirmation on Power Actions": "Güç Eylemlerinde Onay Göster"
@@ -1488,7 +1515,7 @@
"Show Workspace Apps": "Çalışma Alanı Uygulamalarını Göster"
},
"Show all 9 tags instead of only occupied tags (DWL only)": {
"Show all 9 tags instead of only occupied tags (DWL only)": ""
"Show all 9 tags instead of only occupied tags (DWL only)": "Sadece dolu etiketleri değil, tüm 9 etiketi göster (sadece DWL)"
},
"Show on Last Display": {
"Show on Last Display": "Son Ekranda Göster"

View File

@@ -173,6 +173,12 @@
"Auto-saving...": {
"Auto-saving...": "自动保存中..."
},
"Autoconnect disabled": {
"Autoconnect disabled": ""
},
"Autoconnect enabled": {
"Autoconnect enabled": ""
},
"Automatic Control": {
"Automatic Control": "自动切换"
},
@@ -347,6 +353,9 @@
"Color Picker": {
"Color Picker": "取色器"
},
"Color temperature for day time": {
"Color temperature for day time": "白天色温"
},
"Color temperature for night mode": {
"Color temperature for night mode": "夜间模式色温"
},
@@ -512,9 +521,15 @@
"DankSearch not available": {
"DankSearch not available": "DankSearch 不可用"
},
"Dark Mode": {
"Dark Mode": "暗色模式"
},
"Date Format": {
"Date Format": "日期格式"
},
"Day Temperature": {
"Day Temperature": "白天温度"
},
"Default": {
"Default": "默认"
},
@@ -539,6 +554,9 @@
"Device paired": {
"Device paired": "设备已配对"
},
"Disable Autoconnect": {
"Disable Autoconnect": ""
},
"Disconnect": {
"Disconnect": "断开连接"
},
@@ -614,6 +632,9 @@
"Empty": {
"Empty": "空"
},
"Enable Autoconnect": {
"Enable Autoconnect": ""
},
"Enable GPU Temperature": {
"Enable GPU Temperature": "显示 GPU 温度"
},
@@ -710,6 +731,9 @@
"Failed to start connection to ": {
"Failed to start connection to ": "无法启动连接至 "
},
"Failed to update autoconnect": {
"Failed to update autoconnect": ""
},
"Feels Like": {
"Feels Like": "体感温度"
},
@@ -1085,6 +1109,9 @@
"Night Mode": {
"Night Mode": "夜间模式"
},
"Night Temperature": {
"Night Temperature": "晚间温度"
},
"No Active Players": {
"No Active Players": "没有正在播放的音频"
},

View File

@@ -138,13 +138,13 @@
"Audio Output Devices (": "音訊輸出設備 ("
},
"Authenticate": {
"Authenticate": ""
"Authenticate": "驗證"
},
"Authentication Required": {
"Authentication Required": ""
"Authentication Required": "需要驗證"
},
"Authentication failed, please try again": {
"Authentication failed, please try again": ""
"Authentication failed, please try again": "驗證失敗,請重試"
},
"Authorize": {
"Authorize": "授權"
@@ -173,6 +173,12 @@
"Auto-saving...": {
"Auto-saving...": "自動保存..."
},
"Autoconnect disabled": {
"Autoconnect disabled": ""
},
"Autoconnect enabled": {
"Autoconnect enabled": ""
},
"Automatic Control": {
"Automatic Control": "自動控制"
},
@@ -347,8 +353,11 @@
"Color Picker": {
"Color Picker": "顏色選擇器"
},
"Color temperature for day time": {
"Color temperature for day time": "白天螢幕的顏色溫度"
},
"Color temperature for night mode": {
"Color temperature for night mode": "夜晚模式色溫"
"Color temperature for night mode": "夜晚螢幕的顏色溫"
},
"Colorful mix of bright contrasting accents.": {
"Colorful mix of bright contrasting accents.": "明亮對比點綴的繽紛組合。"
@@ -512,9 +521,15 @@
"DankSearch not available": {
"DankSearch not available": "DankSearch 不可用"
},
"Dark Mode": {
"Dark Mode": ""
},
"Date Format": {
"Date Format": "日期格式"
},
"Day Temperature": {
"Day Temperature": "日間色溫"
},
"Default": {
"Default": "預設"
},
@@ -539,6 +554,9 @@
"Device paired": {
"Device paired": "裝置已配對"
},
"Disable Autoconnect": {
"Disable Autoconnect": ""
},
"Disconnect": {
"Disconnect": "斷開連接"
},
@@ -614,6 +632,9 @@
"Empty": {
"Empty": "空白"
},
"Enable Autoconnect": {
"Enable Autoconnect": ""
},
"Enable GPU Temperature": {
"Enable GPU Temperature": "啟用 GPU 溫度"
},
@@ -710,6 +731,9 @@
"Failed to start connection to ": {
"Failed to start connection to ": "無法啟動連線到 "
},
"Failed to update autoconnect": {
"Failed to update autoconnect": ""
},
"Feels Like": {
"Feels Like": "體感溫度"
},
@@ -1085,6 +1109,9 @@
"Night Mode": {
"Night Mode": "夜晚模式"
},
"Night Temperature": {
"Night Temperature": "夜間色溫"
},
"No Active Players": {
"No Active Players": "無播放器"
},

View File

@@ -398,6 +398,20 @@
"reference": "",
"comment": ""
},
{
"term": "Autoconnect disabled",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Autoconnect enabled",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Automatic Control",
"translation": "",
@@ -804,6 +818,13 @@
"reference": "",
"comment": ""
},
{
"term": "Color temperature for day time",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Color temperature for night mode",
"translation": "",
@@ -1168,6 +1189,13 @@
"reference": "",
"comment": ""
},
{
"term": "Dark Mode",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Date Format",
"translation": "",
@@ -1175,6 +1203,13 @@
"reference": "",
"comment": ""
},
{
"term": "Day Temperature",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Default",
"translation": "",
@@ -1231,6 +1266,13 @@
"reference": "",
"comment": ""
},
{
"term": "Disable Autoconnect",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Disconnect",
"translation": "",
@@ -1406,6 +1448,13 @@
"reference": "",
"comment": ""
},
{
"term": "Enable Autoconnect",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Enable GPU Temperature",
"translation": "",
@@ -1630,6 +1679,13 @@
"reference": "",
"comment": ""
},
{
"term": "Failed to update autoconnect",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Feels Like",
"translation": "",
@@ -2477,6 +2533,13 @@
"reference": "",
"comment": ""
},
{
"term": "Night Temperature",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "No Active Players",
"translation": "",
@@ -3744,13 +3807,6 @@
"reference": "",
"comment": ""
},
{
"term": "Temperature",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Terminal custom additional parameters",
"translation": "",