diff --git a/.config/quickshell/angelos/README.md b/.config/quickshell/angelos/README.md index 4c7a491b..659fa078 100644 --- a/.config/quickshell/angelos/README.md +++ b/.config/quickshell/angelos/README.md @@ -240,7 +240,8 @@ polkit работают всегда. Launchpad, Системные настройки, Загрузки, Корзина и значки большинства программ. Она скачивается один раз при включённом скине (`scripts/mac-icons.py`, закреплённый релиз, sha256) и видна только Dock: значки GTK и остальных программ не меняются. Выключается там же; чего в теме нет — из темы - системы. + системы. Свои значки в `~/.local/share/angelos/icons/dock/` важнее обеих тем и видны и при + выключенной (Dock → «Свои значки» открывает папку). - **Свернуть — как на Mac.** В niri сворачивания нет, его делает оболочка: жёлтый свет в заголовках angelOS, «Окно → Свернуть», ⌘M (с маковскими клавишами) — окно уходит в Dock справа снимком со значком программы, клик возвращает его на прежний рабочий стол. Окно прячется на diff --git a/.config/quickshell/angelos/docs/GOLDEN-GATE.md b/.config/quickshell/angelos/docs/GOLDEN-GATE.md index 7a213191..c45de1c4 100644 --- a/.config/quickshell/angelos/docs/GOLDEN-GATE.md +++ b/.config/quickshell/angelos/docs/GOLDEN-GATE.md @@ -23,7 +23,7 @@ |---|---|---| | Строка меню | `modules/mac/MacMenuBar.qml`, `MacMenus.qml`, `MacMenuHost.qml`, `MacMenuView.qml` | 24 pt сверху на каждом экране, без своего фона (обои видны; фон — по желанию). Слева эмблема angelOS (её меню — «Об этом компьютере», Системные настройки, Обновления, Завершить принудительно, Сон, Перезагрузка, Выключение, Блокировка, Выход), жирное имя программы, её меню. Справа звук, раскладка, Wi-Fi и Bluetooth (если есть), трей, Spotlight, Пункт управления, дата и время. Меню из стекла, ←/→ и наведение переходят между меню, ⌃F2 — с клавиатуры | | Меню программ | `scripts/appmenu.py`, `services/AppMenu.qml`, `data/appmenu-profiles.json` | Qt (dbusmenu), GTK 3 (appmenu-gtk-module), действия GtkApplication; для остальных — стандартные наборы из клавиш программы. Чего сделать нельзя — нет в меню. Подробно — `GLOBAL-MENU.md` | -| Dock | `modules/mac/MacDock.qml`, `MacDockModel.qml` | Стеклянная плита снизу: закреплённые программы «Пуска» (или свой список), «Программы», недавние после разделителя, свёрнутые окна, Загрузки и Корзина; точка под запущенными; подсказка над значком; меню по правой кнопке (окна программы, действия из её .desktop, «Оставить в Dock», «Открыть», «Завершить»; у Корзины — «Очистить»); увеличение как в macOS (значок под указателем растёт до заданного размера, соседи — по косинусу на ~3 значка в каждую сторону; размеры считаются от Dock в покое, а ряд раскладывается так, что точка под указателем остаётся под ним — Dock расширяется в обе стороны; у края экрана тоже работает) и автоскрытие; значки — тема MacTahoe (`services/DockIcons.qml`, `scripts/mac-icons.py`) | +| Dock | `modules/mac/MacDock.qml`, `MacDockModel.qml` | Стеклянная плита снизу: закреплённые программы «Пуска» (или свой список), «Программы», недавние после разделителя, свёрнутые окна, Загрузки и Корзина; точка под запущенными; подсказка над значком; меню по правой кнопке (окна программы, действия из её .desktop, «Оставить в Dock», «Открыть», «Завершить»; у Корзины — «Очистить»); увеличение как в macOS (значок под указателем растёт до заданного размера, соседи — по косинусу на ~3 значка в каждую сторону; размеры считаются от Dock в покое, а ряд раскладывается так, что точка под указателем остаётся под ним — Dock расширяется в обе стороны; у края экрана тоже работает) и автоскрытие; значки — тема MacTahoe (`services/DockIcons.qml`, `scripts/mac-icons.py`), а свои значки `~/.local/share/angelos/icons/dock/<имя>.svg` или `.png` важнее неё и работают при выключенной теме (имя: значок из .desktop, id программы или последняя часть id; «Программы» – `view-app-grid`, Настройки – `preferences-system`, Загрузки – `folder-download`, Корзина – `user-trash`); папку открывает кнопка Dock → «Свои значки» | | Spotlight | `modules/mac/MacSpotlight.qml` (стиль «mac» у `StartOverlay`) | Тёмная стеклянная капсула вверху по центру; программы, файлы, действия, буфер обмена; лучший результат выделен, выделение следует за мышью, только когда она движется | | Пункт управления | `modules/mac/MacControlCenter.qml` | Раскладка macOS: Wi-Fi и Bluetooth рядом с «Сейчас играет», ряды [Запись экрана][Mission Control][Блокировка] и [Тёмный режим][Снимок экрана][Не беспокоить], ползунки «Дисплей» и «Звук». Чего у машины нет (Wi-Fi, Bluetooth, записи), не показывается — его место занимает следующая капсула | | Центр уведомлений и баннеры | `modules/mac/MacNotificationCenter.qml`, `MacBanner.qml` | Клик по дате; баннеры в правом верхнем углу | @@ -164,8 +164,9 @@ Ctrl+C, Ctrl+V; в меню они так и подписаны (⌃C), пото же, как его `install.sh`, но ничего из архива не запускает и берёт только файлы, папки и ссылки внутри темы. Кладётся в `~/.local/share/angelos/icons/MacTahoe` — вне пути тем значков, так что GTK и остальные программы его не видят; читает его только Dock. Уже установленный MacTahoe - (`~/.local/share/icons`, `/usr/share/icons`) берётся как есть. Нет нужного значка или тема - выключена (Тема и цвета → Golden Gate) — значок из темы системы, как раньше. + (`~/.local/share/icons`, `/usr/share/icons`) берётся как есть. Порядок такой: свой значок из + `~/.local/share/angelos/icons/dock/`, затем MacTahoe, затем значок темы системы. Тема выключена + (Тема и цвета → Golden Gate) – свои значки остаются, остальные из темы системы. - **Курсор** — `macOS` из [ful1e5/apple_cursor](https://github.com/ful1e5/apple_cursor) v2.0.1 (GPL-3.0; нарисован заново в SVG, не файлы Apple; размеры 16…96): каталог `scripts/cursors.py`, id `macos`, закреплённый архив с sha256 — в нём две темы, берётся папка `macOS`. Готового @@ -196,7 +197,7 @@ Ctrl+C, Ctrl+V; в меню они так и подписаны (⌃C), пото | Меню | у Firefox, Chromium, Electron, терминалов — стандартный набор из их клавиш, без истории и закладок списком; пункты не сереют, когда делать нечего | тулкит: на Wayland они ничего не экспортируют | | Меню | нет системных служб macOS («Инструменты письма», «Правописание», «Диктовка», «Эмодзи») | их нет в Linux, а мёртвых пунктов нет | | Стекло | размытие и насыщенность — niri, край и линза — шейдер; настоящего сдвига пикселей под стеклом нет | niri не даёт клиенту пиксели под поверхностью, а сам не преломляет | -| Dock | значки — свободная тема MacTahoe, похожая, но не Apple; программы, которых в ней нет, — из темы системы; стопка Загрузок не раскрывается веером | лицензия; не успел | +| Dock | значки — свободная тема MacTahoe, похожая, но не Apple; программы, которых в ней нет, — из темы системы или свой значок из `icons/dock`; стопка Загрузок не раскрывается веером | лицензия; не успел | | Dock | свёрнутые окна справа — снимок окна, а не живая миниатюра; сворачивание без «джинна» | niri: сворачивания нет, оно сделано оболочкой (скрытый рабочий стол); снимок — grim (ScreencopyView в Quickshell 0.3.1 роняет оболочку на нескольких мониторах) | | Окно файлов | раскладка окна — Nautilus (кнопки поиска и меню, строка пути), не Finder; в сайдбаре нет заголовков «Избранное» | тулкит: структуру окна рисует программа, скин меняет цвета, радиусы, сайдбар и кнопки | | Окно файлов | средний свет светофора серый (у окон с заголовком angelOS — рабочий) | niri выбрасывает запрос GTK «свернуть» и никому о нём не сообщает | diff --git a/.config/quickshell/angelos/modules/settings/catalog/Mac.qml b/.config/quickshell/angelos/modules/settings/catalog/Mac.qml index d4c77353..ba8adf1e 100644 --- a/.config/quickshell/angelos/modules/settings/catalog/Mac.qml +++ b/.config/quickshell/angelos/modules/settings/catalog/Mac.qml @@ -114,6 +114,17 @@ CatPage { } } } + CatCustom { + label: I18n.t("Свои значки", "Your own icons") + hint: I18n.t("файл <имя>.svg или .png в этой папке важнее значков macOS и темы: имя значка программы, её id или последняя часть id (org.gnome.Nautilus → nautilus)", "an .svg or .png in this folder comes before the Mac icons and the theme: the app's icon name, its id or the id's last part (org.gnome.Nautilus → nautilus)") + CatBox { + PxButton { + text: I18n.t("Открыть папку", "Open the folder") + icon: "folder" + onClicked: Quickshell.execDetached(["sh", "-c", 'mkdir -p "$1" && exec xdg-open "$1"', "sh", DockIcons.ownDir]) + } + } + } } // ---- the apps kept in the Dock, in order (the same as dragging them in the Dock) ---- CatGroup { diff --git a/.config/quickshell/angelos/services/DockIcons.qml b/.config/quickshell/angelos/services/DockIcons.qml index bbaf5cb2..7ea029b0 100644 --- a/.config/quickshell/angelos/services/DockIcons.qml +++ b/.config/quickshell/angelos/services/DockIcons.qml @@ -4,12 +4,17 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell import Quickshell.Io +import Qt.labs.folderlistmodel import qs.config // The Golden Gate Dock's icons drawn like macOS: MacTahoe (scripts/mac-icons.py — GPL-3.0, a // pinned release, downloaded once while the skin is on; or a MacTahoe installed already). Only // the Dock reads it: GTK and the rest keep their icon theme. Without it (not downloaded yet, no // network, turned off in Settings) the Dock shows the theme's icons as before. +// Your own icons come before both: ~/.local/share/angelos/icons/dock/.svg or .png, under +// any name the Dock looks for (the .desktop's icon, the app's id, the last part of a reverse-DNS +// id). For an app MacTahoe draws badly (Steam's is cut at the tile's edge), or one it lacks. +// Read live: an icon put there shows at once. With MacTahoe off they still do. Singleton { id: root @@ -24,19 +29,52 @@ Singleton { function file(kind, name) { return name && have[kind + "/" + name] ? "file://" + dir + "/" + kind + "/scalable/" + name + ".svg" : ""; } + // ---- your own icons (see above) ---- + readonly property string ownDir: Config.home + "/.local/share/angelos/icons/dock" + // name (without .svg / .png) -> file url; an .svg wins over a .png of the same name + readonly property var own: { + const out = {}; + for (let i = 0; i < ownModel.count; i++) { + const f = String(ownModel.get(i, "fileName")); + const m = f.match(/^(.+)\.(svg|png)$/i); + if (m && (!out[m[1]] || m[2].toLowerCase() === "svg")) + out[m[1]] = "file://" + ownDir + "/" + f; + } + return out; + } + FolderListModel { + id: ownModel + folder: "file://" + root.ownDir + nameFilters: ["*.svg", "*.png", "*.SVG", "*.PNG"] + showDirs: false + } + // one of the names: your icon, else MacTahoe's (while it is on) + function pick(kind, names) { + for (const n of names) + if (own[n]) + return own[n]; + if (!ready || !Config.mac.dockMacIcons) + return ""; + for (const n of names) { + const f = file(kind, n); + if (f) + return f; + } + return ""; + } // the icon of a Dock item, "" when MacTahoe has none: its .desktop icon, its id, the last // part of a reverse-DNS id (org.gnome.Nautilus -> nautilus) function forItem(it) { - if (!ready || !Config.mac.dockMacIcons || !it) + if (!it) return ""; if (it.kind === "apps") - return file("apps", "view-app-grid"); + return pick("apps", ["view-app-grid"]); if (it.kind === "settings") - return file("apps", "preferences-system"); + return pick("apps", ["preferences-system"]); if (it.kind === "downloads") - return file("places", "folder-download"); + return pick("places", ["folder-download"]); if (it.kind === "trash") - return file("places", it.icon === "user-trash-full" ? "user-trash-full" : "user-trash"); + return pick("places", [it.icon === "user-trash-full" ? "user-trash-full" : "user-trash"]); const out = []; const add = n => { n = String(n || "").replace(/\.desktop$/, ""); @@ -53,12 +91,7 @@ Singleton { if (n.indexOf(".") > 0 && tail.length > 2) add(tail); } - for (const n of out) { - const f = file("apps", n); - if (f) - return f; - } - return ""; + return pick("apps", out); } function refresh() { diff --git a/README.md b/README.md index 948e3ff6..bd23c32c 100644 --- a/README.md +++ b/README.md @@ -388,7 +388,7 @@ single file of Apple's. Pick it in the installer, in the wizard (*"Coming from a - **The Dock.** A Liquid Glass slab: pinned apps, *Applications*, recent ones, **minimized windows**, Downloads, Trash. A dot under running apps, a right-click menu with windows and `.desktop` actions, **magnification** like on a Mac, auto-hide. Icons from [MacTahoe](https://github.com/vinceliuice/MacTahoe-icon-theme) (GPL-3.0, pinned release, - sha256-checked). + sha256-checked); your own icons in `~/.local/share/angelos/icons/dock/` win over it. - **Minimize.** niri can't minimize; angelOS can: the window goes to a hidden workspace and **its snapshot lands on the right of the Dock**. The yellow light, *Window → Minimize*, `⌘M`, or `angelos macMinimize`; back with a click on the snapshot, the icon, Alt+Tab or the overview. diff --git a/README.ru.md b/README.ru.md index b3cefa6b..76cfaed9 100644 --- a/README.ru.md +++ b/README.ru.md @@ -389,7 +389,7 @@ niri: окна — колонки на бесконечной горизонта - **Dock.** Плита Liquid Glass: закреплённые, *Программы*, недавние, **свёрнутые окна**, «Загрузки», «Корзина». Точка под запущенными, меню по правой кнопке с окнами и действиями `.desktop`, **увеличение** как на Mac, автоскрытие. Иконки [MacTahoe](https://github.com/vinceliuice/MacTahoe-icon-theme) (GPL-3.0, закреплённый релиз, - проверка sha256). + проверка sha256); свои значки в `~/.local/share/angelos/icons/dock/` важнее неё. - **Сворачивание.** niri не умеет сворачивать — angelOS умеет: окно уходит на скрытый стол, **снимок ложится справа в Dock**. Жёлтый светофор, *Окно → Свернуть*, `⌘M` или `angelos macMinimize`; назад — кликом по снимку, по иконке, в Alt+Tab или в обзоре.