From b11c84945d02598bcddf9259db8ff92ca9e3cfbf Mon Sep 17 00:00:00 2001 From: Yaroslav de la Peña Smirnov Date: Sat, 2 May 2026 15:22:24 +0300 Subject: try out noctalia shell --- dotfiles/.config/noctalia/colors.json | 18 + .../.config/noctalia/colorschemes/ADW/ADW.json | 94 +++ .../noctalia/colorschemes/Breeze/Breeze.json | 94 +++ .../colorschemes/Osaka jade/Osaka jade.json | 94 +++ .../.config/noctalia/colorschemes/Peche/Peche.json | 94 +++ .../noctalia/colorschemes/Vesper/Vesper.json | 94 +++ dotfiles/.config/noctalia/plugins.json | 16 + .../plugins/file-search/LauncherProvider.qml | 448 ++++++++++++ .../.config/noctalia/plugins/file-search/Main.qml | 68 ++ .../.config/noctalia/plugins/file-search/README.md | 25 + .../noctalia/plugins/file-search/Settings.qml | 142 ++++ .../noctalia/plugins/file-search/i18n/en.json | 55 ++ .../noctalia/plugins/file-search/i18n/fr.json | 55 ++ .../noctalia/plugins/file-search/i18n/zh-CN.json | 55 ++ .../noctalia/plugins/file-search/i18n/zh-TW.json | 55 ++ .../noctalia/plugins/file-search/manifest.json | 31 + .../noctalia/plugins/file-search/preview.png | Bin 0 -> 988330 bytes dotfiles/.config/noctalia/settings.json | 760 +++++++++++++++++++++ dotfiles/.config/noctalia/user-templates.toml | 17 + 19 files changed, 2215 insertions(+) create mode 100644 dotfiles/.config/noctalia/colors.json create mode 100644 dotfiles/.config/noctalia/colorschemes/ADW/ADW.json create mode 100644 dotfiles/.config/noctalia/colorschemes/Breeze/Breeze.json create mode 100644 dotfiles/.config/noctalia/colorschemes/Osaka jade/Osaka jade.json create mode 100644 dotfiles/.config/noctalia/colorschemes/Peche/Peche.json create mode 100644 dotfiles/.config/noctalia/colorschemes/Vesper/Vesper.json create mode 100644 dotfiles/.config/noctalia/plugins.json create mode 100644 dotfiles/.config/noctalia/plugins/file-search/LauncherProvider.qml create mode 100644 dotfiles/.config/noctalia/plugins/file-search/Main.qml create mode 100644 dotfiles/.config/noctalia/plugins/file-search/README.md create mode 100644 dotfiles/.config/noctalia/plugins/file-search/Settings.qml create mode 100644 dotfiles/.config/noctalia/plugins/file-search/i18n/en.json create mode 100644 dotfiles/.config/noctalia/plugins/file-search/i18n/fr.json create mode 100644 dotfiles/.config/noctalia/plugins/file-search/i18n/zh-CN.json create mode 100644 dotfiles/.config/noctalia/plugins/file-search/i18n/zh-TW.json create mode 100644 dotfiles/.config/noctalia/plugins/file-search/manifest.json create mode 100644 dotfiles/.config/noctalia/plugins/file-search/preview.png create mode 100644 dotfiles/.config/noctalia/settings.json create mode 100644 dotfiles/.config/noctalia/user-templates.toml (limited to 'dotfiles/.config/noctalia') diff --git a/dotfiles/.config/noctalia/colors.json b/dotfiles/.config/noctalia/colors.json new file mode 100644 index 0000000..614161b --- /dev/null +++ b/dotfiles/.config/noctalia/colors.json @@ -0,0 +1,18 @@ +{ + "mError": "#ff8080", + "mHover": "#282828", + "mOnError": "#000000", + "mOnHover": "#ffffff", + "mOnPrimary": "#000000", + "mOnSecondary": "#000000", + "mOnSurface": "#ffffff", + "mOnSurfaceVariant": "#a0a0a0", + "mOnTertiary": "#000000", + "mOutline": "#505050", + "mPrimary": "#ffc799", + "mSecondary": "#99ffe4", + "mShadow": "#000000", + "mSurface": "#0c0c0c", + "mSurfaceVariant": "#1c1c1c", + "mTertiary": "#fbadff" +} diff --git a/dotfiles/.config/noctalia/colorschemes/ADW/ADW.json b/dotfiles/.config/noctalia/colorschemes/ADW/ADW.json new file mode 100644 index 0000000..272cd92 --- /dev/null +++ b/dotfiles/.config/noctalia/colorschemes/ADW/ADW.json @@ -0,0 +1,94 @@ +{ + "dark": { + "mPrimary": "#3584e4", + "mOnPrimary": "#ffffff", + "mSecondary": "#1b467c", + "mOnSecondary": "#ffffff", + "mTertiary": "#ffffff", + "mOnTertiary": "#2e3436", + "mError": "#c01c28", + "mOnError": "#ffffff", + "mSurface": "#242424", + "mOnSurface": "#ffffff", + "mHover": "#3584e4", + "mOnHover": "#ffffff", + "mSurfaceVariant": "#1e1e1e", + "mOnSurfaceVariant": "#ffffff", + "mOutline": "#3d3846", + "mShadow": "#000000", + "terminal": { + "background": "#1e1e1e", + "foreground": "#ffffff", + "cursor": "#3584e4", + "cursorText": "#ffffff", + "selectionBg": "#3584e4", + "selectionFg": "#ffffff", + "normal": { + "black": "#241f31", + "red": "#c01c28", + "green": "#2ec27e", + "yellow": "#f5c211", + "blue": "#1e78e4", + "magenta": "#9841bb", + "cyan": "#0ab9dc", + "white": "#c0bfbc" + }, + "bright": { + "black": "#5e5c64", + "red": "#ed333b", + "green": "#57e389", + "yellow": "#f8e45c", + "blue": "#51a1ff", + "magenta": "#c061cb", + "cyan": "#4fd2fd", + "white": "#ffffff" + } + } + }, + "light": { + "mPrimary": "#3584e4", + "mOnPrimary": "#ffffff", + "mSecondary": "#2e3436", + "mOnSecondary": "#ffffff", + "mTertiary": "#2ec27e", + "mOnTertiary": "#ffffff", + "mError": "#e01b24", + "mOnError": "#ffffff", + "mSurface": "#fafafa", + "mOnSurface": "#2e3436", + "mHover": "#3584e4", + "mOnHover": "#ffffff", + "mSurfaceVariant": "#ffffff", + "mOnSurfaceVariant": "#2e3436", + "mOutline": "#d6d6d6", + "mShadow": "#000000", + "terminal": { + "background": "#ffffff", + "foreground": "#2e3436", + "cursor": "#3584e4", + "cursorText": "#ffffff", + "selectionBg": "#3584e4", + "selectionFg": "#ffffff", + "normal": { + "black": "#171421", + "red": "#c01c28", + "green": "#26a269", + "yellow": "#a2734c", + "blue": "#12488b", + "magenta": "#a347ba", + "cyan": "#2aa1b3", + "white": "#d0cfcc" + }, + "bright": { + "black": "#5e5c64", + "red": "#f66151", + "green": "#33d17a", + "yellow": "#e5a50a", + "blue": "#3584e4", + "magenta": "#c061cb", + "cyan": "#33c7de", + "white": "#ffffff" + } + } + } +} diff --git a/dotfiles/.config/noctalia/colorschemes/Breeze/Breeze.json b/dotfiles/.config/noctalia/colorschemes/Breeze/Breeze.json new file mode 100644 index 0000000..68988b9 --- /dev/null +++ b/dotfiles/.config/noctalia/colorschemes/Breeze/Breeze.json @@ -0,0 +1,94 @@ +{ + "dark": { + "mPrimary": "#3daee9", + "mOnPrimary": "#141618", + "mSecondary": "#1d99f3", + "mOnSecondary": "#141618", + "mTertiary": "#9b59b6", + "mOnTertiary": "#141618", + "mError": "#da4453", + "mOnError": "#141618", + "mSurface": "#202224", + "mOnSurface": "#fcfcfc", + "mHover": "#3daee9", + "mOnHover": "#141618", + "mSurfaceVariant": "#292d32", + "mOnSurfaceVariant": "#a1a9b1", + "mOutline": "#707d8a", + "mShadow": "#272c31", + "terminal": { + "background": "#232627", + "foreground": "#fcfcfc", + "cursor": "#3daee9", + "cursorText": "#232627", + "selectionBg": "#3daee9", + "selectionFg": "#ffffff", + "normal": { + "black": "#232627", + "red": "#ed1515", + "green": "#11d116", + "yellow": "#f67400", + "blue": "#1d99f3", + "magenta": "#9b59b6", + "cyan": "#1abc9c", + "white": "#fcfcfc" + }, + "bright": { + "black": "#7f8c8d", + "red": "#c0392b", + "green": "#1cdc9a", + "yellow": "#fdbc4b", + "blue": "#3daee9", + "magenta": "#8e44ad", + "cyan": "#16a085", + "white": "#ffffff" + } + } + }, + "light": { + "mPrimary": "#3daee9", + "mOnPrimary": "#ffffff", + "mSecondary": "#2980b9", + "mOnSecondary": "#ffffff", + "mTertiary": "#9b59b6", + "mOnTertiary": "#ffffff", + "mError": "#da4453", + "mOnError": "#ffffff", + "mSurface": "#ffffff", + "mOnSurface": "#232629", + "mHover": "#3daee9", + "mOnHover": "#ffffff", + "mSurfaceVariant": "#eff0f1", + "mOnSurfaceVariant": "#707d8a", + "mOutline": "#e3e5e7", + "mShadow": "#e3e5e7", + "terminal": { + "background": "#ebe8e4", + "foreground": "#383e3f", + "cursor": "#383e3f", + "cursorText": "#ebe8e4", + "selectionBg": "#383e3f", + "selectionFg": "#ebe8e4", + "normal": { + "black": "#383e3f", + "red": "#cd5c60", + "green": "#39855f", + "yellow": "#b87e3c", + "blue": "#2683b5", + "magenta": "#845a84", + "cyan": "#48a9a9", + "white": "#c9c2bd" + }, + "bright": { + "black": "#7d8468", + "red": "#ef6787", + "green": "#3e594e", + "yellow": "#d1832e", + "blue": "#4f9cb8", + "magenta": "#605db3", + "cyan": "#008b8b", + "white": "#60696b" + } + } + } +} \ No newline at end of file diff --git a/dotfiles/.config/noctalia/colorschemes/Osaka jade/Osaka jade.json b/dotfiles/.config/noctalia/colorschemes/Osaka jade/Osaka jade.json new file mode 100644 index 0000000..0e450fa --- /dev/null +++ b/dotfiles/.config/noctalia/colorschemes/Osaka jade/Osaka jade.json @@ -0,0 +1,94 @@ +{ + "dark": { + "mPrimary": "#1E9177", + "mOnPrimary": "#B8C8C4", + "mSecondary": "#167A63", + "mOnSecondary": "#B8C8C4", + "mTertiary": "#26A589", + "mOnTertiary": "#B8C8C4", + "mError": "#933636", + "mOnError": "#B8C8C4", + "mSurface": "#081512", + "mOnSurface": "#A6B5B1", + "mSurfaceVariant": "#0F251F", + "mOnSurfaceVariant": "#99A8A4", + "mOutline": "#1B6352", + "mShadow": "#040A09", + "mHover": "#26A589", + "mOnHover": "#B8C8C4", + "terminal": { + "cursorText": "#141b1e", + "cursor": "#dadada", + "foreground": "#dadada", + "background": "#141b1e", + "selectionFg": "#dadada", + "selectionBg": "#141b1e", + "normal": { + "black": "#232a2d", + "red": "#e57474", + "green": "#8ccf7e", + "yellow": "#e5c76b", + "blue": "#67b0e8", + "magenta": "#c47fd5", + "cyan": "#6cbfbf", + "white": "#b3b9b8" + }, + "bright": { + "black": "#464e50", + "red": "#ef7e7e", + "green": "#96d988", + "yellow": "#f4d67a", + "blue": "#71baf2", + "magenta": "#ce89df", + "cyan": "#67cbe7", + "white": "#bdc3c2" + } + } + }, + "light": { + "mPrimary": "#3B7561", + "mOnPrimary": "#D8E5DB", + "mSecondary": "#526E4A", + "mOnSecondary": "#D8E5DB", + "mTertiary": "#4A8069", + "mOnTertiary": "#D8E5DB", + "mError": "#854145", + "mOnError": "#D8E5DB", + "mSurface": "#AEC2B4", + "mOnSurface": "#2C3D35", + "mSurfaceVariant": "#95AD9C", + "mOnSurfaceVariant": "#263731", + "mOutline": "#5C7A6A", + "mShadow": "#8A9E90", + "mHover": "#4A8069", + "mOnHover": "#D8E5DB", + "terminal": { + "foreground": "#5c6a72", + "background": "#efebd4", + "selectionFg": "#5c6a72", + "selectionBg": "#eaedc8", + "cursorText": "#eaedc8", + "cursor": "#f57d26", + "normal": { + "black": "#7a8478", + "red": "#e67e80", + "green": "#9ab373", + "yellow": "#c1a266", + "blue": "#7fbbb3", + "magenta": "#d699b6", + "cyan": "#83c092", + "white": "#b2af9f" + }, + "bright": { + "black": "#a6b0a0", + "red": "#f85552", + "green": "#8da101", + "yellow": "#dfa000", + "blue": "#3a94c5", + "magenta": "#df69ba", + "cyan": "#35a77c", + "white": "#fffbef" + } + } + } +} diff --git a/dotfiles/.config/noctalia/colorschemes/Peche/Peche.json b/dotfiles/.config/noctalia/colorschemes/Peche/Peche.json new file mode 100644 index 0000000..cfcfba2 --- /dev/null +++ b/dotfiles/.config/noctalia/colorschemes/Peche/Peche.json @@ -0,0 +1,94 @@ +{ + "dark": { + "mPrimary": "#9DD2C0", + "mOnPrimary": "#0e1214", + "mSecondary": "#FADDD2", + "mOnSecondary": "#0e1214", + "mTertiary": "#E8B8A8", + "mOnTertiary": "#0e1214", + "mError": "#A7CCE1", + "mOnError": "#0e1214", + "mSurface": "#0e1214", + "mOnSurface": "#ABBCC4", + "mSurfaceVariant": "#192024", + "mOnSurfaceVariant": "#DBE2E6", + "mOutline": "#212B30", + "mShadow": "#000000", + "mHover": "#E8B8A8", + "mOnHover": "#0e1214", + "terminal": { + "normal": { + "black": "#0e1214", + "red": "#E8B8A8", + "green": "#9DD2C0", + "yellow": "#C7E5DB", + "blue": "#A7CCE1", + "magenta": "#B4E1E4", + "cyan": "#FADDD2", + "white": "#ABBCC4" + }, + "bright": { + "black": "#151c1e", + "red": "#E8B8A8", + "green": "#9DD2C0", + "yellow": "#C7E5DB", + "blue": "#A7CCE1", + "magenta": "#B4E1E4", + "cyan": "#FADDD2", + "white": "#DBE2E6" + }, + "foreground": "#ABBCC4", + "background": "#0e1214", + "selectionFg": "#ABBCC4", + "selectionBg": "#212B30", + "cursorText": "#0e1214", + "cursor": "#ABBCC4" + } + }, + "light": { + "mPrimary": "#6DB09A", + "mOnPrimary": "#E5EDF0", + "mSecondary": "#EABCAE", + "mOnSecondary": "#E5EDF0", + "mTertiary": "#E0A990", + "mOnTertiary": "#E5EDF0", + "mError": "#7FAFC7", + "mOnError": "#E5EDF0", + "mSurface": "#E8EFF2", + "mOnSurface": "#738A92", + "mSurfaceVariant": "#CFD9DE", + "mOnSurfaceVariant": "#435860", + "mOutline": "#C2CFD6", + "mShadow": "#B8C5D0", + "mHover": "#D68F6E", + "mOnHover": "#E5EDF0", + "terminal": { + "normal": { + "black": "#E8EFF2", + "red": "#D68F6E", + "green": "#5AA68D", + "yellow": "#6DB09A", + "blue": "#74A8C2", + "magenta": "#E8B8A8", + "cyan": "#A7CCE1", + "white": "#738A92" + }, + "bright": { + "black": "#CFD9DE", + "red": "#D68F6E", + "green": "#5AA68D", + "yellow": "#6DB09A", + "blue": "#74A8C2", + "magenta": "#E8B8A8", + "cyan": "#A7CCE1", + "white": "#435860" + }, + "foreground": "#738A92", + "background": "#E8EFF2", + "selectionFg": "#738A92", + "selectionBg": "#C2CFD6", + "cursorText": "#E8EFF2", + "cursor": "#738A92" + } + } +} \ No newline at end of file diff --git a/dotfiles/.config/noctalia/colorschemes/Vesper/Vesper.json b/dotfiles/.config/noctalia/colorschemes/Vesper/Vesper.json new file mode 100644 index 0000000..07e9a84 --- /dev/null +++ b/dotfiles/.config/noctalia/colorschemes/Vesper/Vesper.json @@ -0,0 +1,94 @@ +{ + "dark": { + "mPrimary": "#FFC799", + "mOnPrimary": "#000000", + "mSecondary": "#99FFE4", + "mOnSecondary": "#000000", + "mTertiary": "#FBADFF", + "mOnTertiary": "#000000", + "mError": "#FF8080", + "mOnError": "#000000", + "mSurface": "#0C0C0C", + "mOnSurface": "#FFFFFF", + "mSurfaceVariant": "#1C1C1C", + "mOnSurfaceVariant": "#A0A0A0", + "mOutline": "#505050", + "mShadow": "#000000", + "mHover": "#282828", + "mOnHover": "#FFFFFF", + "terminal": { + "foreground": "#FFFFFF", + "background": "#0C0C0C", + "normal": { + "black": "#0C0C0C", + "red": "#FF8080", + "green": "#99FFE4", + "yellow": "#FFC799", + "blue": "#80B3FF", + "magenta": "#FBADFF", + "cyan": "#99FFE4", + "white": "#A0A0A0" + }, + "bright": { + "black": "#505050", + "red": "#FF8080", + "green": "#99FFE4", + "yellow": "#FFC799", + "blue": "#80B3FF", + "magenta": "#FBADFF", + "cyan": "#99FFE4", + "white": "#FFFFFF" + }, + "cursor": "#FFFFFF", + "cursorText": "#000000", + "selectionFg": "#000000", + "selectionBg": "#FFC799" + } + }, + "light": { + "mPrimary": "#FFB170", + "mOnPrimary": "#0C0C0C", + "mSecondary": "#00CC99", + "mOnSecondary": "#0C0C0C", + "mTertiary": "#FBADFF", + "mOnTertiary": "#0C0C0C", + "mError": "#FF8080", + "mOnError": "#0C0C0C", + "mSurface": "#F2F2F2", + "mOnSurface": "#0C0C0C", + "mSurfaceVariant": "#E5E5E5", + "mOnSurfaceVariant": "#282828", + "mOutline": "#505050", + "mShadow": "#D9D9D9", + "mHover": "#E0E0E0", + "mOnHover": "#0C0C0C", + "terminal": { + "foreground": "#0C0C0C", + "background": "#F2F2F2", + "normal": { + "black": "#F2F2F2", + "red": "#FF8080", + "green": "#00CC99", + "yellow": "#FFC799", + "blue": "#004A77", + "magenta": "#FBADFF", + "cyan": "#006B57", + "white": "#505050" + }, + "bright": { + "black": "#A0A0A0", + "red": "#FF8080", + "green": "#00CC99", + "yellow": "#FFC799", + "blue": "#80B3FF", + "magenta": "#FBADFF", + "cyan": "#99FFE4", + "white": "#0C0C0C" + }, + "cursor": "#0C0C0C", + "cursorText": "#F2F2F2", + "selectionFg": "#F2F2F2", + "selectionBg": "#FFC799" + } + } +} diff --git a/dotfiles/.config/noctalia/plugins.json b/dotfiles/.config/noctalia/plugins.json new file mode 100644 index 0000000..ae7f05a --- /dev/null +++ b/dotfiles/.config/noctalia/plugins.json @@ -0,0 +1,16 @@ +{ + "sources": [ + { + "enabled": true, + "name": "Noctalia Plugins", + "url": "https://github.com/noctalia-dev/noctalia-plugins" + } + ], + "states": { + "file-search": { + "enabled": true, + "sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins" + } + }, + "version": 2 +} diff --git a/dotfiles/.config/noctalia/plugins/file-search/LauncherProvider.qml b/dotfiles/.config/noctalia/plugins/file-search/LauncherProvider.qml new file mode 100644 index 0000000..3ca5e88 --- /dev/null +++ b/dotfiles/.config/noctalia/plugins/file-search/LauncherProvider.qml @@ -0,0 +1,448 @@ +import QtQuick +import Quickshell +import Quickshell.Io +import qs.Commons + +Item { + id: root + + property var pluginApi: null + + // Provider metadata + property string name: pluginApi?.tr("provider.name") + property var launcher: null + property bool handleSearch: false + property string supportedLayouts: "list" + property bool supportsAutoPaste: false + + // Search state + property var currentResults: [] + property string currentQuery: "" + property bool searching: false + property int nextRequestId: 0 + property int activeRequestId: 0 + property int fileProcessRequestId: 0 + property int dirProcessRequestId: 0 + property int pendingProcessCount: 0 + property bool currentRequestFailed: false + property var pendingResultsByType: ({ "files": [], "dirs": [] }) + property string fdCommandPath: "" + property bool fdAvailable: false + + // Settings shortcuts + property var cfg: pluginApi?.pluginSettings || ({}) + property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({}) + property bool showHidden: cfg.showHidden ?? defaults.showHidden ?? false + property int maxResults: cfg.maxResults ?? defaults.maxResults ?? 0 + property string fileOpener: cfg.fileOpener ?? defaults.fileOpener ?? "xdg-open" + property string fdCommand: cfg.fdCommand ?? defaults.fdCommand ?? "fd" + property string searchDirectory: cfg.searchDirectory ?? defaults.searchDirectory ?? "~" + + Process { + id: fileSearchProcess + running: false + + stdout: StdioCollector { + id: fileStdoutCollector + } + + stderr: StdioCollector { + id: fileStderrCollector + } + + onExited: function(exitCode) { + root.handleSearchProcessExit("files", fileProcessRequestId, exitCode, fileStdoutCollector.text, fileStderrCollector.text); + } + } + + Process { + id: dirSearchProcess + running: false + + stdout: StdioCollector { + id: dirStdoutCollector + } + + stderr: StdioCollector { + id: dirStderrCollector + } + + onExited: function(exitCode) { + root.handleSearchProcessExit("dirs", dirProcessRequestId, exitCode, dirStdoutCollector.text, dirStderrCollector.text); + } + } + + // Debounce timer for search + Timer { + id: searchDebouncer + interval: 300 + repeat: false + onTriggered: root.executeSearch(root.currentQuery) + } + + function init() { + Logger.i("FileSearch", "Initializing plugin"); + fdCommandPath = fdCommand; + fdAvailable = true; + Logger.i("FileSearch", "Using fd command:", fdCommandPath); + } + + function handleCommand(searchText) { + return searchText.startsWith(">file"); + } + + function commands() { + return [{ + "name": ">file", + "description": pluginApi?.tr("launcher.command.description"), + "icon": "file-search", + "isTablerIcon": true, + "isImage": false, + "onActivate": function() { + launcher.setSearchText(">file "); + } + }]; + } + + function getResults(searchText) { + if (!searchText.startsWith(">file")) { + return []; + } + + if (!fdAvailable) { + return [{ + "name": pluginApi?.tr("launcher.errors.fdNotFound.title"), + "description": pluginApi?.tr("launcher.errors.fdNotFound.description"), + "icon": "alert-circle", + "isTablerIcon": true, + "isImage": false, + "onActivate": function() {} + }]; + } + + var query = searchText.slice(5).trim(); + + if (query === "") { + return [{ + "name": pluginApi?.tr("launcher.prompts.emptyQuery.title"), + "description": pluginApi?.tr("launcher.prompts.emptyQuery.description", { "root": displaySearchDirectory() }), + "icon": "file-search", + "isTablerIcon": true, + "isImage": false, + "onActivate": function() {} + }]; + } + + if (query !== currentQuery) { + currentQuery = query; + activeRequestId = 0; + currentRequestFailed = false; + searching = true; + searchDebouncer.restart(); + + return [{ + "name": pluginApi?.tr("launcher.prompts.searching.title"), + "description": pluginApi?.tr("launcher.prompts.searching.description", { "query": query }), + "icon": "refresh", + "isTablerIcon": true, + "isImage": false, + "onActivate": function() {} + }]; + } + + if (searching) { + return [{ + "name": pluginApi?.tr("launcher.prompts.searching.title"), + "description": pluginApi?.tr("launcher.prompts.searching.description", { "query": query }), + "icon": "refresh", + "isTablerIcon": true, + "isImage": false, + "onActivate": function() {} + }]; + } + + return currentResults; + } + + function executeSearch(query) { + if (!fdAvailable || query === "") { + return; + } + + Logger.d("FileSearch", "Executing search for:", query); + + if (fileSearchProcess.running) { + fileSearchProcess.running = false; + } + if (dirSearchProcess.running) { + dirSearchProcess.running = false; + } + + var expandedDir = expandHomePath(searchDirectory); + + nextRequestId += 1; + var requestId = nextRequestId; + activeRequestId = requestId; + currentRequestFailed = false; + pendingProcessCount = 2; + pendingResultsByType = ({ "files": [], "dirs": [] }); + + var commonArgs = []; + + if (showHidden) { + commonArgs.push("--hidden"); + } + + if (maxResults > 0) { + commonArgs.push("--max-results", maxResults.toString()); + } + commonArgs.push("--base-directory", expandedDir); + commonArgs.push("--absolute-path"); + commonArgs.push("--color", "never"); + commonArgs.push(query); + + var fileArgs = ["--type", "f"].concat(commonArgs); + var dirArgs = ["--type", "d"].concat(commonArgs); + + fileProcessRequestId = requestId; + fileSearchProcess.command = [fdCommandPath].concat(fileArgs); + fileSearchProcess.running = true; + + dirProcessRequestId = requestId; + dirSearchProcess.command = [fdCommandPath].concat(dirArgs); + dirSearchProcess.running = true; + + Logger.d("FileSearch", "Running file command:", fdCommandPath, fileArgs.join(" ")); + Logger.d("FileSearch", "Running dir command:", fdCommandPath, dirArgs.join(" ")); + } + + function handleSearchProcessExit(kind, requestId, exitCode, stdoutText, stderrText) { + if (requestId !== activeRequestId || currentRequestFailed) { + return; + } + + if (exitCode !== 0) { + currentRequestFailed = true; + searching = false; + pendingProcessCount = 0; + Logger.e("FileSearch", "fd command failed with exit code:", exitCode); + Logger.e("FileSearch", "stderr:", stderrText); + currentResults = [{ + "name": pluginApi?.tr("launcher.errors.fdNotFound.title"), + "description": pluginApi?.tr("launcher.errors.fdNotFound.description"), + "icon": "alert-circle", + "isTablerIcon": true, + "onActivate": function() {} + }]; + if (launcher) { + launcher.updateResults(); + } + return; + } + + pendingResultsByType[kind] = parseRawPaths(stdoutText); + pendingProcessCount -= 1; + + if (pendingProcessCount <= 0) { + finalizeSearchResults(requestId); + } + } + + function finalizeSearchResults(requestId) { + if (requestId !== activeRequestId || currentRequestFailed) { + return; + } + + var results = []; + + for (var i = 0; i < pendingResultsByType.dirs.length; i++) { + results.push(formatFileEntry(pendingResultsByType.dirs[i], true)); + } + for (var j = 0; j < pendingResultsByType.files.length; j++) { + results.push(formatFileEntry(pendingResultsByType.files[j], false)); + } + + results = sortResults(results, currentQuery); + + if (maxResults > 0 && results.length > maxResults) { + results = results.slice(0, maxResults); + } + + if (results.length === 0) { + results.push({ + "name": pluginApi?.tr("launcher.prompts.noResults.title"), + "description": pluginApi?.tr("launcher.prompts.noResults.description", { "query": currentQuery }), + "icon": "file-off", + "isTablerIcon": true, + "isImage": false, + "onActivate": function() {} + }); + searching = false; + currentResults = results; + if (launcher) { + launcher.updateResults(); + } + return; + } + + searching = false; + currentResults = results; + Logger.d("FileSearch", "Found", results.length, "results"); + if (launcher) { + launcher.updateResults(); + } + } + + function parseRawPaths(output) { + var trimmed = output.trim(); + if (trimmed === "") { + return []; + } + return trimmed.split("\n").filter(function(line) { return line.trim() !== ""; }); + } + + function expandHomePath(pathValue) { + var expandedPath = pathValue; + if (expandedPath.startsWith("~")) { + expandedPath = Quickshell.env("HOME") + expandedPath.substring(1); + } + return expandedPath; + } + + function displaySearchDirectory() { + var expandedPath = expandHomePath(searchDirectory); + var homeDir = Quickshell.env("HOME"); + if (expandedPath.startsWith(homeDir)) { + return "~" + expandedPath.slice(homeDir.length); + } + return expandedPath; + } + + function sortResults(results, query) { + var queryLower = query.toLowerCase(); + results.sort(function(a, b) { + var rankA = resultRank(a, queryLower); + var rankB = resultRank(b, queryLower); + if (rankA !== rankB) { + return rankA - rankB; + } + + var nameA = (a.name || "").toLowerCase(); + var nameB = (b.name || "").toLowerCase(); + if (nameA < nameB) { + return -1; + } + if (nameA > nameB) { + return 1; + } + return (a.description || "").length - (b.description || "").length; + }); + return results; + } + + function resultRank(result, queryLower) { + var name = (result.name || "").toLowerCase(); + var description = (result.description || "").toLowerCase(); + var fullPath = description + "/" + name; + + if (name === queryLower) { + return 0; + } + if (name.startsWith(queryLower)) { + return 1; + } + if (name.indexOf(queryLower) !== -1) { + return 2; + } + if (fullPath.indexOf(queryLower) !== -1) { + return 3; + } + return 4; + } + + function formatFileEntry(filePath, forcedIsDirectory) { + var normalizedPath = filePath; + while (normalizedPath.length > 1 && normalizedPath.endsWith("/")) { + normalizedPath = normalizedPath.slice(0, -1); + } + + var isDirectory = (forcedIsDirectory !== undefined) ? forcedIsDirectory : normalizedPath !== filePath; + var parts = normalizedPath.split("/"); + var filename = parts[parts.length - 1]; + var parentPath = parts.slice(0, -1).join("/"); + + if (filename === "") { + filename = normalizedPath; + } + + var homeDir = Quickshell.env("HOME"); + if (parentPath.startsWith(homeDir)) { + parentPath = "~" + parentPath.slice(homeDir.length); + } + + return { + "name": filename, + "description": parentPath, + "icon": isDirectory ? "folder" : getFileIcon(filename), + "isTablerIcon": true, + "isImage": false, + "singleLine": false, + "onActivate": function() { + root.openFile(normalizedPath); + } + }; + } + + function getFileIcon(filename) { + var ext = filename.split(".").pop().toLowerCase(); + + // Images + if (["jpg", "jpeg", "png", "gif", "svg", "webp", "bmp", "ico"].indexOf(ext) !== -1) { + return "photo"; + } + + // Documents + if (["txt", "md", "pdf", "doc", "docx", "odt", "rtf"].indexOf(ext) !== -1) { + return "file-text"; + } + + // Code files + if (["js", "ts", "py", "java", "cpp", "c", "h", "qml", "rs", "go", "rb", "php", "html", "css", "json", "xml", "yaml", "yml"].indexOf(ext) !== -1) { + return "code"; + } + + // Archives + if (["zip", "tar", "gz", "bz2", "xz", "7z", "rar"].indexOf(ext) !== -1) { + return "file-zip"; + } + + // Audio + if (["mp3", "wav", "flac", "ogg", "m4a", "aac", "wma"].indexOf(ext) !== -1) { + return "music"; + } + + // Video + if (["mp4", "mkv", "avi", "mov", "wmv", "flv", "webm"].indexOf(ext) !== -1) { + return "video"; + } + + // Spreadsheets + if (["xls", "xlsx", "ods", "csv"].indexOf(ext) !== -1) { + return "table"; + } + + // Presentations + if (["ppt", "pptx", "odp"].indexOf(ext) !== -1) { + return "presentation"; + } + + // Default + return "file"; + } + + function openFile(filePath) { + Logger.i("FileSearch", "Opening file:", filePath); + Quickshell.execDetached([fileOpener, filePath]); + launcher.close(); + } +} diff --git a/dotfiles/.config/noctalia/plugins/file-search/Main.qml b/dotfiles/.config/noctalia/plugins/file-search/Main.qml new file mode 100644 index 0000000..087fe1e --- /dev/null +++ b/dotfiles/.config/noctalia/plugins/file-search/Main.qml @@ -0,0 +1,68 @@ +import QtQuick +import Quickshell.Io +import qs.Commons +import qs.Services.UI + +Item { + property var pluginApi: null + + Component.onCompleted: { + if (pluginApi) { + Logger.i("FileSearch", "Plugin initialized"); + } + } + + IpcHandler { + target: "plugin:file-search" + + // Toggle launcher in file search mode + function toggle() { + if (!pluginApi) return; + + pluginApi.withCurrentScreen(screen => { + var launcherPanel = PanelService.getPanel("launcherPanel", screen); + if (!launcherPanel) { + Logger.e("FileSearch", "Could not get launcher panel"); + return; + } + + var searchText = launcherPanel.searchText || ""; + var isInFileMode = searchText.startsWith(">file"); + + if (!launcherPanel.isPanelOpen) { + // Launcher closed - open with file search + Logger.i("FileSearch", "Opening launcher in file search mode"); + launcherPanel.open(); + launcherPanel.setSearchText(">file "); + } else if (isInFileMode) { + // Already in file mode - close launcher + Logger.i("FileSearch", "Closing launcher (toggle off)"); + launcherPanel.close(); + } else { + // Launcher open but different mode - switch to file search + Logger.i("FileSearch", "Switching to file search mode"); + launcherPanel.setSearchText(">file "); + } + }); + } + + // Open launcher with file search and specific query + function search(query: string) { + if (!pluginApi) return; + + pluginApi.withCurrentScreen(screen => { + var launcherPanel = PanelService.getPanel("launcherPanel", screen); + if (!launcherPanel) { + Logger.e("FileSearch", "Could not get launcher panel"); + return; + } + + var searchQuery = query || ""; + Logger.i("FileSearch", "Opening launcher with search query:", searchQuery); + + launcherPanel.open(); + launcherPanel.setSearchText(">file " + searchQuery); + }); + } + } +} diff --git a/dotfiles/.config/noctalia/plugins/file-search/README.md b/dotfiles/.config/noctalia/plugins/file-search/README.md new file mode 100644 index 0000000..1d5ef34 --- /dev/null +++ b/dotfiles/.config/noctalia/plugins/file-search/README.md @@ -0,0 +1,25 @@ +# File Search Plugin + +File search from the launcher. + +## Requirements + +This plugin requires [fd](https://github.com/sharkdp/fd#installation) to be installed. + +## Usage + +**Access from launcher:** + +Type `>file` in the Noctalia launcher to activate file search. + +**Toggle file search:** + +```bash +noctalia-shell ipc call plugin:file-search toggle +``` + +**Search with pre-filled query:** + +```bash +noctalia-shell ipc call plugin:file-search search "eko" +``` diff --git a/dotfiles/.config/noctalia/plugins/file-search/Settings.qml b/dotfiles/.config/noctalia/plugins/file-search/Settings.qml new file mode 100644 index 0000000..fc7ed87 --- /dev/null +++ b/dotfiles/.config/noctalia/plugins/file-search/Settings.qml @@ -0,0 +1,142 @@ +import QtQuick +import QtQuick.Layouts +import qs.Commons +import qs.Widgets + +ColumnLayout { + id: root + + property var pluginApi: null + + property var cfg: pluginApi?.pluginSettings || ({}) + property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({}) + + property bool valueShowHidden: cfg.showHidden ?? defaults.showHidden + property int valueMaxResults: cfg.maxResults ?? defaults.maxResults + property string valueFileOpener: cfg.fileOpener ?? defaults.fileOpener + property string valueFdCommand: cfg.fdCommand ?? defaults.fdCommand + property string valueSearchDirectory: cfg.searchDirectory ?? defaults.searchDirectory + + spacing: Style.marginL + + Component.onCompleted: { + Logger.d("FileSearch", "Settings UI loaded"); + } + + ColumnLayout { + spacing: Style.marginM + Layout.fillWidth: true + + // Show Hidden Files Toggle + RowLayout { + Layout.fillWidth: true + spacing: Style.marginM + + ColumnLayout { + Layout.fillWidth: true + spacing: Style.marginS + + NText { + text: pluginApi?.tr("settings.showHidden.label") + font.pointSize: Style.fontSizeL + font.weight: Font.Medium + color: Color.mOnSurface + Layout.fillWidth: true + } + } + + NToggle { + checked: root.valueShowHidden + onToggled: root.valueShowHidden = checked + } + } + + // File Opener Input + NTextInput { + Layout.fillWidth: true + label: pluginApi?.tr("settings.fileOpener.label") + description: pluginApi?.tr("settings.fileOpener.description") + placeholderText: pluginApi?.tr("settings.fileOpener.placeholder") + text: root.valueFileOpener + onTextChanged: root.valueFileOpener = text + } + + // Search Directory Input + NTextInput { + Layout.fillWidth: true + label: pluginApi?.tr("settings.searchDirectory.label") + description: pluginApi?.tr("settings.searchDirectory.description") + placeholderText: pluginApi?.tr("settings.searchDirectory.placeholder") + text: root.valueSearchDirectory + onTextChanged: root.valueSearchDirectory = text + } + + // fd Command Path Input + NTextInput { + Layout.fillWidth: true + label: pluginApi?.tr("settings.fdCommand.label") + description: pluginApi?.tr("settings.fdCommand.description") + placeholderText: pluginApi?.tr("settings.fdCommand.placeholder") + text: root.valueFdCommand + onTextChanged: root.valueFdCommand = text + } + } + + // Max Results Slider + ColumnLayout { + Layout.fillWidth: true + spacing: Style.marginS + + RowLayout { + Layout.fillWidth: true + + NText { + text: pluginApi?.tr("settings.maxResults.label") + font.pointSize: Style.fontSizeL + font.weight: Font.Medium + color: Color.mOnSurface + Layout.fillWidth: true + } + + NText { + text: root.valueMaxResults === 0 ? pluginApi?.tr("settings.maxResults.unlimited") : root.valueMaxResults.toString() + font.pointSize: Style.fontSizeM + font.weight: Font.Medium + color: Color.mPrimary + } + } + + NText { + text: pluginApi?.tr("settings.maxResults.description") + font.pointSize: Style.fontSizeS + color: Color.mOnSurfaceVariant + wrapMode: Text.WordWrap + Layout.fillWidth: true + } + + NSlider { + Layout.fillWidth: true + from: 0 + to: 1000 + stepSize: 10 + value: root.valueMaxResults + onMoved: root.valueMaxResults = Math.round(value) + } + } + + function saveSettings() { + if (!pluginApi) { + Logger.e("FileSearch", "Cannot save settings: pluginApi is null"); + return; + } + + pluginApi.pluginSettings.showHidden = root.valueShowHidden; + pluginApi.pluginSettings.maxResults = root.valueMaxResults; + pluginApi.pluginSettings.fileOpener = root.valueFileOpener; + pluginApi.pluginSettings.searchDirectory = root.valueSearchDirectory; + pluginApi.pluginSettings.fdCommand = root.valueFdCommand; + pluginApi.saveSettings(); + + Logger.d("FileSearch", "Settings saved successfully"); + } +} diff --git a/dotfiles/.config/noctalia/plugins/file-search/i18n/en.json b/dotfiles/.config/noctalia/plugins/file-search/i18n/en.json new file mode 100644 index 0000000..8a56924 --- /dev/null +++ b/dotfiles/.config/noctalia/plugins/file-search/i18n/en.json @@ -0,0 +1,55 @@ +{ + "provider": { + "name": "File Search" + }, + "launcher": { + "command": { + "description": "Search files and folders" + }, + "errors": { + "fdNotFound": { + "title": "fd not found", + "description": "Please install fd to use file search" + } + }, + "prompts": { + "emptyQuery": { + "title": "Type to search files and folders", + "description": "Start typing to search in {{root}}" + }, + "searching": { + "title": "Searching...", + "description": "Looking for files and folders matching: {{query}}" + }, + "noResults": { + "title": "No results found", + "description": "No files or folders matching '{{query}}'" + } + } + }, + "settings": { + "showHidden": { + "label": "Include hidden files" + }, + "fileOpener": { + "label": "File opener command", + "description": "Command used to open files and folders", + "placeholder": "xdg-open" + }, + "searchDirectory": { + "label": "Search directory", + "description": "Directory to search for files and folders", + "placeholder": "~" + }, + "fdCommand": { + "label": "fd command path", + "description": "Command name or full path", + "placeholder": "fd" + }, + "maxResults": { + "label": "Maximum results", + "unlimited": "Unlimited", + "description": "Limit the number of search results displayed (set to 0 for unlimited)" + } + } +} diff --git a/dotfiles/.config/noctalia/plugins/file-search/i18n/fr.json b/dotfiles/.config/noctalia/plugins/file-search/i18n/fr.json new file mode 100644 index 0000000..361e020 --- /dev/null +++ b/dotfiles/.config/noctalia/plugins/file-search/i18n/fr.json @@ -0,0 +1,55 @@ +{ + "provider": { + "name": "Recherche de fichiers" + }, + "launcher": { + "command": { + "description": "Rechercher des fichiers et des dossiers" + }, + "errors": { + "fdNotFound": { + "title": "fd non trouvé", + "description": "Veuillez installer fd pour utiliser la recherche de fichiers" + } + }, + "prompts": { + "emptyQuery": { + "title": "Tapez pour rechercher des fichiers et des dossiers", + "description": "Commencez à taper pour rechercher dans {{root}}" + }, + "searching": { + "title": "Recherche en cours...", + "description": "Recherche de fichiers et dossiers correspondant à : {{query}}" + }, + "noResults": { + "title": "Aucun résultat trouvé", + "description": "Aucun fichier ou dossier ne correspond à '{{query}}'" + } + } + }, + "settings": { + "showHidden": { + "label": "Inclure les fichiers cachés" + }, + "fileOpener": { + "label": "Commande d'ouverture de fichier", + "description": "Commande utilisée pour ouvrir les fichiers et dossiers", + "placeholder": "xdg-open" + }, + "searchDirectory": { + "label": "Répertoire de recherche", + "description": "Répertoire où rechercher des fichiers et des dossiers", + "placeholder": "~" + }, + "fdCommand": { + "label": "Chemin de la commande fd", + "description": "Nom de la commande ou chemin complet", + "placeholder": "fd" + }, + "maxResults": { + "label": "Nombre maximal de résultats", + "unlimited": "Illimité", + "description": "Limiter le nombre de résultats de recherche affichés (définir à 0 pour illimité)" + } + } +} diff --git a/dotfiles/.config/noctalia/plugins/file-search/i18n/zh-CN.json b/dotfiles/.config/noctalia/plugins/file-search/i18n/zh-CN.json new file mode 100644 index 0000000..446924e --- /dev/null +++ b/dotfiles/.config/noctalia/plugins/file-search/i18n/zh-CN.json @@ -0,0 +1,55 @@ +{ + "provider": { + "name": "文件搜索" + }, + "launcher": { + "command": { + "description": "搜索文件和文件夹" + }, + "errors": { + "fdNotFound": { + "title": "未找到 fd", + "description": "请安装 fd 以使用文件搜索" + } + }, + "prompts": { + "emptyQuery": { + "title": "输入以搜索文件和文件夹", + "description": "开始输入以在 {{root}} 中搜索" + }, + "searching": { + "title": "正在搜索…", + "description": "正在查找匹配 {{query}} 的文件和文件夹" + }, + "noResults": { + "title": "未找到结果", + "description": "没有匹配 '{{query}}' 的文件或文件夹" + } + } + }, + "settings": { + "showHidden": { + "label": "包含隐藏文件" + }, + "fileOpener": { + "label": "文件打开命令", + "description": "用于打开文件和文件夹的命令", + "placeholder": "xdg-open" + }, + "searchDirectory": { + "label": "搜索目录", + "description": "用于搜索文件和文件夹的目录", + "placeholder": "~" + }, + "fdCommand": { + "label": "fd 命令路径", + "description": "命令名称或完整路径", + "placeholder": "fd" + }, + "maxResults": { + "label": "最大结果数", + "unlimited": "无限制", + "description": "限制显示的搜索结果数量(设为 0 表示无限制)" + } + } +} diff --git a/dotfiles/.config/noctalia/plugins/file-search/i18n/zh-TW.json b/dotfiles/.config/noctalia/plugins/file-search/i18n/zh-TW.json new file mode 100644 index 0000000..0a31b1a --- /dev/null +++ b/dotfiles/.config/noctalia/plugins/file-search/i18n/zh-TW.json @@ -0,0 +1,55 @@ +{ + "provider": { + "name": "檔案搜尋" + }, + "launcher": { + "command": { + "description": "搜尋檔案與資料夾" + }, + "errors": { + "fdNotFound": { + "title": "找不到 fd", + "description": "請安裝 fd 以使用檔案搜尋" + } + }, + "prompts": { + "emptyQuery": { + "title": "輸入以搜尋檔案與資料夾", + "description": "開始輸入以在 {{root}} 中搜尋" + }, + "searching": { + "title": "正在搜尋…", + "description": "正在尋找符合 {{query}} 的檔案與資料夾" + }, + "noResults": { + "title": "找不到結果", + "description": "沒有符合 '{{query}}' 的檔案或資料夾" + } + } + }, + "settings": { + "showHidden": { + "label": "包含隱藏檔案" + }, + "fileOpener": { + "label": "檔案開啟命令", + "description": "用於開啟檔案與資料夾的命令", + "placeholder": "xdg-open" + }, + "searchDirectory": { + "label": "搜尋目錄", + "description": "用於搜尋檔案與資料夾的目錄", + "placeholder": "~" + }, + "fdCommand": { + "label": "fd 命令路徑", + "description": "命令名稱或完整路徑", + "placeholder": "fd" + }, + "maxResults": { + "label": "最大結果數", + "unlimited": "無限制", + "description": "限制顯示的搜尋結果數量(設為 0 表示無限制)" + } + } +} diff --git a/dotfiles/.config/noctalia/plugins/file-search/manifest.json b/dotfiles/.config/noctalia/plugins/file-search/manifest.json new file mode 100644 index 0000000..0d0facf --- /dev/null +++ b/dotfiles/.config/noctalia/plugins/file-search/manifest.json @@ -0,0 +1,31 @@ +{ + "id": "file-search", + "name": "File Search", + "version": "1.0.4", + "minNoctaliaVersion": "4.1.2", + "author": "ericbreh", + "license": "MIT", + "repository": "https://github.com/noctalia-dev/noctalia-plugins", + "description": "File search from the launcher.", + "tags": [ + "Launcher", + "Productivity" + ], + "entryPoints": { + "main": "Main.qml", + "launcherProvider": "LauncherProvider.qml", + "settings": "Settings.qml" + }, + "dependencies": { + "plugins": [] + }, + "metadata": { + "defaultSettings": { + "showHidden": false, + "maxResults": 100, + "fileOpener": "xdg-open", + "searchDirectory": "~", + "fdCommand": "fd" + } + } +} diff --git a/dotfiles/.config/noctalia/plugins/file-search/preview.png b/dotfiles/.config/noctalia/plugins/file-search/preview.png new file mode 100644 index 0000000..e6cf000 Binary files /dev/null and b/dotfiles/.config/noctalia/plugins/file-search/preview.png differ diff --git a/dotfiles/.config/noctalia/settings.json b/dotfiles/.config/noctalia/settings.json new file mode 100644 index 0000000..a43552a --- /dev/null +++ b/dotfiles/.config/noctalia/settings.json @@ -0,0 +1,760 @@ +{ + "appLauncher": { + "autoPasteClipboard": false, + "clipboardWatchImageCommand": "wl-paste --type image --watch cliphist store", + "clipboardWatchTextCommand": "wl-paste --type text --watch cliphist store", + "clipboardWrapText": true, + "customLaunchPrefix": "", + "customLaunchPrefixEnabled": false, + "density": "default", + "enableClipPreview": true, + "enableClipboardChips": true, + "enableClipboardHistory": false, + "enableClipboardSmartIcons": true, + "enableSessionSearch": true, + "enableSettingsSearch": true, + "enableWindowsSearch": true, + "iconMode": "native", + "ignoreMouseInput": false, + "overviewLayer": false, + "pinnedApps": [ + ], + "position": "top_center", + "screenshotAnnotationTool": "", + "showCategories": true, + "showIconBackground": false, + "sortByMostUsed": true, + "terminalCommand": "alacritty -e", + "viewMode": "list" + }, + "audio": { + "mprisBlacklist": [ + ], + "preferredPlayer": "", + "spectrumFrameRate": 30, + "spectrumMirrored": true, + "visualizerType": "linear", + "volumeFeedback": false, + "volumeFeedbackSoundFile": "", + "volumeOverdrive": false, + "volumeStep": 2 + }, + "bar": { + "autoHideDelay": 500, + "autoShowDelay": 150, + "backgroundOpacity": 0.93, + "barType": "simple", + "capsuleColorKey": "none", + "capsuleOpacity": 1, + "contentPadding": 2, + "density": "default", + "displayMode": "always_visible", + "enableExclusionZoneInset": true, + "fontScale": 1.1, + "frameRadius": 12, + "frameThickness": 8, + "hideOnOverview": false, + "marginHorizontal": 4, + "marginVertical": 4, + "middleClickAction": "none", + "middleClickCommand": "", + "middleClickFollowMouse": false, + "monitors": [ + ], + "mouseWheelAction": "none", + "mouseWheelWrap": true, + "outerCorners": true, + "position": "top", + "reverseScroll": false, + "rightClickAction": "controlCenter", + "rightClickCommand": "", + "rightClickFollowMouse": true, + "screenOverrides": [ + ], + "showCapsule": true, + "showOnWorkspaceSwitch": true, + "showOutline": false, + "useSeparateOpacity": false, + "widgetSpacing": 2, + "widgets": { + "center": [ + { + "colorizeIcons": false, + "hideMode": "hidden", + "id": "ActiveWindow", + "maxWidth": 360, + "scrollingMode": "hover", + "showIcon": true, + "showText": true, + "textColor": "none", + "useFixedWidth": false + } + ], + "left": [ + { + "colorizeSystemIcon": "secondary", + "colorizeSystemText": "none", + "customIconPath": "", + "enableColorization": true, + "icon": "rocket", + "iconColor": "none", + "id": "Launcher", + "useDistroLogo": true + }, + { + "colorizeDistroLogo": false, + "colorizeSystemIcon": "secondary", + "colorizeSystemText": "none", + "customIconPath": "", + "enableColorization": true, + "icon": "adjustments-horizontal", + "id": "ControlCenter", + "useDistroLogo": false + }, + { + "clockColor": "primary", + "customFont": "", + "formatHorizontal": "yyyy年MM月dd日 HH:mm:ss", + "formatVertical": "HH mm - dd MM", + "id": "Clock", + "tooltipFormat": "HH:mm ddd, MMM dd", + "useCustomFont": false + }, + { + "compactMode": false, + "hideMode": "visible", + "hideWhenIdle": false, + "id": "MediaMini", + "maxWidth": 300, + "panelShowAlbumArt": true, + "scrollingMode": "hover", + "showAlbumArt": true, + "showArtistFirst": true, + "showProgressRing": true, + "showVisualizer": false, + "textColor": "none", + "useFixedWidth": false, + "visualizerType": "linear" + }, + { + "displayMode": "alwaysShow", + "iconColor": "primary", + "id": "Volume", + "middleClickCommand": "pwvucontrol || pavucontrol", + "textColor": "none" + }, + { + "characterCount": 2, + "colorizeIcons": false, + "emptyColor": "secondary", + "enableScrollWheel": true, + "focusedColor": "primary", + "followFocusedScreen": false, + "fontWeight": "bold", + "groupedBorderOpacity": 1, + "hideUnoccupied": false, + "iconScale": 0.8, + "id": "Workspace", + "labelMode": "index", + "occupiedColor": "secondary", + "pillSize": 0.6, + "showApplications": true, + "showApplicationsHover": true, + "showBadge": true, + "showLabelsOnlyWhenOccupied": true, + "unfocusedIconsOpacity": 1 + } + ], + "right": [ + { + "hideWhenZero": true, + "hideWhenZeroUnread": false, + "iconColor": "none", + "id": "NotificationHistory", + "showUnreadBadge": true, + "unreadBadgeColor": "primary" + }, + { + "deviceNativePath": "__default__", + "displayMode": "graphic-clean", + "hideIfIdle": false, + "hideIfNotDetected": true, + "id": "Battery", + "showNoctaliaPerformance": false, + "showPowerProfiles": false + }, + { + "compactMode": false, + "diskPath": "/", + "iconColor": "secondary", + "id": "SystemMonitor", + "showCpuCores": false, + "showCpuFreq": false, + "showCpuTemp": true, + "showCpuUsage": true, + "showDiskAvailable": false, + "showDiskUsage": false, + "showDiskUsageAsPercent": false, + "showGpuTemp": false, + "showLoadAverage": false, + "showMemoryAsPercent": false, + "showMemoryUsage": true, + "showNetworkStats": false, + "showSwapUsage": false, + "textColor": "none", + "useMonospaceFont": true, + "usePadding": false + }, + { + "applyToAllMonitors": false, + "displayMode": "onhover", + "iconColor": "secondary", + "id": "Brightness", + "textColor": "none" + }, + { + "displayMode": "forceOpen", + "iconColor": "primary", + "id": "KeyboardLayout", + "showIcon": true, + "textColor": "none" + }, + { + "displayMode": "onhover", + "iconColor": "none", + "id": "Network", + "textColor": "none" + }, + { + "blacklist": [ + ], + "chevronColor": "none", + "colorizeIcons": false, + "drawerEnabled": false, + "hidePassive": false, + "id": "Tray", + "pinned": [ + ] + } + ] + } + }, + "brightness": { + "backlightDeviceMappings": [ + ], + "brightnessStep": 5, + "enableDdcSupport": false, + "enforceMinimum": true + }, + "calendar": { + "cards": [ + { + "enabled": true, + "id": "calendar-header-card" + }, + { + "enabled": true, + "id": "calendar-month-card" + }, + { + "enabled": true, + "id": "weather-card" + } + ] + }, + "colorSchemes": { + "darkMode": true, + "generationMethod": "content", + "manualSunrise": "06:30", + "manualSunset": "18:30", + "monitorForColors": "", + "predefinedScheme": "Vesper", + "schedulingMode": "off", + "syncGsettings": true, + "useWallpaperColors": false + }, + "controlCenter": { + "cards": [ + { + "enabled": true, + "id": "profile-card" + }, + { + "enabled": true, + "id": "shortcuts-card" + }, + { + "enabled": true, + "id": "audio-card" + }, + { + "enabled": false, + "id": "brightness-card" + }, + { + "enabled": true, + "id": "weather-card" + }, + { + "enabled": true, + "id": "media-sysmon-card" + } + ], + "diskPath": "/", + "position": "close_to_bar_button", + "shortcuts": { + "left": [ + { + "id": "Network" + }, + { + "id": "Bluetooth" + }, + { + "id": "WallpaperSelector" + }, + { + "id": "NoctaliaPerformance" + } + ], + "right": [ + { + "id": "Notifications" + }, + { + "id": "PowerProfile" + }, + { + "id": "KeepAwake" + }, + { + "id": "NightLight" + } + ] + } + }, + "desktopWidgets": { + "enabled": true, + "gridSnap": true, + "gridSnapScale": true, + "monitorWidgets": [ + { + "name": "DP-1", + "widgets": [ + ] + }, + { + "name": "HDMI-A-1", + "widgets": [ + { + "hideMode": "visible", + "id": "MediaPlayer", + "roundedCorners": true, + "scale": 0.95, + "showAlbumArt": true, + "showBackground": true, + "showButtons": true, + "showVisualizer": true, + "visualizerType": "linear", + "x": 1500, + "y": 400 + }, + { + "id": "Weather", + "roundedCorners": true, + "scale": 1.035742359088177, + "showBackground": true, + "x": 1500, + "y": 280 + } + ] + } + ], + "overviewEnabled": true + }, + "dock": { + "animationSpeed": 1, + "backgroundOpacity": 1, + "colorizeIcons": false, + "deadOpacity": 0.6, + "displayMode": "auto_hide", + "dockType": "floating", + "enabled": true, + "floatingRatio": 0.14, + "groupApps": false, + "groupClickAction": "cycle", + "groupContextMenuMode": "extended", + "groupIndicatorStyle": "dots", + "inactiveIndicators": false, + "indicatorColor": "primary", + "indicatorOpacity": 0.6, + "indicatorThickness": 3, + "launcherIcon": "", + "launcherIconColor": "secondary", + "launcherPosition": "start", + "launcherUseDistroLogo": true, + "monitors": [ + ], + "onlySameOutput": true, + "pinnedApps": [ + ], + "pinnedStatic": false, + "position": "bottom", + "showDockIndicator": false, + "showLauncherIcon": true, + "sitOnFrame": false, + "size": 1 + }, + "general": { + "allowPanelsOnScreenWithoutBar": true, + "allowPasswordWithFprintd": false, + "animationDisabled": false, + "animationSpeed": 2, + "autoStartAuth": false, + "avatarImage": "/home/yaroslav/.face", + "boxRadiusRatio": 1, + "clockFormat": "hh\\nmm", + "clockStyle": "analog", + "compactLockScreen": false, + "dimmerOpacity": 0.2, + "enableBlurBehind": true, + "enableLockScreenCountdown": true, + "enableLockScreenMediaControls": true, + "enableShadows": true, + "forceBlackScreenCorners": false, + "iRadiusRatio": 1, + "keybinds": { + "keyDown": [ + "Down", + "Ctrl+J" + ], + "keyEnter": [ + "Return", + "Enter" + ], + "keyEscape": [ + "Esc" + ], + "keyLeft": [ + "Left", + "Ctrl+H" + ], + "keyRemove": [ + "Del", + "Ctrl+W" + ], + "keyRight": [ + "Right", + "Ctrl+L" + ], + "keyUp": [ + "Up", + "Ctrl+K" + ] + }, + "language": "", + "lockOnSuspend": true, + "lockScreenAnimations": true, + "lockScreenBlur": 0, + "lockScreenCountdownDuration": 3000, + "lockScreenMonitors": [ + ], + "lockScreenTint": 0, + "passwordChars": false, + "radiusRatio": 0.34, + "reverseScroll": false, + "scaleRatio": 1, + "screenRadiusRatio": 1, + "shadowDirection": "bottom_right", + "shadowOffsetX": 2, + "shadowOffsetY": 3, + "showChangelogOnStartup": true, + "showHibernateOnLockScreen": false, + "showScreenCorners": false, + "showSessionButtonsOnLockScreen": true, + "smoothScrollEnabled": false, + "telemetryEnabled": false + }, + "hooks": { + "colorGeneration": "", + "darkModeChange": "", + "enabled": false, + "performanceModeDisabled": "", + "performanceModeEnabled": "", + "screenLock": "", + "screenUnlock": "", + "session": "", + "startup": "", + "wallpaperChange": "" + }, + "idle": { + "customCommands": "[]", + "enabled": true, + "fadeDuration": 5, + "lockCommand": "", + "lockTimeout": 660, + "resumeLockCommand": "", + "resumeScreenOffCommand": "", + "resumeSuspendCommand": "", + "screenOffCommand": "", + "screenOffTimeout": 600, + "suspendCommand": "", + "suspendTimeout": 0 + }, + "location": { + "analogClockInCalendar": true, + "autoLocate": false, + "firstDayOfWeek": -1, + "hideWeatherCityName": false, + "hideWeatherTimezone": false, + "name": "сестрорецк", + "showCalendarEvents": true, + "showCalendarWeather": true, + "showWeekNumberInCalendar": false, + "use12hourFormat": false, + "useFahrenheit": false, + "weatherEnabled": true, + "weatherShowEffects": true, + "weatherTaliaMascotAlways": false + }, + "network": { + "bluetoothAutoConnect": true, + "bluetoothDetailsViewMode": "grid", + "bluetoothHideUnnamedDevices": false, + "bluetoothRssiPollIntervalMs": 60000, + "bluetoothRssiPollingEnabled": false, + "disableDiscoverability": false, + "networkPanelView": "wifi", + "wifiDetailsViewMode": "list" + }, + "nightLight": { + "autoSchedule": true, + "dayTemp": "6500", + "enabled": false, + "forced": false, + "manualSunrise": "06:30", + "manualSunset": "18:30", + "nightTemp": "4000" + }, + "noctaliaPerformance": { + "disableDesktopWidgets": true, + "disableWallpaper": false + }, + "notifications": { + "backgroundOpacity": 1, + "clearDismissed": true, + "criticalUrgencyDuration": 15, + "density": "compact", + "enableBatteryToast": true, + "enableKeyboardLayoutToast": false, + "enableMarkdown": false, + "enableMediaToast": false, + "enabled": true, + "location": "top_right", + "lowUrgencyDuration": 3, + "monitors": [ + ], + "normalUrgencyDuration": 5, + "overlayLayer": true, + "respectExpireTimeout": false, + "saveToHistory": { + "critical": true, + "low": true, + "normal": true + }, + "sounds": { + "criticalSoundFile": "", + "enabled": false, + "excludedApps": "discord,firefox,chrome,chromium,edge", + "lowSoundFile": "", + "normalSoundFile": "", + "separateSounds": false, + "volume": 0.5 + } + }, + "osd": { + "autoHideMs": 2000, + "backgroundOpacity": 1, + "enabled": true, + "enabledTypes": [ + 0, + 1, + 2 + ], + "location": "left", + "monitors": [ + ], + "overlayLayer": true + }, + "plugins": { + "autoUpdate": false, + "notifyUpdates": true + }, + "sessionMenu": { + "countdownDuration": 10000, + "enableCountdown": false, + "largeButtonsLayout": "grid", + "largeButtonsStyle": true, + "position": "center", + "powerOptions": [ + { + "action": "lock", + "command": "", + "countdownEnabled": true, + "enabled": true, + "keybind": "1" + }, + { + "action": "suspend", + "command": "", + "countdownEnabled": true, + "enabled": true, + "keybind": "2" + }, + { + "action": "hibernate", + "command": "", + "countdownEnabled": true, + "enabled": true, + "keybind": "3" + }, + { + "action": "reboot", + "command": "", + "countdownEnabled": true, + "enabled": true, + "keybind": "4" + }, + { + "action": "logout", + "command": "", + "countdownEnabled": true, + "enabled": true, + "keybind": "5" + }, + { + "action": "shutdown", + "command": "", + "countdownEnabled": true, + "enabled": true, + "keybind": "6" + }, + { + "action": "rebootToUefi", + "command": "", + "countdownEnabled": true, + "enabled": true, + "keybind": "7" + }, + { + "action": "userspaceReboot", + "command": "", + "countdownEnabled": true, + "enabled": false, + "keybind": "" + } + ], + "showHeader": true, + "showKeybinds": true + }, + "settingsVersion": 59, + "systemMonitor": { + "batteryCriticalThreshold": 5, + "batteryWarningThreshold": 20, + "cpuCriticalThreshold": 90, + "cpuWarningThreshold": 80, + "criticalColor": "#a7cce1", + "diskAvailCriticalThreshold": 10, + "diskAvailWarningThreshold": 20, + "diskCriticalThreshold": 90, + "diskWarningThreshold": 80, + "enableDgpuMonitoring": false, + "externalMonitor": "resources || missioncenter || jdsystemmonitor || corestats || system-monitoring-center || gnome-system-monitor || plasma-systemmonitor || mate-system-monitor || ukui-system-monitor || deepin-system-monitor || pantheon-system-monitor", + "gpuCriticalThreshold": 90, + "gpuWarningThreshold": 80, + "memCriticalThreshold": 90, + "memWarningThreshold": 80, + "swapCriticalThreshold": 90, + "swapWarningThreshold": 80, + "tempCriticalThreshold": 90, + "tempWarningThreshold": 80, + "useCustomColors": true, + "warningColor": "#e8b8a8" + }, + "templates": { + "activeTemplates": [ + { + "enabled": true, + "id": "telegram" + }, + { + "enabled": true, + "id": "niri" + } + ], + "enableUserTheming": false + }, + "ui": { + "boxBorderEnabled": true, + "fontDefault": "monospace", + "fontDefaultScale": 1, + "fontFixed": "monospace", + "fontFixedScale": 1, + "panelBackgroundOpacity": 0.8, + "panelsAttachedToBar": true, + "scrollbarAlwaysVisible": true, + "settingsPanelMode": "attached", + "settingsPanelSideBarCardStyle": false, + "tooltipsEnabled": true, + "translucentWidgets": true + }, + "wallpaper": { + "automationEnabled": false, + "directory": "/home/yaroslav/pics/wallpapers", + "enableMultiMonitorDirectories": false, + "enabled": true, + "favorites": [ + ], + "fillColor": "#000000", + "fillMode": "crop", + "hideWallpaperFilenames": false, + "linkLightAndDarkWallpapers": true, + "monitorDirectories": [ + ], + "overviewBlur": 0.8, + "overviewEnabled": true, + "overviewTint": 0.5, + "panelPosition": "follow_bar", + "randomIntervalSec": 300, + "setWallpaperOnAllMonitors": true, + "showHiddenFiles": false, + "skipStartupTransition": false, + "solidColor": "#1a1a2e", + "sortOrder": "name", + "transitionDuration": 1500, + "transitionEdgeSmoothness": 0.05, + "transitionType": [ + "fade", + "disc", + "stripes", + "wipe", + "pixelate", + "honeycomb" + ], + "useOriginalImages": false, + "useSolidColor": false, + "useWallhaven": false, + "viewMode": "browse", + "wallhavenApiKey": "", + "wallhavenCategories": "111", + "wallhavenOrder": "desc", + "wallhavenPurity": "100", + "wallhavenQuery": "", + "wallhavenRatios": "", + "wallhavenResolutionHeight": "", + "wallhavenResolutionMode": "atleast", + "wallhavenResolutionWidth": "", + "wallhavenSorting": "relevance", + "wallpaperChangeMode": "random" + } +} diff --git a/dotfiles/.config/noctalia/user-templates.toml b/dotfiles/.config/noctalia/user-templates.toml new file mode 100644 index 0000000..e490907 --- /dev/null +++ b/dotfiles/.config/noctalia/user-templates.toml @@ -0,0 +1,17 @@ +[config] + +[templates] + +# User-defined templates +# Add your custom templates below +# Example: +# [templates.myapp] +# input_path = "~/.config/noctalia/templates/myapp.css" +# output_path = "~/.config/myapp/theme.css" +# post_hook = "myapp --reload-theme" + +# Remove this section and add your own templates +#[templates.placeholder] +#input_path = "/etc/xdg/quickshell/noctalia-shell/Assets/Templates/noctalia.json" +#output_path = "/home/yaroslav/.cache/noctalia/placeholder.json" + -- cgit v1.3