О версионировании
Версионирование отдельных частей проекта осуществляется независимо. Версии отдельных компонентов SDE не привязаны к версии SDE как целого.
Для версионирования библиотек используется Semantic Versioning, однако только для тех major versions, которые явно указаны как таковые. Например, от libfm нам достался номер версии 1.2.0, который мы не намерены откатывать на 0.*.*, однако ветка 1.* не является стабильной и не следует правилам Semantic Versioning.
Для приложений следование правилам Semantic Versioning не гарантируется.
Для ветки SDE 0.* будет использовано следующее чередование релизов:
- Нечётные минорные релизы (0.1, 0.3, 0.5…) — исправление известных проблем, совершенствование пользовательского интерфейса, реализация возможностей, не требующих переработки архитектуры и API.
- Чётные минорные релизы (0.2, 0.4, 0.6…) — работа над архитектурой компонентов, задачи рефакторинга, переработка API.
Ветка 1.* будет создана только когда все необходимые API будут признаны стабильными.
Намеченные Milestones в работе над SDE
| Milestone | Основная задача |
|---|---|
| 0.1 | Приведение в надлежащий вид ссылок, копирайтов, лицензий и решение прочих организационных вопросов |
| 0.2 | Переработка API резолвера ресурсов, внедрение резолвера во все компоненты проекта |
| 0.3 | Реализация новых возможностей |
| 0.4 | Разработка и внедрение libsde-utils-amdf |
| 0.5 | Реализация новых возможностей |
| 0.6 | Переработка libsmfm |
| 0.7 | Реализация новых возможностей |
Компоненты SDE
| Компонент | Назначение |
|---|---|
| Опубликованные: | |
| libsde-utils | унифицированные средства резолвинга путей к ресурсам и файлам конфигурации; средства ведения отладочного лога; некоторые вспомогательные функции |
| libsde-utils-x11 | вспомогательные функции для работы с X11 |
| libsde-utils-gtk | вспомогательные функции для работы с Gtk |
| libsde-utils-jansson | вспомогательные функции для работы с Jansson |
| libsmfm-core | средства управления файлами, не зависящие от графического тулкита |
| libsmfm-gtk | средства управления файлами, зависящие от Gtk |
| waterline | фреймворк апплетов рабочего стола |
| stuurman-desktop | менеджер иконок и фона рабочего стола |
| stuurman | файловый менеджер |
| spicview | средство просмотра изображений |
| rainbow-cm | менеджер буфера обмена |
| qk | текстовый редактор на основе medit |
| Запланированные: | |
| libsde-utils-amdf | Application Metadata Framework - библиотека-перечислитель метаданных приложений |
| sde-session-manager | Менеджер графического сеанса |
| sde-screensaver | простой скринсейвер, ставящий акцент на надёжности и безопасности, а не на богатстве настроек |
| sde-task-manager | диспетчер задач и монитор быстродействия системы |
| stuurman-find | консольная утилита поиска файлов с использованием libsmfm |
| stormwm | менеджер окон |
Глобальные задачи (затрагивающие все или большинство компонентов проекта)
В этом разделе более развёрнуто описаны упомянутые в списке milestone-ов задачи:
Унифицированный доступ к ресурсам и файлам конфигурации приложений
Текущая реализация резолвера путей в libsde-utils построена на в корне ошибочных принципах. Следующие задачи должны успешно решаться после редизайна API и его реализации:
- Приложение без перекомпиляции и дополнительной настройки запускается и работает из любого установочного префикса.
- В одном установочном префиксе (не важно, системном или нет) может располагаться произвольное количество агентов (агент - приложение или библиотека с уникальным идентификатором).
- Агентам, работающим в одном процессе, доступны для перечисления ресурсы из всех сконфигурированных префиксов (системные префиксы, заданные пользователем префиксы, автодетектированные префиксы).
- При помощи конфигурационных файлов возможно переопределение:
- имени агента (что, в частности, приводит к смене пути хранения настроек);
- префикса или префиксов (в частности, приложение может хотеть sysconfdir или localstatedir, не совпадающие с установочным префиксом);
- прочих переменных, предоставленных агентом для переопределения;
- отдельных путей ресурсов на иные по маске glob или регулярному выражению.
- Как следствие предыдущего пункта - возможность использования приложений в режиме portable, когда все данные и конфигурация приложения располагаются в пределах одного каталога, по какому бы пути он ни был расположен.
Предполагаемый интепретатор конфигурации резолвера - partcl [1], [2], будет встроен в libsde-utils.
Перечислитель метаданных приложений и других компонент
Сейчас для обработки файлов *.desktop используются:
- libmenu-cache (часть LXDE).
- GAppInfo из Glib.
- Непосредственный анализ содержимого файлов.
Этот зоопарк необходимо устранить, разработав и внедрив в состав SDE библиотеку libsde-utils-amdf, обеспечивающую слежение за всеми иcточниками файлов *.desktop, файлами mimeinfo.cache, файлами mimeinfo.cache, mimeapps.list, defaults.list и т.п., предоставляющую унифицированный доступ к этим данным. Также обеспечивающую слежение и за файлами *.menu и *.directory и построение оглавления для меню приложений.
В перспективе - также необходимо обеспечивать сопоставление файлов *.desktop, классов окон WM_CLASS и имён dbus, аналогично тому как это делает bamf.
Переработка архитектуры libsmfm
Примерный план того, что должно получится:
Фундамент фреймворка:
| Тип данных | Назначение |
|---|---|
| FmPath | путь файловой системы или URL |
| FmPathList | список FmPath |
| FmFileInfo | контейнер метаданных файла |
| FmFileInfoList | список FmFileInfo |
| FmMonitor | монитор файлов |
| FmFolder | объект, обеспечивающий загрузку данных из каталога и слежение за появлением/удалением/изменением файлов |
| FmMimeType | тип MIME |
| FmIcon | описатель ассоцированной с файлом иконки |
| FmFile | субкласс GFile для использования в предоставляемых расширениях GIO |
| FmJob | базовый класс для многопоточных операций |
| FmFileInfoJob | обеспечивает асинхронное чтение данных для указанного списка FmFileInfo |
| FmDirListJob | обеспечивает асинхронное чтение данных для указанного каталога |
| FmSimpleJob | обёрртка для запуска указанной функции асинхронно без необходимости создания субкласса от FmJob |
Полезные для менеджмента файлов субклассы FmJob:
| Тип данных | Назначение |
|---|---|
| FmDeepCountJob | рекурсивно подсчитывает элементы |
| FmFileOpsJobDelete | рекурсивно выполняет различные операции (копирование, перемещение, удаление и пр.) |
Расширяемая функциональность:
| Тип данных | Назначение |
|---|---|
| FmAddonEnumerator | обеспечивает перечисление и загрузку модулей, расширяющих функциональность |
| FmThumbnailProvider | высокоуровневый интерфейс, предоставляющий эскизы содержимого файлов |
| FmHighlighProvider | высокоуровневый интерфейс, перечисляющий предлагаемые цвета для имён файлов различных типов |
| FmFileMenuProvider | высокоуровневый интерфейс, обеспечивающий построение контекстного меню файлов |
| FmAppInfoProvider | высокоуровневый интерфейс перечислителя приложений и их свойств |
| FmFileLauncher | обеспечивает выполнение над файлами canonical verbs (Open, Run, View, Play, Edit) с использованием информации от FmAppInfoProvider и FmFileMenuProvider |
| FmThumbnailHandler | интерфейс к модулю расширения функциональности |
| FmHighlighHandler | интерфейс к модулю расширения функциональности |
| FmFileMenuHandler | интерфейс к модулю расширения функциональности |
| FmAppInfoHandler | интерфейс к модулю расширения функциональности |
Реализации по умолчанию:
| Тип данных | Назначение |
|---|---|
| FmDefaultFileNameHandler | строит меню для canonical verbs на основании данных от FmAppInfoProvider |
| FmDefaultHighlighHandler | простой хайлайтер, читающий соответствия типа MIME и цвета из конфига |
| FmDefaultAppInfoHandler | перечисляет приложения с использованием libsde-utils-amdf |
Дополнительные модули в составе фреймворка:
| Название | Назначение |
|---|---|
| thunar-custom-actions-handler | читает custom actions из файлов конфигурации, применяемых в Thunar |
| gdk-pixbuf-handler | строит эскизы для файлов, поддерживаемых gdk-pixbuf |
| static-custom-verbs-handler | перечисляет дополнительные пункты контестного меню, описанные при помощи особой разновидности файлов *.desktop |
Модули GIO в составе фреймворка:
| Название | Назначение |
|---|---|
| fm-vfs-search | поиск файлов по различным критериям |
| fm-vfs-menu | представление меню приложений в виде дерева папок |
Дополнительная функциональность
| Название | Назначение |
|---|---|
| fm-templates | перечисляет известные шаблоны для создания новых файлов |
| fm-bookmarks | управляет списком bookmark-ов |
TODO
Различные задачи, не занесённые в багтрекер на данный момент. Если вы заинтересованы в решении каких-то из этих задач, ваши pull-реквесты горячо приветствуются:
- waterline: реализовать поддержку нового типа загружаемых модулей - plugin enumerator. Plugin enumerator - это модуль, перечисляющий и инстанцирующий модули апплетов. Таким образом, станет возможно реализоывать переходники, подгружающие в панель апплеты с другим API.
- waterline: launchbutton: баг: элементы контекстного меню работают только если нажат Ctrl.
- waterline: cpu: баг: изменение размера иконки через контекстное меню не оказывает никакого действия
- waterline: menu: баг: изменение размера иконки через контекстное меню не оказывает никакого действия
- waterline: menu: добавить возможность переопределять в настройках размер иконок в меню (отдельно - для верхнеуровнего меню и для подменю)
- waterline: menu: добавить возможность переопределять в настройках иконку и заголовок меню, отображаемые на панели (по умолчанию считываются из файла меню)
- waterline: menu: реализацию подменю “Recent Documents” следует переписать с использованием libsmfm, пункты меню должны отображать контекстное меню файла при нажатии ПКМ; использовать gtk_recent_chooser_menu_new_for_manager только как fallback, когда libsmfm не установлена
- waterline: dclock: заменить обращение к grep-awk-sort на ручной парсинг списка таймзон
- waterline: dclock: обновлять отображаемое время при скачках системного времени: https://lkml.org/lkml/2010/9/16/405
- waterline: dclock: добавить возможность отображать аналоговые часы, взяв код и изображения из cairo-clock
- waterline: dclock: добавить в выпадающий список несколько стандартных вариантов для полей “Формат часов” и “Формат подсказок”.
- waterline: два регулятора громкости объединить в один универсальный + добавить поддержку PA.
- waterline: dirmenu: добавить поддержку search-as-you-type
- waterline: battery_indicator: реализовать поддержку для систем BSD (пример кода: http://www.nongnu.org/gap/batmon/)
- waterline: battery_indicator: добавить режим отображения в виде иконки (пример кода: https://github.com/valr/cbatticon)
- waterline: battery_indicator: для режима отображения в виде иконки реализовать смешивание иконок аналогично как это следано в volumealsa
- waterline: создать класс виджетов, который будет являться окном контейнером для выпадающих элементов, таких как регулятор громкости и календарь. Класс должен обеспечивать позиционирование окна относительно элемента панели и отрисовку границ.
- waterline: всплывающие подсказки должны позиционироваться за границами панели.
- waterline: xkb_groups: в режиме “показывать раскладку как флаг” вычислять ширину апплета по максимальной из ширины меток, чтобы устранить “дёргание” при смене раскладки.
- waterline: taskbar: в меню, открываемом при щелчке по пустой области, добавить пункты:
- Окна каскадом
- Окна сверху вниз
- Окна слево направо (требуется интеграция с WM)
- waterline: в исходниках заменить все табуляции на пробелы
- waterline: в исходниках привести к единому виду размер отступов
- waterline: разбить configurator.c на несколько файлов
- waterline: использовать привязку панели к монитору по имени
gdk_screen_get_monitor_plug_name(), а не по номеру монитора - stuurman-desktop: добавить в настройки пункт: “Скрывать/Отображать значки двойным щелчком по рабочему столу” (сама возможность уже есть, требуется её включение/отключение в настройках)
- stuurman-desktop: в контекстном меню рабочего стола делать неактивными пункты, относящиеся к файлам, когда значки раблочего стола скрыты.
- stuurman-desktop: сделать показ/скрытие иконок анимированным (с затуханием)
- stuurman: реализация опции –display-in-folder - открыть каталог с файлом и поставить курсор на указанный файл
- spicview: добавить панель превью списка файлов с навигацией по ней
- spicview: реализовать возможность передавать в агрументах программы несколько файлов (сейчас обрабатывается только первый)
- spicview: загрузку JPEG выполнять при помощи libjpeg(-turbo), чтобы: правильно обрабатывать color spaces
- spicview: реализация поддержки цветовых профилей
- spicview: реализация опций –zoom=fit, –zoom=xx%
- spicview: отображать не только имя файла, но и полный путь к каталогу, содержащему файл, в заголовке окна
- spicview: добавить пункт меню “Открыть расположение файла”
- spicview: весь код, взятый из jhead, собрать в кучу и как-то логически отделить от остального
- spicview: добавить поддержку DevIL как опционального backend
- spicview: добавить поддержку ImageMagick как опционального backend
- spicview: поддержка печати
- spicview: реализовать возможность обрезать изображения
- spicview: реализовать возможность изменять размер изображений
- spicview: реализовать возможность изменять насыщенность, яркость и контрастность
- spicview: добавить настройку: “Показывать скрытые изображения”
- spicview: добавить настройку поведения на колесо мыши: навигация по изображением, масштабировать изображение, прокрутка изображения вверх/вниз
- spicview: добавить настройку поведения на стрелки: навигация по изображением, прокрутка изображения
- new: создать утилиту sde-adjust-clock для настройки времени и синхронизации времени через интернет.
- new: создать независимую от WM утилиту, отображающую список окон по хоткею (то есть, “оторвать” alt-tab от WM). Предполагаемое название - sde-window-switcher.