Mirage File Manager

Work with drives, directories, files
  • Ray
    Извини, что отвечаю на русском языке ;)
    Сейчас будет много текста...
    buf2d конечно хорош, но он заточен больше под изображения. Скорее всего решить мою проблему с помощью библиотеки buf2d было нельзя.
    Уточню задачу: мне нужно выводить в окно произвольную часть картинки (т.е. даны координаты и размеры, по которым нужно вырезать кусок изображения буфера). Всё, что в эту область не влазиет должно срезаться. Такой функции для работы внутри окна я не нашёл.

    Ещё одна из проблем, с которой я столкнулся при рисовании в буфере, это вывод текста. Мне "хочется" уметь выводить текст как utf-8, так и cp. Система это уже умеет, и в API такой вывод в буфер предусмотрен. Но если текст длиннее области вывода, то он не обрезается на правой границе буфера - происходит его перенос на следующую строку пикселей, то есть продолжение текста вылазиет с левой стороны буфера. Причём такой проблемы нет, если текст не влазиет в буфер по высоте - в этом случае, текст корректно обрезается снизу, сверху он не выползает.
    Мне понятна логика программировавшего это - если бы ему пришлось обрезать правую сторону, то алгоритм был бы геморойнее и сходу написать куда труднее, чем как сейчас.
    Так как вносить правки в ядро требует сильных согласований (+может поломать программы) и это не стояло в моих планах, я решил проблему этого недостатка иначе. В koView текст печатается всё той же API функций 4, но такой длины, чтобы он не вылазил за правую границу. То есть если я понимаю, что очередной символ не влезет в ширину буфера, то я печатаю текст только до этого символа. Пока не учитывается скаллинг (т.к. это упирается на мой временный модуль fonts.inc и там ужасный код, надеюсь в ближайшее время заняться нормальной заменой этого модуля с учётом скаллинга текста).
    В будущем возможно я или кто-то добавит вывод текста полностью в отдельный буфер или только не влазившего символа в отдельный буфер, а затем уже имеющимися функциями koView можно дорисовать только недостающую часть этого символа.
    Поэтому koView велосипед, велосипед во спасение.

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


    Pathoswithin
    Отлично! Изменения на SVN увидел.
  • Вторую проблему решить не сложно, но если текст не влазит в буфер, то это же плохо в любом случае, а перенос в ядре делать жирно.
  • Pathoswithin wrote:Вторую проблему решить не сложно, но если текст не влазит в буфер, то это же плохо в любом случае, а перенос в ядре делать жирно.
    Напомню, что есть связанный баг - если текст выводится в окно и сильно туда не влезает - система или программа крешится (по моему и то и то).
  • Исправил.
    revision #6899
  • Обычный тест вывода старых текстов - прошёл нормально. Работу в буфере ещё тестирую, отпишусь позже.

    Не знаю связано или нет, но в новой версии из косяков появился артефакт в тенях на рабочем столе. Смотрите на тень в конце буквы R на скринах ниже. Один пиксель теней справа срезался (надо сказать, что это самое длинное слово на рабочем столе - отсеклось?).
    Attachments
    стало.PNG
    стало.PNG (2.07 KiB)
    Viewed 7826 times
    было.PNG
    было.PNG (1.71 KiB)
    Viewed 7826 times
  • Исправил.
    revision #6900
  • Pathoswithin,
    оперативно, спасибо!

    По поводу тестов буфера:
    [+] тесты с текстом превышающим ширину буфера пройдены - отсечение невлазиющих символов работает корректно
    [+] аналогичные тесты текста со смещением по X (положительным > 0) - успешно пройдены
    [+] тестировался даже случай, когда ни один символ не влезает в буфер - текст не отображается, всё корректно

    [-] При тесте со смещением по X и по Y было обнаружено, что приложение может вылетать. Для этого нужно выводить текст внизу буфера, чтобы он не влазил по высоте. Например, для текста utf16LE (код типа шрифта 2) высота изображения буфера 50 пикселей, тогда любой текст выводимый с координатой Y > 43 пикселей приведёт к вылету. Все тексты с координатой до Y=43 включительно, выводятся корректно. Это не зависит от того влезает ли текст по ширине или нет.
    На скриншоте "ВыводТекста" показан приведённый выше корректный случай с Y=43. При увеличении Y на всего единицу приложение рухнет.

    [-] Попытки вывода текста за пределами области буфера приводят к вылету приложения. Например, если ширина буфера в пикселях = 150, то при попытке вывода текста по координате Х > 150 (начиная со 151) приложение крешится.
    -------------------------
    На этом непосредственно перехожу к основной задаче - разработка ФМ.

    Возможно я где-то ошибся, но предварительно - столкнулся с тем, что 70-ая функция 1 подфункция в корне не возвращает бит метки раздела.
    Он всегда не установлен, вместо него у разделов установлен бит папки.

    Структура блока данных входа каталога (БДВК):
    * +0: dword: атрибуты файла
    бит 3 ( маска 8 ): это не файл, а метка тома
    (на заданном разделе встречается не более одного раза и только в корневой папке)


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

    Пока идёт переход на koView, для любителей shell добавлен новый режим отображения "Консоль".
    Теперь нажатием одной клавиши (по умолчанию F2) можно будет переключиться в консоль той же директории, в которой Вы работали.
    Причём будет возможность задать цвета разным типам файлов и папок.
    Надеюсь это будет востребовано и удобно. О поддерживаемых командах расскажу позже.
    Attachments
    ПричёмЕстьПодсветкаТиповФайлов.PNG
    ПричёмЕстьПодсветкаТиповФайлов.PNG (47 KiB)
    Viewed 7791 times
    КонсольныйРежим.PNG
    КонсольныйРежим.PNG (84.7 KiB)
    Viewed 7791 times
    ВыводТекста.PNG
    ВыводТекста.PNG (481 Bytes)
    Viewed 7791 times
  • Исправил документацию.

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

    Насчёт буфера: в начале буфера есть его размеры, проверку выхода координат текста за пределы буфера сделать не сложно. Если просят рисовать за пределами, то ничего не делаем и переходим к выходу из функции.
    Ширина теперь правильно отсекается (посимвольно). Кому потребуется попиксельно сможет это реализовать.

    Что делать с текстом превышающим буфер по высоте - не знаю.
    Если добавлять проверки, то должно быть проще всего не выводить такие тексты, которые не влезают в область. Для этого сравниваем: Ysize буфера и coordYtext+Htext (координата текста + высота текста). Если размер буфера больше или равен этой сумме параметров текста, то выводим текст в буфер, иначе к выходу из функции.
    В идеале нужно рисовать только те пиксели текста, которые влезают в буфер. Для этого нужно полностью контролировать процесс вывода очередной строки пикселей символа. Тогда будет возможность понять, что очередная строка пикселей находится за пределами области и прекратить вывод/отрисовку. Для ядра это значительные лишние проверки.
  • варианты
    1. не влезающую полностью строку не рисуй
    2. бери больше буфер, Люк
  • Добрался снова до проекта и просидел всю ночь. Конечно много чего сломал, но полностью отделил консольный режим для удобства разработки. Буду добивать проект маленькими частями. Так же добавил исполнение скриптов, аналогично вводу Пользователя. Команд новых не завёз, более того временно сломал ввод русских букв, запуск исполняемых файлов, команду ls (не работает в корневой директории) и клипборд. Везде полностью используется кодировка номер 2: UTF 16 LE. В общем shell всё-равно круче, до него далеко, и мне он больше нравится. Но если кого-то заинтересует моя разработка, вот видео про скрипты: https://youtu.be/GL88Lnn8FB8
    Список текущих кое-как работающих команд консольки:
    • ls <путь> -- получить список файлов внутри директории, если параметр <путь> пуст, то используется текущая директория;
    • print <строка> -- напечатать строку <строка> в консоль как есть;
    • echo <строка> -- напечатать строку как есть;
    • cd <путь> -- сменить текущую директорию на <путь>, переход в директорию <путь>;
    • run <имя файла> -- выполнить команды из файла скрипта (обычный текстовый файл);
    • cls -- очистить экран консоли;
    • clear -- очистить экран;
    • exit -- завершить, завершает работу приложения;
    • pwd -- отображает текущую директорию (печатает в консоль строкой).
    Пример скриптового сценария:

    Code: Select all

    cls
    print This is start command file.
    pwd
    cd /rd/
    pwd
    ls
    echo This is end command file.
    
    
    В текущей реализации в конце обязательно должна быть одна пустая строка, так как команда выполняется после поступления символа 13. Код 10 в любом месте скрипта игнорируется.
    Проект всё ещё на стадии прототипа.
    Приложение тестировалось и разрабатывалось под revision #6900, поэтому может не работать в более ранних и поздних версиях.
    Attachments
    cfm.kex (13.56 KiB)
    Скачать жирненький файл текущей сборки можно тут. Исходники прибудут чуть позже.
    Downloaded 289 times
  • Небольшое обновление к предыдущему посту.
    Добавил новые команды:
    • set-mouse-position -- устанавливает позицию курсора на центр экрана (в будущем станет принимать координаты, пока же игнорирует любые параметры);
    • minimize-all-windows -- минимизирует/сворачивает все окна;
    • call <полное имя файла> -- аналогично run, запускает скрипты/сценарии на исполнение;
    • reboot -- перезагрузка системы;
    • restart-kernel -- перезапуск ядра (из файла kernel.mnt на рамдиске);
    • shutdown -- выключение системы;
    • echo-on -- включить вывод команд (сама команда будет выведена в консоль);
    • echo-off -- отключить вывод команд (сама команда будет выведена в консоль).
    Все команды могут быть использованы и в скриптах/сценариях.
    Attachments
    cfm6900 (17.62 KiB)
    Последняя версия для revision #6900. Включает в себя все обновления, описанные в посте далее (ниже).
    Downloaded 275 times
    cfm (14.18 KiB)
    Этот бинарник содержит только обновления из этого поста.
    Downloaded 274 times
    Last edited by theonlymirage on Mon Feb 05, 2018 6:59 pm, edited 2 times in total.
  • Собрал под новую #7136.
    Добавлены команды:
    • iskef <полное имя файла> -- проверяет (по наличию сигнатуры 'MENUET01') является ли файл исполнимым файлом Колибри ОС, результат печатает строкой (true или false);
    • time -- выводит системное время строкой;
    • date -- выводит системную дату в консоль;
    • kill <pid> -- завершить процесс/поток по его идентификатору PID;
    • pause <число секунд> -- ничего не делать в течении заданных секунд (отменить/разбудить нельзя в отличие от команды sleep, которая появится позже);
    • set-mode <число режима> -- режим работы консоли ФМ: 0-в обычном окне, 1-во весь экран (эта функция создавалась для тех, кому не нужна оболочка и нужна только консоль, работы в этом направлении продолжатся, а пока окно просто максимизируется);
    • bgi-redraw -- перерисовать/обновить фон рабочего стола;
    • bgi-set-mode <число режима> -- задать режим отрисовки фона (не тестировалось): 1=замостить, 2=растянуть;
    • terminate <слот> -- завершить процесс/поток по его номеру слота;
    • get-core-version -- показать используемую версию ядра ОС;
    • get-free-ram -- отобразить размер свободной оперативной памяти в Кбайтах;
    • get-ram-size -- показать размер ОЗУ в Кбайтах;
    • get-mouse-speed -- отобразить текущее значение скорости мыши;
    • set-mouse-speed <число> -- задать скорость мыши;
    • get-mouse-sensitivity -- получить значение чувствительности мыши;
    • set-mouse-sensitivity <число> -- задать значение чувствительности мыши;
    • pslot <pid> -- получить номер слота нужного процесса/потока по его идентификатору PID;
    • eject <номер устройства> -- извлекает лоток привода (данная функция не была протестирована в работе).
    Attachments
    cfm7136.kex (17.62 KiB)
    Downloaded 280 times
  • Почти починил запуск приложений. Теперь корректно работает, но пока нужно прописывать полное имя исполняемого файла (с путём). После пробела можно передать строку параметров для запускаемого приложения. Пример запуска шела, который затем запустит текстовый редактор:

    Code: Select all

    /rd/1/shell /rd/1/tinypad
    Добавил новые команды:
    • help -- выводит листинг доступных команд (в текущей реализации нет прокрутки, поэтому не влезает на экран);
    • mkdir <полное имя/путь> -- создать новую папку/директорию с указанным именем;
    • md <полное имя/путь> -- создаёт новый каталог/директорию;
    • rm <полное имя/путь> -- удаляет существующую папку/директорию (работает только если папка пуста);
    • current-color-scheme -- отображает на экране текущую цветовую схему раскраски консоли: показывает цвета и их значения (в том виде, как они заданы по умолчанию, изменить пока нельзя);
    • get-network-device-count -- показать кол-во сетевых устройств;
    • get-network-device-type <номер устройства> -- отобразить тип сетевого устройства по его номеру в списке (не тестировалось).
    Ещё очень много недоработок и ошибок, но этой версией уже возможно пользоваться.
    Attachments
    Руководство пользователя, собранное на коленке из постов выше.
    Downloaded 270 times
    cfm.kex (19.5 KiB)
    Downloaded 275 times
  • Who is online

    Users browsing this forum: No registered users and 6 guests