Bug 18531

Summary: Разработка ximperconf
Product: Ximper Linux Reporter: Кирилл Уницаев <fiersik>
Component: ОбщееAssignee: Кирилл Уницаев <fiersik>
Status: RESOLVED FIXED QA Contact: Roman Alifanov <ximper>
Severity: minor    
Priority: P4    
Version: не указана   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 16760    

Description Кирилл Уницаев 2025-08-23 16:18:59 MSK
ximperconf выходит за рамки прототипа, дальнейшую разработку планирую вести на Go
Comment 1 Кирилл Уницаев 2025-08-24 04:21:52 MSK
Переписал примерно половину функционала на go 

работа с переменными и модулями hyprland и проверка конфигурации
Comment 2 Кирилл Уницаев 2025-08-25 01:40:26 MSK
Добавил получение информации о репозиториях 

улучших форматирование вывода
Comment 3 Кирилл Уницаев 2025-08-29 00:48:52 MSK
Добавил динамическое автодополнение для команд модулей и пеерменных hyprland
Comment 4 Кирилл Уницаев 2025-08-29 13:39:45 MSK
Добавил команду 

ximperconf hyprland sync-xkb-layouts

Синхронизирует раскладку с XKB если она ещё не установлена

Для принудительной замены можно использовать --force
Comment 5 Кирилл Уницаев 2025-08-29 19:40:57 MSK
Исправил автодополнение модулей

добавил подкоманду create
принимает название профиля и создаёт нужные для него конфиги 

Профили настраиваются в файле /etc/ximperdistro/ximperconf/profiles.json

Выглядит примерно так:
{
  "profiles": {
    "base": {
      "links": [
        {
          "sys": "/etc/ximperdistro/environment.d/ximper-qt.conf",
          "user": "{home}/.config/environment.d/ximper-qt.conf"
        }
      ]
    },
    "hyprland": {
      "binary": "Hyprland",
      "links": [
        {
          "apps": ["hyprlock", "hypridle", "hyprpaper"],
          "sys": "/etc/ximperdistro/hyprland/hypr/{name}.conf",
          "user": "{home}/.config/hypr/{name}.conf"
        },
        {
          "apps": ["swappy", "wlogout", "wofi"],
          "sys": "/etc/ximperdistro/hyprland/{name}",
          "user": "{home}/.config/{name}"
        }
      ]
    }
  }
}
Comment 6 Кирилл Уницаев 2025-09-08 22:38:03 MSK
Для Vano
https://gitlab.eterfund.ru/ximperlinux/ximperconf
Comment 7 Кирилл Уницаев 2025-09-28 18:42:20 MSK
Обновил структуру профилей для команды create
Добавил поля:
 copy - копирует файлы
 hyprvars - создаёт переменные для Hyprland
 sync-system-layouts - синхронизирует раскладку hyprland с xcb 

Профиль выглядит примерно так:

{
  "profiles": {
    "hyprland": {
      "binary": "Hyprland",
      "sync-system-layouts": true,
      "copy": [
      	{
      		"src": "/etc/skel/.config/hypr/hyprland.conf",
      		"dest": "{home}/.config/hypr/hyprland.conf"
        },
      	{
      		"src": "/etc/skel/.config/kitty/",
      		"dest": "{home}/.config/kitty"
        },
      	{
      		"src": "/etc/skel/.config/Kvantum",
      		"dest": "{home}/.config/Kvantum"
        },
      	{
      		"src": "/etc/skel/.config/waybar",
      		"dest": "{home}/.config/waybar"
        }
      ],
      "links": [
        {
          "apps": ["hyprlock", "hypridle", "hyprpaper"],
          "sys": "/etc/ximperdistro/hyprland/hypr/{name}.conf",
          "user": "{home}/.config/hypr/{name}.conf"
        },
        {
          "apps": ["swappy", "wlogout", "wofi"],
          "sys": "/etc/ximperdistro/hyprland/{name}",
          "user": "{home}/.config/{name}"
        }
      ],
      "hyprvars": [
      	{ "name": "terminal", "value": "kitty" }
      ]
    }
  }
}
Comment 8 Кирилл Уницаев 2025-10-12 00:00:20 MSK
Добавил elease-replace в профили для create
"release-replace": [
      	{
      		"src": "/etc/skel/.config/waybar/style-dark.css",
      		"dest": "{home}/.config/waybar/style-dark.css"
      	}

при обновлении os-release dest будет заменён на src

Добавил новые шаблоны путей для конфига
"~" -> home
"{home}" -> home
"{user}" -> user
"{name}" -> app name
"{hostname}" -> hostname
"{config}" -> {home}.config
"{ximperconf}" -> /etc/ximperdistro
Comment 9 Кирилл Уницаев 2025-10-19 00:31:50 MSK
Добавил hyprmodules

"hyprmodules": [
    {
        "module": "МОДУЛЬ",
        "if-exec": "КОМАНДА"
    }
]

Включает модуль Hyprland если вывод команды не пуст.
Если убрать "if-exec", будет включать без проверки.


===

Добавил дополнительные переменные

"hyprmodules": [
  {
    "module": "МОДУЛЬ",
    "user": ПОЛЬЗОВАТЕЛЬСКИЙ_МОДУЛЬ,
    "new-only": ТОЛЬКО_НОВЫЙ,
    "if-exec": "КОМАНДА"
  }
]

===

ximperconf hyprland module ..

Немного оптимизировал код управления модулями, убрал лишние повторения и разделил на функции.

ximperconf hyprland module info
Добавил ещё 1 статус - unused, означает что файл модуля найден, но он не используется в конфигурации.

Оптимизировал флаг --filter 

===

Перевёл конфиг на yaml

===

Начал добавлять управление плагинами hyprland
на данный момент есть команды list и status
Comment 10 Кирилл Уницаев 2025-11-30 00:24:43 MSK
hyprland plugin: Доделал команды load, unload, toggle

Улучшил структуру конфига и добавил переменную IsRoot для системных команд 

Добавил блок команд system
Первой такой командой стала fix-grub-resolution, команда меняет переменную GRUB_GFXMODE и обновляет граб
Comment 11 Кирилл Уницаев 2025-12-03 23:00:13 MSK
Разделил конфигурацию профилей на разные файлы
1 файл = 1 профиль 

улучшил структуру профилей, отделил зависимые от оболочки компоненты
добавил вывод списка модулей и их описаний 

добавил флаги для автоматического выбора одного модуля и запуска всех доступных
Comment 12 Кирилл Уницаев 2025-12-13 21:40:13 MSK
Отчёт за 6 дней

Сделал полный рефакторинг модуля ximperconf preset (бывший create)
 - Разделил на логичные подфункции, убрал лишний код
 - Вынес функции работы с файлами в отдельный files.go
 - Вынес логику работы с деревом вывода в модуль ui (подробнее ниже)
 - добавил подкоманды info, apply, apply-all (подробнее ниже)

------

Добавил модуль ui:

RenderTree cтроит классическое дерево с настраиваемым цветным выводом:
Заголовок:
├── {иконка} {значение} — {описание (опционально)}
└── {иконка} {значение} — {описание (опционально)}

RenderTreeLines  — обёртка для быстрого создания деревьев строк без цветного вывода:
Заголовок:
├── {строка}
└── {строка}

------

подкоманды info, apply, apply-all:
 - info выводит список профилей и их доступность
 - apply применяет профиль, если он доступен
 - apply-all применяет все доступные модули

------

Добавлены новые значения для профилей:

root: bool — указывает, требуется ли рут доступ для данного модуля 

system: — категория системных настроек
    grub: — категория настроек граба
        fix-resolution: true — установить рекомендуемое разрешение
        update: true — обновить граб после изменения настроек 

hyprland: — категория настроек hyprland
    options:
        sync-system-layouts: true — синхронизировать раскладку с xkb

    vars: — Переменные hyprland
        - var: "terminal"
          value: "kitty"
          force: true — Заменить, если есть

    modules: — Модули hyprland
        - module: "monitors"
          init: true — Создать пустой файл модуля, если его нет 
          user: true
          new-only: true
          if-binary: "nwg-displays" — Подключить только если есть бинарник 

Все изменённые переменные подписаны
Comment 13 Кирилл Уницаев 2025-12-16 22:39:49 MSK
добавил команду ximperconf hyprland module edit <module>
Запускает редактор с открытым файлом модуля.

Добавил проверку всех модулей и отображение количества ошибок в списке ximperconf hyprland module info 

также добавил ximperconf hyprland module check <module>
Команда проверяет модуль на ошибки и выводит их

Улучшил вывод ximperconf hyprland check
Comment 14 Кирилл Уницаев 2025-12-21 00:12:34 MSK
Hyprland/disable: добавил флаг --remove для полного удаления строки модуля из конфига
Preset: добавил поле action в структуру hyprland/module
Comment 15 Кирилл Уницаев 2026-01-14 18:21:57 MSK
Отчет за несколько дней!

Начал оптимизировать код работы с конфигурацией Hyprland, для начала убрал лишнее чтение конфига, но lav@ подсказал совершенно другую идею, далее реализовывал её.

Написал единую структуру HyprlandManager, которая 1 раз читает конфиг при инициализации и сохраняет в себя. Внутри структуры хранятся все спаршенные данные: путь к конфигу, модели модулей, переменных и плагинов.

Постепенно переводил все функции на методы этой структуры, теперь все они лишь читают строки из поля Lines, а не читают и записывают конфиг сами.

Далее занялся реализацией общей системы статусов для всех команд и форматов.
Структура ItemStatus хранит иконку, цвет и лейбл статуса.

Перевел весь код на использование этой структуры.

Сделал новую функцию module show <module> для вывода полной информации о каком-то одном модуле. 

Добавил флаг format=json для большинства команд с выводом. 

Написал новый вариант функции show (с поддержкой json)
Comment 16 Кирилл Уницаев 2026-01-14 18:23:17 MSK
Случайно указал время в часах :/
Comment 17 Кирилл Уницаев 2026-01-24 20:33:40 MSK
С момента релиза Ximper 0.9.3 на Hyprland, самой простой, но часто встречаемой проблемой у пользователей была сложная настройка обоев, даже для такой простой операции требуется редактировать конфиги и перезапускать сервисы!

Было принято решение сделать поддержку управления обоями прямо в ximperconf.
В месте с этом решил расширить функционал и добавить возможность ставить разные обои для разных цветовых тем.

Также есть интеграция данной функции в TuneIt

Коммит: https://gitlab.eterfund.ru/ximperlinux/ximperconf/commit/1dec1397b9d53e94c99e477e3f7ea599418523b8

Код ещё не очень оптимизирован, однако основной функционал работает.

ximperconf hyprland wallpaper set - установить обои
   -m | --monitor [Монитор|defauil|all] - выбрать монитор
   -dark [путь] - обои для тёмной темы
   -light [путь] - обои для светлой темы

ximperconf hyprland wallpaper get - получить путь к обоям
   --light - для светлой темы
   --dark - для тёмной темы
   --pair - вернуть пару [light, dark]
   -m | --monitor - выбрать монитор
   -o | --format [text|json] - формат

ximperconf hyprland wallpaper info - информация о настроенных обоях
   -o | --format [text|json] - формат

ximperconf hyprland wallpaper apply [light|dark] - применить тему

Данные хранятся в конфиге ~/.config/ximper/wallpaper.yaml (путь возможно изменится)

Для установки обоев при запуске системы в автозапуск прописывается следующее:
ximperconf hyprland wallpaper apply
Comment 18 Кирилл Уницаев 2026-02-02 18:32:05 MSK
Планируя делить процесс разработки на подзадачи с ясной целью, данная задача не имеет конкретной цели, поэтому закрываю