AppExamples.md


Арго Фреймворк Википедия

Содержание

SDK версия фреймворка содержит некоторый набор начальных приложений, которые позволяют в какой-то степени раскрыть возможности фреймворка и предоставить необходимые примеры использования API и XML описаний приложений. Все приложения не идеальны, они выполняют лишь базовые функции, и недостатки, чаще всего, связаны с дефектами в их логике (но не всегда). До логики приложений руки доходят, к сожалению, лишь эпизодически.

Приложение Основного Экрана (Idle Screen)

Приложение основного экрана реализует начальное окно, которое полностью видимо при отсутствии запущенных и развернутых графических приложений. В первую очередь, оно предназначено для запуска других приложений, все приложения могут быть запущены с его помощью (если они еще не запущены). Также оно визуализирует текущий статус приложений (запущено приложение или нет, сколько экземпляров приложения запущено). Дополнительно на нем реализован виджет для отображения даты и времени.

Начальный экран представлен ниже:

Screenshot of the initial screen.

На изображении видно фоновое изображение, панель опций и виджет для отображения даты и времени. Есть еще панель приложений, но она в данный момент скрыта. На панели опций кнопка “Система” не функциональна, нет соответствующих приложения. Кнопка “Запуск” открывает панель приложений, кнопка “Файлы” - разворачивает окно поиска файлов (сервис поиска файлов - он уже запущен, поэтому происходит именно разворачивание окна), кнопка “Установка” позволяет запустить приложение установки, кнопка “Настройки” запускает приложение настроек. Виджет отображения даты и времени отображает текущее время в заданном формате (24 или 12 часовый формат) и текущую дату в формате, соответствующем выбранному языку. В данном случае время отображается в 24 часовом формате и дата в формате русского языка. Другие форматы будут показаны на изображениях ниже.

Нажимаем кнопку “Запуск” для открытия панели приложений:

Screenshot of the categories.

В данном случае отображается не список приложений, а список категорий. Во фреймворке приложения размещаются (физически и логически) по отдельным категориям. В данном случае есть три категории: общие, тест и система. Дополнительные категории можно создать, используя отладочное приложение и терминал, в дальнейшем это можно будет сделать через приложение установки. В категории “Общие” размещаются приложения, не относящиеся к управлению системой (редактор текста, установленные пользовательские приложения и тому подобное). В категории “Тест” размещаются тестовые приложения для проверки API. В категории “Система” размещаются приложения, связанные с управлением системой: сервисы (File View, System Alert), фоновые приложения (Debug Shell, USB Monitor), настройки (Settings), установки приложений (Installer) и, собственно, само приложение экрана.

Содержимое категории “Общие” приведено на изображении ниже:

Screenshot of the common category.

В списке показано два приложения: редактор текста и калькулятор, которого на данный момент нет, но оно “предустановлено” (его нет в SDK). Также после установки приложения для просмотра изображений, оно здесь также появится. На иконке редактора текстов есть зеленый крыжик с цифрой 2, это означает что запущено два экземпляра редактора. При нажатии на иконку развернутся окна обоих экземпляров, наложенные друг на друга, пока нельзя выбрать какой конкретно экземпляр развернуть (это недостаток пользовательского интерфейса). При нажатии на кнопку калькулятора будет выдано системное предупреждение, что приложение не найдено (будет показано далее).

Содержимое категории “Система” представлено на следующем изображении:

Screenshot of the system category.

Для того чтобы продемонстрировать возможности фреймворка, был изменен язык системы на английский, формат времени на 12-и часовый и выгружен системный сервис File View. В результате изменился язык во всех надписях, и изменился формат времени и даты. Выгрузка системного сервиса привела к тому, что соответствующая иконка стала нажимаемой и отмечена красным крыжиком, что говорит о том что сервис неработоспособен. Нажатие на иконку восстановит работоспособность сервиса. Остальные иконки не нажимаемые (кроме приложения настроек и установки) и отмечены зеленым крыжиком с галочкой - это говорит о том, что это синглетон приложение (галочка вместо цифры, приложение может быть только в единичном экземпляре) и что приложение работает нормально. Что касается приложений настроек и установки, то они просто не загружены, их не надо держать постоянно загруженными, чтобы не тратить оперативную память. Нажатие на иконку загрузит приложение. Надо отметить недостаток интерфейса: хотя в категории приложение отмечается как неработоспособное, в иконках уровнем выше (в иконке категории и панели опций) это не отображается никак, что затрудняет распознавание проблемы, вернее, что проблема существует. Это недостаток приложения и, надеюсь, что он будет со временем исправлен.

Среди других недостатков приложения нужно выделить следующие:

  • Самый существенный недостаток в том, что страницы панели приложения хотя и можно прокручивать вправо-влево, но прокрутка работает плохо, наблюдаются дефекты, зависания и ошибки фреймворка и приложения. Это связано с тем, что виджет панели приложения реализован как пользовательский, и прокрутка в нем сделана плохо. Пользовательские виджеты часто используют специальную динамическую библиотеку (DLL) для реализации логики виджета (как и в данном случае). Написать её качественно непросто, а прокрутка по практике довольно сложна. Для исправления этой ситуации в приложении надо использовать встроенный виджет динамического списка вместо пользовательского, там прокрутка в значительной степени отлажена. На данный момент функционал прокрутки заблокирован. Выход из просмора списка приложений выполняется либо повторным нажанием на кнопку запуска в панели опций (или любую другую), либо нажатием вне списка приложений.
  • Графика иконок выглядит посредственной, это касается, в первую очередь, бордеров и формы кнопок. Нет плавного перехода цветов, как хотелось бы, а форма вообще выглядит топорно. Кроме того, цвет фона кнопок не меняется при изменении темы. Все это реализуемо на существующей версии фреймворка, но на реализацию лучшей графики нужно время и, возможно, некоторые инструменты в утилитах (это касается формы кнопок).
  • При смене фонового изображения остаются артефакты от прежнего если панель приложений была активирована. Это недоработки фреймворка, но и в приложении, возможно, тоже нужны изменения.

Весь код приложения доступен в SDK по пути applets/idle/.

Приложение Настроек (Settings)

Приложение настроек предназначено для изменения настроек системы, таких как язык системы, смены тем, смены фонового изображения, отображения формата времени и других визуальных и фоновых параметров. Все изменения, сделанные в приложении, сохраняются между перезагрузками системы. Состояние страниц приложения также сохраняется между перезапусками системы. Разумеется, это системное приложение, но оно всегда запускается пользователем по необходимости, с помощью иконки в панели опций или иконки в категории “Система” (см. Приложение Основного Экрана). Свернуть это приложение нельзя, можно только выйти (оно занимает много оперативной памяти в силу своей функциональности) и в силу своего высокого оконного приоритета перекрывает любое окно кроме системных предупреждений.

При первом запуске системы после установки, приложение настроек будет выглядеть так:

Screenshot of the settings first launch.

Слева находится панель опций, и выбрана опция установки даты и времени (Date/Time). На данной вкладке пока возможна только установка формата времени (12 или 24 часовый формат) в основном поле окна. Внизу расположены две кнопки: “Applay” и “Exit” (соответственно “Применить” и “Выход” на русском). Они есть на каждой вкладке, текст зависит от выбранного по умолчанию языка системы (пока это английский, но это временно :), изменить легко). Кнопка “Apply” будет заблокирована до тех пор, пока не будет изменен какой-либо параметр системы, любой, на любой вкладке. Если все параметры вернутся к изначальным, она вернется к заблокированнуму состоянию. Формат времени не зависит от выбранного языка.

Предполагается, что на этой вкладке будут и другие параметры, например, изменение формата даты или временной зоны. Также предполагается предпросмотр форматов. Но это дело будущего. Пока можно посмотреть на то, как меняется состояние кнопки “Apply” при измении формата времени.

Перейдем на следующую вкладку “Languages”:

Screenshot of the languages settings.

В основном поле выбрана опция “English”, но доступны опции русского и белорусского языков. Опции немецкого, французского и испанского хоть и есть, но фреймворк их не поддерживает, поэтому кнопки заблокированы. Данные опции приведены лишь для демонстрации того, что фреймворк может настраивается под необходимые языки, но не обязательно будет их поддерживать, данные языки прописаны в свойствах приложения, но фреймворк их не знает. Перейдем на наш, родной, Русский (или Беларускі, кому как удобнее), далее в тексте все по русски. После смены языка надо нажать кнопку “Применить”, чтобы изменения вошли в силу и это будет видно сразу в приложении.

Следующая вкладка - “Дисплеи”:

Screenshot of the displays settings.

Эта вкладка предназначена для изменения фонового изображения на дисплеях фреймворка и вывода параметров дисплея (разрешения, кодировки и тому подобное, но это пока не сделано). В основном поле окна представлено превью текущего изображения. В моей системе реализовано три дисплея, поэтому в левом нижнем углу под изображением есть список из 3-х дисплеев для выбора нужного. В SDK представлен только один дисплей, но можно добавить и дополнительный в основном конфигурационном файле. Правда он будет пустой, поскольку нет привязанных к нему приложений. Можно попробовать привязать к нему приложение системных предупреждений, оно поддерживает до 3-х дисплеев.

В правом нижнем углу расположены три кнопки: “Очистить”, “Умолчание” и “Изменить”. Кнопка “Очистить” удаляет фоновое изображение, дисплей при этом будет залит черным цветом (изменить это пока нельзя). Кнопка “Умолчание” возвращает изображение по умолчанию, это как раз текущее изображение. Кнопка “Изменить” позволяет выбрать файл изображения, используя сервис File View. Любая кнопка после установки изображения меняет название на “Назад”, чтобы была возможность отменить изменение, остальные кнопки на этот момент блокируются:

Screenshot of the display change.

При этом кнопка “Применить” разблокирована и можно применить изменения.

Выбранное изображение может быть существенно больше, чем размеры дисплея (800х600), в этом случае изображение будет сжато до размеров дисплея, чтобы картинка отображалась полностью как в превью, так и фоне дисплея. Если изображение очень большое, то для загрузки превью и для примениия измений потребуется заметное время (глазом заметное) на сжатие размеров изображения. Однако при последующих загрузках фреймворка такой лаг заметен не будет. Фреймворк копирует сжатое изображение в специальный файл, соответствующий размерам дисплея, и фоновое изображение грузится уже из него, что весьма быстро. Этот механизм управляем через элементы системной конфигурации (sysconfig).

Если изображение меньше размеров дисплея, то оно просто будет размещено в центре, поля по краям будут залиты цветом по умолчанию (черным).

Пока есть некоторые требования к изображению: формат файла должен быть BMP 24-бита, и соотношение сторон изображения должно соответствовать соотношению сторон дисплея. Если будет несоответствие, то в превью и на фоне будут поля, залитые черным (по вертикали или горизонтали). По поводу формата файла - фреймворк пока другие форматы вроде PNG не поддерживает (хотя это предполагается). В дальнейшем в приложении будет сделана возможность выбрать не все изображение, а только какую-либо его часть, отрезав ненужные элементы. В этом случае проблема с несоответствием сторон будет устранена.

Есть еще одно полезное замечание: сервис File View дает доступ только к определенным папкам на файловой системе хостовой машины, так что взять файл откуда попало не получится. Файлы изображений должны быть размещены в домашней директории фреймворка: это папка rootfs/home/argo/ в корне рабочего пространства (workspace). Разумеется, это сделано специально, чтобы у приложений не было доступа ко всей файловой системе рабочей машины (доступы к определенным директориям настраиваются в корневом конфигурационном файле системы).

Перейдем следующей вкладке “Темы”:

Screenshot of the theme settings.

На этой вкладке есть только возможность выбора между двумя доступными темами: темно-синей и темно-зеленой. Названия довольно условны и не очень соответствуют реальности :). На данный момент механизм тем существует, но набор элементов темы слишком маленький, чтобы охватить все аспекты пользовательского интерфейса, и этот набор будет, конечно, пополнятся в дальнейшем, как и набор тем. Единственное, что можно сказать пока, что приложение настроек само обнаруживает доступные темы, так что при пополнении набора новые темы будут будут доступными сразу, без изменений в самом приложении (это касается и языков и набора дисплеев).

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

Теперь изменим тему на темно-зеленую и перейдем к последней вкладке - “Отладка”:

Screenshot of the debug settings.

На этой вкладке есть только один элемент - переключатель включения и выключения таймеров приложений. Сделано это не от хорошей жизни :). Некоторые приложения (Idle Screen и USB Monitor) содержат периодические таймеры, которые срабатывают в процессе отладки фреймворка в отладчике (в часности, при смене текущего времени). Это приводит к внутренним вызовам фреймворка и при нахождении в точке останова (breakpoint) вызывают кучу ошибок, что сильно мешает отладке. Выключение таймеров исключает эту ситуацию, и можно отлаживаться спокойно. Разумеется, при отключении таймеров, текущее время изменятся не будет (и вообще виджет будет отсуствовать при перезагрузке фреймворка) и не будут обнаруживаться USB устройства.

На этом пожалуй все, что можно сказать по поводу приложения настроек. Весь код приложения доступен в SDK по пути applets/settings/.

Сервис Поиска Файлов (File View)

Данный сервис предназначен для поиска или сохранения файлов на доступных директориях файловой системы рабочей машины или внешних носителях. Термин “сервис” предполагает, что приложение стартует автоматически, находится в единичном экземпляре (синглетон), выгрузить его нельзя никак (даже сам себя сервис выгрузить не сможет, может только отладочное приложение и то не в SDK). Окно сервисов, если есть, всегда скрыто (не просто свернуто) и разворачивается всегда только самим сервисом по запросу (свернутое окно можно развернуть другим приложением). Сервис всегда имеет уникальное и предопределенное имя, задаваемое атрибутом “service” при добавлении сервиса в систему.

Сервис File View в системном конфигурационном файле определен так:

    <applet appname="FileView" appmain="fileview" service="fileview" dll="fileview.so" privilege="0x00000F03" src="fileview_root.fml" icon="fileview1_icon.bmp">
      <appref window="main_window" display="display_1" plane="services"/>
    </applet>

Сервисы обычно имеют более высокий оконный приоритет, что определяется выбором определенного уровня, в коде выше это строка plane=“services”.

Когда приложению нужно получить информацию от сервиса, оно отправляет запрос (request), используя имя нужного сервиса. После получения запроса сервис его обрабатывает и отсылает отправителю ответ (reply) с запрашиваемой информацией. Запрос и ответ упаковываются в структуры данных, соответствующие данному сервису. Так работает и данное приложение. Отправитель отсылает запрос на открытие или сохранение файла, сервис разворачивает свое окно, выбирается файл для открытия или имя для его сохранения, и после отправки ответа скрывает окно снова до следующего запроса (а он может быть в очереди). Важно то, что сервис выбранный файл не открывает и не сохраняет, это не его задача. Сервис предоставляет информацию о пути и имени файла, остальное делает приложение-отправитель на основе этой информации.

Итак, в панели опций на основном экране нажимаем кнопку “Файлы” и получаем результат на картинке ниже:

Screenshot of the fileview from idle screen.

На самом верху в центре заголовок окна, я не обращал бы на это внимание, но заголовок определяется приложением-отправителем. В данном случае он не был определен и заголовок определен самим сервисом, на последующих примерах он будет другим. В правом верхнем углу располагается панель дополнительных операций, они будут рассмотрены далее. Ниже располагается строка с текущим путем до файловой системы (это не абсолютный путь, а путь в домашней директории - “home:”). Это не просто строка с путем, а элемент навигации по папкам, нажатие на имя папки в пути приведет к переходу в данную папку.

Ниже, слева, расположена панель доступных файловых систем фреймворка (это виртуальные файловые системы, привязанные к конкретным директориям на файловой системе рабочей машины) и съемных носителей, если таковые есть. В данный момент мы находимся в домашней директории, расположенной в папке rootfs/home/argo/ в корне рабочего пространства. В основном пространстве окна показан список файлов и папок находящихся в данной директории (у меня несколько другая папка, в SDK она почти пуста и наполнить ее ваша задача). Внизу слева имя выбранного файла или имя для сохраняемого файла (тут тоже пусто, поскольку файл не выбран). Справа располагаютя две кнопки “Отменить” и “Открыть”. Кнопка “Открыть” заблокирована, поскольку файл не выбран. Кнопка “Отменить” скрывает окно, а приложение-отправитель получает ответ что операция отменена.

При нажатии на иконку директории в списке, она будет выбрана, но кнопка “Открыть” остается заблокированной. Повторное нажатие открывает данную директорию. При выборе файла кнопка “Открыть” разблокируется, и можно открыть файл. Повторное нажатие на иконку сбросит текущий выбор. Поскольку сервис был вызван из приложения Idle Screen, то возникает вопрос, а какое приложение откроет файл? Приложение экрана, получив ответ от сервиса, анализирует расширение файла и ищет подходящее приложение, чтобы открыть данный файл. У него есть полная информация обо всех установленных приложениях, и в этой информации указано, какие расширения поддерживает то или иное приложение. В частности, расширение “txt” ассоциировано с приложением редактора текстов, он и будет выбран для открытия таких файлов. Если подходящее приложение не найдено, то файл открыт не будет, а в логе будет предупреждение. Это опять недоработка пользовательского интерфейса, должна быть предоставлена возможность выбора из списка доступных приложений. В самом сервисе также надо отображать иконку приложения ассоциированного с файлом, но это также пока не сделано.

Панель дополнительных опций позволяет сделать несколько полезных операций: первая иконка с домиком позволяет вернуться в корень домашней директории в одно нажатие; вторая позволяет создать новую директорию; третья кнопка с пером заблокирована, пока не выбран какой-либо файл или папка, она предназначена для переименования данного элемента; последняя кнопка со звездочкой предназначена для маркирования текущей директории как фаворита, но этого функционала пока нет.

На картинке ниже показан интерфейс при переименовании файла:

Screenshot of the fileview rename file.

Появляется диалоговое окно, которое приглашает ввести новое имя файла и подтвердить (или отклонить) переименование. Поскольку файл был назван неправильно, то я подтвердил перименование.

В логике приложения есть ряд мелких дефектов, например, после переименования фокус на файле был потерян, ни один элемент не выбран, а кнопка “Открыть” остается активной. Со временем эти дефекты будут исправлены.

Сервис может быть вызван из любого приложения, где требуется открыть или сохранить файлы. Разумеется, такая функциональнось есть и в редакторе текста. На изображении ниже представлен интерфейс сервиса при открытии файла из приложения редактора:

Screenshot of the fileview open file.

Никаких особенных отличий на данной картинке нет, но изменен заголовок окна, по нему видно, что сервис выполняет запрос из редактора текста на открытие файла. В данном случае файл будет открыт, невзирая на расширение (точнее, его отсутствие). Заголовок не русифицирован, поскольку есть некоторые недостатки в редакторе при формировании запроса. Также тут показано, как работает путь до директории в случае очень длинного пути, и доступная ширина виджета не позволяет его отобразить полностью. Часть пути убрана и заменена символами “…”, что позволяет увидеть оставшуюся часть. Нажатие на имя директории в пути приведет к переходу в эту директорию. Когда путь короче, чем доступно в данном виджете путь будет показан полностью, но возможность такой навигации сохранится.

На следующем изображении показана обработка запроса на сохранение файла:

Screenshot of the fileview save file.

На картинке изменился заголовок, теперь он говорит о том, что мы хотим сохранить файл. Изменилось и название кнопки “Открыть”, теперь она называется “Сохранить”. В поле имени файла теперь указано текущее имя файла “undefined”. В данном случае я пытаюсь сохранить новый файл у которого пока нет имени (оно указано в запросе). Он так и будет сохранен, если его не изменить. Сервис не проверяет, есть такой файл или нет, это проблема запрашивающего приложения (может это и не очень хорошо). Разумеется, если у файла уже есть нормальное имя, оно и будет указано как текущее. Если выбрать какой либо файл из списка, то он будет перезаписан (если приложение позволит).

Добавлю еще несколько слов про пользовательский интерфейс: не секрет, что папка может содержать множество файлов, и отобразить все файлы сразу не получится, места не хватит. В этом случае список файлов можно прокручивать по вертикали, сдвигая курсор в окне вверх/вниз при нажатой левой клавише мыши (так работает везде, где возможна прокрутка содержимого). В рамках SDK другого варианта просто нет. Нажатие левой кнопки мыши эквивалентно касанию к сенсорному экрану.

Среди общих недостатков приложения можно выделить низкое качество графики в отдельных элементах, это касается панели дополнительных опций и иконок файлов в списке. Также в полях ввода текстов (кроме пути до директории) используются устаревшие шрифты, подлежащие замене.

Весь код приложения доступен в SDK по пути applets/fileview/.

Сервис Системных Сообщений (System Alert)

Сервис системных сообщений предназначен для вывода сообщений из ядра фреймворка и поэтому является весьма специфическим сервисом, это единственный сервис, который непосредственно работает с ядром фреймворка и не взаимодействует с другими приложениями (пока, во всяком случае), подробнее можно посмотреть на странице Введение в разделе “Менеджер Системных Сообщений”. Приложение имеет специальное имя сервиса “sysalert”, которое используется для привязки сервиса к менеджеру сообщений.

Сервис System Alert в системном конфигурационном файле определен так:

    <applet appname="SysAlert" appmain="SysAlert" service="sysalert" privilege="0x00007701" src="sysalert_root.fml" crp="sysalert.crp">
      <appref window="errwnd_1" display="display_1" plane="sysalert"/>
    </applet>

Оконный приоритет у данного сервиса максимальный, чтобы перекрывать любое окно, при выводе сообщения все остальные окна недоступны. В текущей версии он выводит сообщения, связанные с неудачным запуском приложения, некорректой работой коллбэков приложений и аварийным завершением приложений.

Сразу хочу отметить, что приложение очень недоработанное как в качестве графики, так и в логике. Оно было создано на раннем этапе разработки пользовательского интерфейса и разработки функционалов фреймворка вообще (оно вообще самое первое, а это, как известно, что первый блин - комом). Графика приложения, откровенно говоря, очень убогая, дефекты логики тоже возникают регулярно. В дальнейшем планируется полная переработка для устранения дефектов.

Как и положено сервисам, его окно скрыто до тех пор, пока не придет запрос менеджера системных сообщений. Ниже приведены примеры в случае неудачного запуска приложения, аварийного выгрузки приложения и сбоя коллбека.

Попытался запустить приложение калькулятора которого нет, но оно “установлено”:

Screenshot of the sysalert unexistent app.

Появляется информационное окно об ошибке запуска, которое содержит: сообщение что приложение не запущено; имя приложения и его публичный идентификатор; по причине что бинарный файл не найден; маловразумительный код ошибки (но разработчику фреймворка он скажет о многом). Предлагается принять эту ситуацию как есть - кнопка “Accept”, ну тут другого ничего и не сделаешь.

Следующий экcперимент показывает ситуацию при аварийной выгрузке приложения, проще говоря я убиваю отладочное приложение:

Screenshot of the sysalert terminate app.

Сообщение показывает, что приложение завершилось аварийно, также имя и публичный идентификатор и по причине нарушения связи с приложением. Код ошибки, разумеется, другой. Предлагается два варианта: или принять данную ситуацию “Accept” или попытаться перезапустить приложение - “Restart”, что я и сделал успешно.

Для последнего эксперимента пришлось немного подломать код тестового приложения:

Screenshot of the sysalert handleerr app.

В данном случае handle callback вернул ошибочный статус, и это идентифицировано как внутреннея ошибка приложения, что так и есть. Тут тоже два варианта, либо принять как есть, либо закрыть приложение. В последнем случае приложение будет закрыто, в первом продолжит работу, хотя и неправильно.

Во многих случаях при возникновении ошибки у пользователя есть выбор, что сделать, и это часто бывает очень полезно при разработке приложений.

Весь код приложения доступен в SDK по пути applets/sysalert/.

Приложение Редактора Текста (Editor)

Редактор текстов это приложение для просмотра и редактирования текстовых файлов. Приложение пока содержит минимальную функциональнось которая позволяет открыть файл, внести какие либо изменения и сохранить их. Можно создать и новый файл и сохранить его с новым именем. Основой приложения является виджет текстового ввода, он встречался и в других приложениях, но здесь именно виджет многострочного ввода (и это весьма существенное отличие). Обслуживание такого виджета само по себе сложно, поэтому существенная часть этого кода вынесена с специальную библиотеку поддержки расположенную в папке support/libeditor/. Приложение редактора при работе с этим виджетом в основном оперирует функциями этой библиотеки. Надо сразу отметить что виджет еще сильно не доработан, наблюдаются многие дефекты позиционирования курсора при управлении клавишами клавиатуры и при вводе текста. Однако это проявляется только на больших файлах, которые не умещаются полностью на экране. Связано это с недавним переходом на TrueType шрифты, причина кроется в соответствующем механизме виджета и он подлежит существенной переработке, пока я это сделать не успел.

Итак запускаем приложение используя соответствующую иконку. Открывается пустой редактор и надо открыть какой-либо текстовый файл. Нажимаем кнопку “Файл” в меню и видим выпадающий список:

Screenshot of the editor open file.

В списке набор опций для операций открытия и сохранения файлов: новый, открыть, сохранить и сохранить как. Там же опция выхода из приложения. Нам нужна опция “Открыть”, в результате будет открыт сервис File View где мы можем выбрать файл hello.txt (он есть в SDK). Выбрав этот файл мы вернемся в окно редактора:

Screenshot of the editor open hello.

Мышью можно выставить курсор на любую строчку и “побегать” курсором с помощью кнопок навигации (тут будет все работать нормально, файл весь убирается в окне). Разумеется его можно и редактировать, при этом в заголовке возле имени файла появится звездочка, которая говорит о том что файл изменен. Если мы выберем опцию “Сохранить”, то изменения сохранятся в данном файле, поэтому выберем опцию “Сохранить как” и сохраним его с новым именем, например hello1.txt, помощью файлового сервиса. При возврате в окно редактора файл будет сохранен с новым именем. Теперь внесем еще какие-либо изменения и попытаемся выйти из редактора без сохранения (С помощью опции или крестиком в верхнем правом углу). Получим следующую картинку:

Screenshot of the editor unsaved file.

Появляется диалог с двумя опциями “Отменить” или “Сохранить”. В обоих случаях из редактора мы выйдем, но в первом случае изменения сохранены не будут, тогда как во втором они сохранятся.

При открытии большого файла который не умещается в окне появляется возможность вертикальной прокрутки с помоью мыши и кнопок на клавиатуре (насчет кнопок уже было сказано). Прокрутка с помошью мыши работает нормально. В случае наличия длинных строк в файле строки переносятся так что виден текст всей строки (symbol wrapping). Можно также в настройках виджета переносить и по границам слов (word wrapping) или вообще отключить перенос строк (но не советую, не все там хорошо).

По сравнению с рассмотренными ранее приложениями в окне редактора появились два новых элемента: заголовок окна с кнопками управления и меню (хотя меню тоже связано с заголовком). Это связано с использованием другого стиля окна. На других окнах был стиль без заголовка и без дополнительных элементов, а этот содержит все новые элементы, в том числе и меню. Все окна которые содержат данный стиль будут выглядеть примерно одинакого, отдельные элементы могут отсутствовать. Стили прописаны в корневом конфигурационном файле с использованием ноды “style”. Стили хорошо кастомизируются под темы без участия разаработчика приложения, и это еще один большой плюс их использования.

К элементам стиля относятся: заголовок, их даже два - статический и динамический, динамический заголовок может изменяться приложением (что и делается в редакторе); кнопка меню слева с изображением иконки приложения; три кнопки управления окном - первая кнопка после заголовка для максимизации окна (не работает, нет функционала), средняя кнопка сворачивает окно, последняя - кнопка выхода; основное меню предназначено для кнопок управления приложением. Все элементы опциональны и их наличие определяется в конфигурационном файле окна. К примеру для редактора это выглядит так (applets/editor/resources/editor_root.fml):

    <!-- Window style definitions -->
    <style default="true">
      <menubutton x="5" y="5" dx="25" dy="25" resid="$SYSONLY.$STYLE_BUTTON_ID">
        <variable name="PRESSED_ID" vtype="string" value="$APPONLY.$EDITOR_ICON_ID"/>
        <variable name="IDLE_ID" vtype="string" value="$APPONLY.$EDITOR_ICON_ID"/>
      </menubutton>
    </style>

В данном случае использован стиль по умолчанию и переопределены состояния кнопки меню чтобы отображалась иконка приложения, кнопка нажимается, но событие не обрабатывается (хотя и может). Для того чтобы какой-либо элемент не испольсовался в стиле окна можно добавить примерно такую строчку:

      <menubutton x="5" y="5" dx="25" dy="25" resid="$SYSONLY.$STYLE_BUTTON_ID">
        ...
      </menubutton>
      <maxbutton />  <!-- Эта строка удаляет кнопку -->

Данная строка убирает ненужную кнопку максимизации окна.

Еще один момент связанный с кнопками управления окном: кнопки сворачивания и закрытия окна не обрабатываются приложением, но тем не менее работают. Проясю это на примере кнопки выхода. Опция “Выход” в меню и кнопка выхода в стиле вызывают одинаковый эффект - приложение закроется. Однако, кнопка меню обрабатывается приложением, а кнопка стиля нет. Есть три варианта выгрузки приложения: приложение делает запрос на выгрузку само (обрабатывается кнопка меню), приложение выгружается другим приложением (отладочное приложение так и делает, пользуясь своими привилегиями), приложение выгружается фреймворком по каким либо причинам. Все остальные “методы” выгрузки приложения приведут к ошибкам. В случае кнопки стиля “exitbutton” при её инициализации фреймворк добавляет действие (action) и при нажатии кнопки приложение закрывается, фреймворк сам инициирует это действие. То же касается и кнопки сворачивания окна (хотя это тоже можно сделать со стороны самого приложения, но незачем).

И еще добавлю несколько слов про меню. Меню связано со стилем по весомой причине, оно ограничивает клиентскую область окна и это надо учитывать при расчете клиентской области. Иным способом кроме как включить этот элемент в стиль нельзя. В случае данного приложения клиентская область определяет размеры виджета текстового ввода. Можно бы обойтись и своим меню в приложении, расположив его в клиентской области, но это усложняет приложение и, что более существенно, нарушает единообразие пользовательского интерфейса. Текущая версия виджета меню не очень хорошая, мягко говоря. Он реализован как пользовательский виджет и не поддерживает ряд функционалов которые хотелось бы видеть (про графику я даже не говорю). Планируется его заменить используя виджет динамического списка (и выпадающие списки тоже) с более качественной графикой.

Код приложения расположен в папке applets/editor/, а код библиотеки поддержки в папке support/libeditor/

Отладочное Приложение (Debug Shell)

Про отладочное приложение уже многократно говорилось в различных разделах, поэтому подробно тут рассказывать нечего. Доступ к этому приложению выполняется через отладочный терминал, собственного пользовательского интерфейса у него нет, это фоновое системное приложение со всеми доступными привилегиями. В основном приложение используется для того, чтобы выполнять операции, которые нельзя сделать через пользовательский интерфейс (пока нельзя, например, выполнить установку пользовательского приложения). Реже оно используется, чтобы выполнить какие-либо специфические операции, напимер, выгрузить сервис (в SDK это, правда, пока нельзя сделать, требуется отладочная привилегия). Код приложения в SDK недоступен, поскольку приложение использует заголовочные файлы, которым в SDK не место, а без них приложение не построить. Возможно, это может быть исправлено в дальнейшем.

Приложение Мониторинга USB (USB Monitor)

Приложение для мониторинга USB устройств весьма простое. Это тоже фоновое системное приложение, единственная задача которого периодически просматривать папку, в которую монтируются съемные носители /media/username/, обнаружить ситуацию, что устройство было добавлено или удалено и отправить соответствующее сообщение фреймворку с определенными параметрами. Сообщение обрабатывается менеджером файловых систем, который регистрирует новую файловую систему (или удаляет регистрацию) и в свою очередь уведомляет своих подписчиков об этом событии. Сервис просмотра файлов File View является таким подписчиком, после получения уведомления он читает информацию о файловой системе и добавляет новую в список доступных файловых систем в своем окне.

Пользователь никак не может повлиять на работу приложения, кроме как остановить таймер для сканирования папки монтирования в приложении настроек на вкладке “Отладка”.

Сканирование папки монтирования происходит один раз в секунду. Конечно, такой подход не совсем правилен, но тут была важна простота приложения (и максимальная переносимость на разные платформы).

Код приложения доступен в папке applets/fsmonitor/.

Приложение Запуска Скриптов Python (Python Runner)

Приложение для запуска скриптов на Python весьма специфично, это приложение никогда не устанавливается в систему ни как системное, ни как пользовательское. По сути, приложение только создает исполняемый файл (pyrunner), который размещается в папке /usr/bin на таргете. Это приложение является интерфейсом между фреймворком и приложением на языке Python. Фреймворк не может сам запускать скрипты на Python, ему нужен исполняемый файл, который может это делать. Приложение, по сути, организовано также, как и обычное приложение на языке Си, но его коллбеки транслируют вызовы фреймворка в вызовы функций скриптов. Приложение использует механизмы Python C-API для запуска интерпретатора Python, загрузки системных модулей и, собственно, загрузки модуля приложения, и далее перенаправляет все вызовы фреймворка в соответствующие функции приложения.

При установке приложения на языке Python в папке приложения на таргете создается символический линк с именем приложения, который указывает на исполняемый файл руннера:

andrey@andrey-argo:/home/andrey/.../TestAppPy$ ls -l testapp_py
lrwxrwxrwx 1 andrey andrey 49 фев 24 09:57 testapp_py -> /home/andrey/frmsdk-linux/x86_64/usr/bin/pyrunner

Это имя и используется фреймворком в качестве исполняемого файла (определяется в install файле пользовательского приложения или как exe параметр для системного приложения в конфигурационном файле фреймворка).

Приложение запуска должно получить два обязательных параметра, передаваемых через командную строку (это обязательные параметры для приложения на Python):

dbgshell> pid
  Public ID     Flags   Application

  0x2001001     AFSS    SysAlert
  0x2001002     AFSD    FileView
  0x2001003     ABCD    USB Mon
  0x2001000     ABSR    DebugShell
  0x2001004     AFCR    IdleScreen
  0x2001005     AFCR    TestAppPy python testapp_py

В данном случае смотрим на последнюю строку - TestAppPy python testapp_py. При этом передается имя приложения (на самом деле при этом передается полный путь до приложения, это делается для всех remote приложений) и эти обязательные параметры: python и testapp_py. Первый указывает на папку, где в приложении расположены скрипты Python (это папка python), второй определяет имя модуля приложения (testapp_py.py) в этой папке. Эти параметры используются руннером для подключения модуля приложения через C-API. Если пользовательское приложение было создано скриптом appmake.sh и установлено скриптом install.sh, то разработчику приложения не надо задумываться ни о создании линка, ни о передаче параметров, все будет сделано автоматически. При добавлении приложения как системного, надо будет вручную поправить конфигурационный файл и установочный скрипт системы (configs/install.bgs). Сейчас для всех приложений создается собственный установочный bgs скрипт, который позволяет собирать бинарные файлы ресурсов, он вызывается из скрипта системы (configs/install.bgs), поэтому достаточно прописать скрипт приложения в этом файле (может конечно потребоваться и правка этого скрипта).

Код приложения доступен в папке applets/pyrunner/. Приложение пока находится в стадии разработки, не все события, пришедшие из фреймворка, могут быть транслированы в Python скрипты.

Приложение для Просмотра Изображений (Image View)

Приложение для просмотра изображений по сути весьма примитивно, оно может только открывать графический файл в формате BMP 24 бита (может еще открывать т.н. PIX формат, но этот формат отдельная тема). Это пользовательское приложение, поэтому его надо построить отдельно и установить в систему. Строится приложение с помощью скрипта applets/imgview/build.sh.

WS$ ./applets/imgview/build.sh
Чт 29 янв 2026 13:00:48 MSK
WORKSPACE: /home/andrey/share/FRM/FRM-V4/argo-v4-03-04-22/WS
BUILD VARIANT: linux-x86_64-debug
DEFCOMPILER: (C by default)
TARGET: sdk
PROJECT_LIST: applets/imgview
CC: Compile /home/andrey/share/FRM/FRM-V4/argo-v4-03-04-22/WS/build/linux/x86_64/sdk/debug/applets/imgview/obj/so/imgview.o ...
LD: Linking /home/andrey/share/FRM/FRM-V4/argo-v4-03-04-22/WS/build/linux/x86_64/sdk/debug/applets/imgview/bin/imgview.so (linux-debug) ...
CC: Compile /home/andrey/share/FRM/FRM-V4/argo-v4-03-04-22/WS/build/linux/x86_64/sdk/debug/applets/imgview/obj/o/imgview.o ...
LD: Linking /home/andrey/share/FRM/FRM-V4/argo-v4-03-04-22/WS/build/linux/x86_64/sdk/debug/applets/imgview/bin/imgview (linux-debug) ...
Done!!!
The ImageView application has been installed into /home/andrey/share/FRM/FRM-V4/argo-v4-03-04-22/WS/rootfs/resources/argo/applets/userapp/ImageView directory

Hint:
First time you need to install new application into system.
Command line to install into system using debug shell:
dbgshell> install -i install/imgview.install -p /home/andrey/share/FRM/FRM-V4/argo-v4-03-04-22/WS/rootfs/resources/argo/applets/userapp -n ImageView -c 0
WS$

После постройки приложения, его можно установить в систему через отладочный терминал, используя команду приведенную в логе:

dbgshell> install -i install/imgview.install -p /home/andrey/share/FRM/FRM-V4/argo-v4-03-04-22/WS/rootfs/resources/argo/applets/userapp -n ImageView -c 0

Однако теперь приложение может быть установлено используя приложение установки, что быстрее и удобнее.

Приложение будет установлено в папке rootfs/resources/argo/applets/userapp/ImageView и будет размещено в нулевой (самой первой) категории (общие приложения). Находим соответствующую иконку и запускаем приложение:

Screenshot of the imageview first start.

Поскольку файл был не задан, то на экране присутствует картинка по умолчанию. Для того, чтобы выбрать изображение для просмотра, необходимо нажать кнопку слева в заголовке. Запустится сервис выбора файлов, который позволит выбрать изображение:

Screenshot of the imageview selected file.

Выбирать надо подходящий файл, то есть BMP, иначе вы увидите окно системного предупреждения :)

Раз уж я упомянул PIX файлы, попробуем открыть и его. В сервисе поиска файлов зайдем на вкладку “Variable FS” и перейдем по пути argo_system/backgrounds:

Screenshot of the imageview open bgfile.

В папке находятся три файла с расширением PIX. Это сохраненные фреймворком фоновые изображения для дисплеев (а у меня их три). Открываем самый первый, который выделен:

Screenshot of the imageview bgfile.

На открытом изображении мы видим текущее фоновое изображение, такой формат файлов работает.

Файлы в таком формате не могут быть открыты в ином редакторе, это бинарные файлы изображений, специфичные для фреймворка. Операционное ядро фреймворка само по себе не работает ни с каким стандартным типом изображений, оно использует исключительно свой внутренний формат. Поэтому загрузка файлов в стандартных форматах всегда требует каких-либо преобразований во внутренний формат. Файлы в формате PIX - это изображения уже сохраненные во внутреннем формате, поэтому их загрузка происходит существенно быстрее. Размеры этих файлов примерно такие-же как у BMP (могут быть чуть больше или чуть меньше), если используется такая же кодировка (24 бита), но грузятся быстрее, поскольку никаких преобразований в этом случае не делается. Графические файлы ресурсов такого типа пока не поддерживаются, поскольку утилиты не могут их собирать, но поддержка будет сделана скоро.

Вернемся к приложению. Тут можно отметить что стиль окна практически идентичен стилю окна редактора, но есть различия: отсутствие кнопки максимизации окна и меню; заголовок не меняется при выборе файла. Последнее можно бы списать на то, что приложение этого не делает, но оно и не может менять заголовок на самом деле. Вот определение стиля в его окне (applets/imgview/resources/imgview_root.fml):

    <style default="true">
      <menubutton x="5" y="5" dx="25" dy="25" resid="$SYSONLY.$STYLE_BUTTON_ID">
        <variable name="PRESSED_ID" vtype="string" value="$APPONLY.$IMGVIEW_ICON_ID"/>
        <variable name="IDLE_ID" vtype="string" value="$APPONLY.$IMGVIEW_ICON_ID"/>
      </menubutton>
      <maxbutton />
      <menubar />
      <titlelabel />
    </style>

Кнопка максимизации и меню заблокированы, также как и элемент “titlelabel”. Я говорил ранее, что стиль имеет два заголовка: статический и динамический. Элемент с именем “titlelabel” это и есть динамический заголовок. Так сделано исключительно в целях дальнейшей разработки: статический текст сейчас не поддерживает смену языка, а сделать это необходимо. Статический текст редко встречается в приложениях, а тут он виден наглядно. Вообще, наличие двух типов заголовков полезно, не все приложения обрабатывают файлы и менять заголовок не имеет смысла, достаточно статического варианта. Динамический заголовок требует большего количества оперативной памяти, и с ним сложнее работать (статический достаточно прописать в файлах конфигурации и забыть про него).

Код приложения доступен в папке applets/imgview/.

Приложение Установки (Installer)

Приложение установки предназначено для различных операций с приложениями: просмотр информации о приложении; установка и удаление пользовательских приложений; создание и удаление пользовательских категорий; изменение параметров установленного приложения (иконка, заголовок приложения, режим запуска и.т.п). На данный момент приложение позволяет устанавливать или удалять пользовательские приложения и просматривать параметры установленных приложений. Остальные функционалы пока не реализованы. Приложение написано на языке Python (для тестирования новых API), поэтому функционалы зависят от наработки API для Python.

Начальный вид экрана при запуске приложения выглядит так:

Screenshot of the installer initial screen.

На экране доступны общий список приложений, выпадающий список категорий и кнопки “Установить” и “Выход”. При выборе любого приложения из списка появится панель с параметрами приложения:

Screenshot of the installer app parameters screen.

В данном случае выбрано приложение настроек. Панель показывает всю полезную информацию о приложении, но удалить его не позволит, это системное приложение. Но по-прежнему активна кнопка “Установить”. При нажатии на эту кнопку выполняется выбор установочного файла, мы попытаемся установить приложение для промотра изображений. Приложение должно быть построено, тогда в домашней папке появится файл home:/install/imgview.install. Файл, как обычно, выбирается сервисом FileView. После выбора файла появится панель установки:

Screenshot of the installer app parameters screen.

На экране видно, что установке ничего не препятствует, так что приложение мы установим, нажав на кнопку “Готово”. Панель установки пропадает, и в списке приложений появляется новое приложение - ImageView. Новое приложение полностью работоспособно, его можно проверить после выхода из приложения установки. Повторно так установить приложение уже не получится, оно уже установлено. При попытке будет выдана соответствующая ошибка, и кнопка “Готово” будет заблокирована. Для переустановки приложения требуется его удалить. Для этого в списке приложений его нужно выбрать, при этом в открывшейся панели будет и активная кнопка “Удалить” - приложение может быть удалено, если оно пользовательское. После удаления приложение пропадает из списка и может быть переустановлено.

Приложение не надо переустанавливать в процессе разработки, любые изменения в нем будут отражены в его устновочной директории. Фреймворк при установке лишь регистрирует приложение в своей базе данных и потом пользуется устновочной информацией. Но при изменении установочной информации (например, изменении установочного файла) приложение требуется перестроить и переустановить.

Выпадающий список категорий служит для выбора категории для просмотра: параметры категории и список приложений в ней. На процесс установки это никак пока не влияет. Можно посмотреть список приложений, которые относятся к данной категории, параметры категории. Добавить, удалить или изменить категорию также не получится, кнопки заблокированы. Соответствующий API есть, но приложение не доработано. К слову, выпадающий список тоже сильно недоработанный виджет, у него есть существенные недостатки, поэтому он пока и не системный.

Из остальных недоработок можно выделить отсутстствие скроллинга списка приложений и категорий (исправление не займет много времени), недостатки с выделением элементов динамических списков - это общая проблема, обнаружены недостатки в API меток и пиксельных изображений (pixmap). Приложение можно установить лишь в одну категорию, общую.

Код приложения доступен в папке applets/installer/.

Тестовые Приложения (TestAppPy и TestAppCpp)

Тестовые приложения предназначены для отладки API и не несут в себе никакой логики, кроме этой. Пользовательский интерфейс у них практически идентичен (отличаются только заголовки окон), но написаны они на разных языках: TestAppPy написан на языке Python, а TestAppCpp на языке C++. Эти приложения зарегистрированы как системные, для того чтобы проверять защищенные API. Приложения находятся в категории “Тест”.

После запуска приложения появится такой экран:

Screenshot of the test application.

На самом верху располагается виджет с двумя полями для ввода текста, в них можно печатать с клавиатуры, и в логах приложения видеть, что туда приходит. Особенность виджета в том, что в нем сразу два элемента для ввода текста (text_entry), такого в других приложениях нет, и это для проверки API, которое до этого не тестировалось.

Ниже располагается метка (label) с некоторым текстом. Это сделано для проверки API метки, также можно менять ее цвет.

Еще ниже располагаются две кнопки, но это не обычные кнопки, а динамические виджеты. Первая стирает и показывает вторую, вторая переводит первую в неактивное состояние и возвращает её в нормальное состояние.

На самом низу располагается динамический список, в котором три кнопки: Red, Green и Blue. Нажание на эти кнопки меняет цвет метки вверху.

Вверху, справа, расположен виджет для пиксельных изображений и элементы управления этим виджетом. Кнопки “+” и “-” предназначены для управления размером изображения от 100% до 20% с шагом в 20%. Кнопка “+” на изображении неактивна, поскольку текущий размер 100%. Еще правее расположена неактивная кнопка “Select”. Она предназначена для выбора изображения в виджете, но пока такой механизм в приложении не сделан, хотя все требуемые API уже есть. Впоследствии по этой кнопке будет вызываться сервис FileView для выбора файла изображения.

Несмотря на весь примитивизм, эти приложения позволяют проверить API динамического текста, API меток, API динамических виджетов и динамических списков и, частично, API виджета для пиксельных изображений. Также они позволяют проверить API для доступа к переменным системы и переменным приложения.

Код приложений доступен в папках applets/testapp_py/ и applets/testapp_cpp/.