mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2025-12-06 05:25:41 -05:00
Compare commits
67 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
71a7ebbfe2 | ||
|
|
d6d701c722 | ||
|
|
43fbbc07f5 | ||
|
|
8504144c32 | ||
|
|
1d3e59b5dd | ||
|
|
3f70ca3506 | ||
|
|
3640d8bd24 | ||
|
|
706a99817f | ||
|
|
4645b2dcab | ||
|
|
13f1673371 | ||
|
|
7d374c4c2a | ||
|
|
5ed449773c | ||
|
|
aef9c2269a | ||
|
|
daa5a3e821 | ||
|
|
5cd1167b28 | ||
|
|
21e7ae3dfd | ||
|
|
5d40138585 | ||
|
|
893fd820a3 | ||
|
|
2d536d99e5 | ||
|
|
a0ee4792b9 | ||
|
|
a8f6880840 | ||
|
|
51296d1d44 | ||
|
|
0f29149014 | ||
|
|
b9f0c277ec | ||
|
|
69964c9704 | ||
|
|
ff1d38e34f | ||
|
|
3abee7f2f5 | ||
|
|
ed0b80008f | ||
|
|
976ff108b3 | ||
|
|
66e3cc77c5 | ||
|
|
229abba1e4 | ||
|
|
8dacaf84cc | ||
|
|
102b185572 | ||
|
|
52ac474f7d | ||
|
|
c0064cfcfa | ||
|
|
414ce5610d | ||
|
|
113ac42814 | ||
|
|
a2f2eef326 | ||
|
|
54a69a6101 | ||
|
|
5e2d3c8d7d | ||
|
|
5a9950a7c3 | ||
|
|
2aadbc1a61 | ||
|
|
749414ab65 | ||
|
|
baaebcd413 | ||
|
|
5a8a60b15d | ||
|
|
f0ddb8db49 | ||
|
|
baa12c0161 | ||
|
|
ca226e98c2 | ||
|
|
453079ef1f | ||
|
|
074aea2c35 | ||
|
|
9cf5f0b9b3 | ||
|
|
89e12eea29 | ||
|
|
03d4caff8f | ||
|
|
89d54dedb7 | ||
|
|
9a9e62ccd3 | ||
|
|
eca38ae920 | ||
|
|
84e89599bf | ||
|
|
e1cdf4ed50 | ||
|
|
e4371ea4fc | ||
|
|
9c45d13cbf | ||
|
|
5f22347d7a | ||
|
|
ca786a3567 | ||
|
|
60ce662d49 | ||
|
|
4f9b0d8925 | ||
|
|
9c2fc570e6 | ||
|
|
0ba982b271 | ||
|
|
ff3123e387 |
6
.github/workflows/copr-release.yml
vendored
6
.github/workflows/copr-release.yml
vendored
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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") {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
@@ -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.)
|
||||
|
||||
@@ -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
823
README.md
@@ -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/)
|
||||
|
||||
[](https://danklinux.com/docs)
|
||||
[](https://github.com/AvengeMedia/DankMaterialShell/stargazers)
|
||||
[](https://github.com/AvengeMedia/DankMaterialShell/blob/master/LICENSE)
|
||||
[](https://github.com/AvengeMedia/DankMaterialShell/releases)
|
||||
[](https://github.com/AvengeMedia/DankMaterialShell/commits/master)
|
||||
[](https://aur.archlinux.org/packages/dms-shell-bin)
|
||||
[)](https://aur.archlinux.org/packages/dms-shell-git)
|
||||
[](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
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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 => {
|
||||
|
||||
@@ -283,4 +283,10 @@ Singleton {
|
||||
activeService.cancelCredentials(token)
|
||||
}
|
||||
}
|
||||
|
||||
function setWifiAutoconnect(ssid, autoconnect) {
|
||||
if (activeService && activeService.setWifiAutoconnect) {
|
||||
activeService.setWifiAutoconnect(ssid, autoconnect)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
}
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
@@ -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.
80
Widgets/AppIconRenderer.qml
Normal file
80
Widgets/AppIconRenderer.qml
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
||||
104
Widgets/AppLauncherGridDelegate.qml
Normal file
104
Widgets/AppLauncherGridDelegate.qml
Normal 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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
114
Widgets/AppLauncherListDelegate.qml
Normal file
114
Widgets/AppLauncherListDelegate.qml
Normal 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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
113
assets/danklogo2.svg
Normal 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 |
@@ -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
|
||||
@@ -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 }}}
|
||||
@@ -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 }}}
|
||||
@@ -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);
|
||||
|
||||
3
matugen/configs/alacritty.toml
Normal file
3
matugen/configs/alacritty.toml
Normal file
@@ -0,0 +1,3 @@
|
||||
[templates.dmsalacritty]
|
||||
input_path = './matugen/templates/alacritty.toml'
|
||||
output_path = '~/.config/alacritty/dank-theme.toml'
|
||||
3
matugen/configs/foot.toml
Normal file
3
matugen/configs/foot.toml
Normal file
@@ -0,0 +1,3 @@
|
||||
[templates.dmsfoot]
|
||||
input_path = './matugen/templates/foot.ini'
|
||||
output_path = '~/.config/foot/dank-colors.ini'
|
||||
@@ -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'
|
||||
|
||||
13
matugen/configs/vscode.toml
Normal file
13
matugen/configs/vscode.toml
Normal 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'
|
||||
@@ -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}")
|
||||
11
matugen/templates/alacritty.toml
Normal file
11
matugen/templates/alacritty.toml
Normal 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}}'
|
||||
5
matugen/templates/foot.ini
Normal file
5
matugen/templates/foot.ini
Normal 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}}
|
||||
316
matugen/templates/vscode-color-theme.json
Normal file
316
matugen/templates/vscode-color-theme.json
Normal 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}}"
|
||||
}
|
||||
}
|
||||
}
|
||||
31
matugen/templates/vscode-package.json
Normal file
31
matugen/templates/vscode-package.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
20
matugen/templates/vscode-vsixmanifest.xml
Normal file
20
matugen/templates/vscode-vsixmanifest.xml
Normal 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>
|
||||
@@ -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))
|
||||
@@ -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")"
|
||||
|
||||
@@ -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": ""
|
||||
},
|
||||
{
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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": "アクティブプレイヤーなし"
|
||||
},
|
||||
|
||||
@@ -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)"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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": "没有正在播放的音频"
|
||||
},
|
||||
|
||||
@@ -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": "無播放器"
|
||||
},
|
||||
|
||||
@@ -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": "",
|
||||
|
||||
Reference in New Issue
Block a user