Всем привет!
Вот решил в качестве ознакомления с системой написать файловый менеджер. Сильно не пинайте. ;) Их уже "в достаточном кол-ве", а значит есть у кого поучиться.
Для написания использую FASM, тестирую под QEMU. Начал с наброска UI, за основу взял example.asm с примером создания окна и вывода текста.
Задачу поставил объёмную, в первую очередь (то над чем сейчас работаю) это:
- возможность просмотра всех доступных данных о файлах и директориях;
- относительно приятный gui интерфейс со вкладками (до 8 штук включительно), адаптируемый под произвольный размер окна;
- боковая панель с разделами УСТРОЙСТВА и ИЗБРАННОЕ;
- функции работы с файлами: переименование, удаление и запуск(или открытие папки);
- копирование и вставка полного имени файла или пути;
- выбор вида отображения директории: табличка (с возможностью выбора столбцов и сортировки по ним), блоки, список в алфавитном порядке, список по типам, значки;
- режим разделения вкладок в рамках одного окна (доступен если открыто вкладок от 2 до 8): то есть в этом режиме панель вкладок пропадёт, а содержимое разделит окно на несколько частей, которым можно будет задать размеры.
Вряд ли дойдут руки, но в будущем планируется расшириться до:
- остальные функции работы с файлами: создание, копирование, перенос файлов и т.д.;
- ассоциации файлов по расширению (и возможно содержимому);
- возможность настроек цветовой схемы (например, цвет вкладок или цвет выделения файлов), боковой панели, места расположения вкладок (снизу или сверху), запоминание координат расположения окна и вида отображения директории;
- возможность перетаскивания файлов в режиме разделённых вкладок;
- запоминание и обновление списка имён файлов посещённых директорий для "индексации" поиска;
- поиск по имени файла;
- цветовые метки-теги к файлам.
Сейчас немного застрял на Функции 70, подфункция 1: вероятно накосячил со структурами (БДВК, может у кого-то можно посмотреть их пример?) и почему-то для "sys" или "/" в eax не возвращается ни 6 ни 0. И, пожалуйста, подскажите: в современных реалиях развития KolibriOS лучше везде использовать cp866 или UTF-8 (и всё в него преобразовывать)?
P.S. Исходный код обещаю открытый, по мере изменений и появления базового функционала - всё оформлю и выложу сюда.
Пока идёт работа, хотел бы услышать Ваши пожелания и предложения...
Mirage File Manager
-
- Attachments
-
-
1.PNG (8.54 KiB)Первый набросок GUI Viewed 10326 times
-
Один из файловых менеджеров (kfm) давно уже не развивается. Потому переодически появляются предложения о том что-бы убрать его из дистрибутива. Если тебе удастся сделать хороший ФМ наподобие виндосовского тотал командера, то это будет очень хорошо.
theonlymirage
Я бы сказал, что лучше не гнаться за функционалом, а сделать немного, но качественно, хорошо продумать архитектуру, чтобы кто-то другой мог разобраться и развивать. В новом ФМ больше всего хотелось бы увидеть поддержку юникода и вид значками. Помимо функции 70 есть ещё 80. Какую ошибку возвращает подфункция 1? Какие данные передаёшь?
Я бы сказал, что лучше не гнаться за функционалом, а сделать немного, но качественно, хорошо продумать архитектуру, чтобы кто-то другой мог разобраться и развивать. В новом ФМ больше всего хотелось бы увидеть поддержку юникода и вид значками. Помимо функции 70 есть ещё 80. Какую ошибку возвращает подфункция 1? Какие данные передаёшь?
После множественного прочтения мануала по сисфункциям и исправления своих ошибок, наконец удалось прочитать содержимое корневой директории.
Продвинулся и в интерфейсе, боковая панель под вопросом (но так как она уже есть, то будет присутствовать в первых релизах).
kfm - заглянул, попробовал в деле. kfm очень хорошо передаёт атмосферу колибри ос и даже приятен в использовании.
Пожелания про интерфейс похожий на kfm и про юникод будут учтены. Но не стоит ожидать полноценную замену kfm, всё-таки моя разработка будет сильно отличаться визуально. Это как-то скажется на привычках работы и получаемом пользовательском опыте.
Про ф-цию 80 учту, но пока не знаю где её мне применить.
Сейчас работаю над выделением вкладок и табличек в отдельные модули (а то код разрастается), скроллбаром и перемещению по директориям.
В общем, ещё на шажочек ближе к релизу.
Продвинулся и в интерфейсе, боковая панель под вопросом (но так как она уже есть, то будет присутствовать в первых релизах).
kfm - заглянул, попробовал в деле. kfm очень хорошо передаёт атмосферу колибри ос и даже приятен в использовании.
Пожелания про интерфейс похожий на kfm и про юникод будут учтены. Но не стоит ожидать полноценную замену kfm, всё-таки моя разработка будет сильно отличаться визуально. Это как-то скажется на привычках работы и получаемом пользовательском опыте.
Про ф-цию 80 учту, но пока не знаю где её мне применить.
Сейчас работаю над выделением вкладок и табличек в отдельные модули (а то код разрастается), скроллбаром и перемещению по директориям.
В общем, ещё на шажочек ближе к релизу.
- Attachments
-
-
Обновлённый прототип ФМ.PNG (12.36 KiB)Viewed 10268 times
-
Собственно, моё пожелание как раз было про интерфейс, не похожий на kfm, а то сейчас во всех ФМ вид только таблицей, как-то несовременненько...
За сегодня разбил код в inc'и. В целом разделение на модули прошло успешно.
В боковой панели появится подробная информация о выбранном файле.
Pathoswithin
Как и было заявлено в шапке, вариантов отображения будет несколько. Помимо таблички уже есть тайлы/плитки. В них текст относительно изображения может располагаться как внизу, так и сбоку. Из тайлов несложно будет сделать значки.
Вопрос: откуда можно взять (следует брать) иконки для папок, файлов и прочего? какие есть готовые варианты? Рисование не осилю.
В боковой панели появится подробная информация о выбранном файле.
Pathoswithin
Как и было заявлено в шапке, вариантов отображения будет несколько. Помимо таблички уже есть тайлы/плитки. В них текст относительно изображения может располагаться как внизу, так и сбоку. Из тайлов несложно будет сделать значки.
Вопрос: откуда можно взять (следует брать) иконки для папок, файлов и прочего? какие есть готовые варианты? Рисование не осилю.
- Attachments
-
-
Режим таблицы.PNG (11.86 KiB)Viewed 10213 times
-
Режим плитки.PNG (10.86 KiB)Viewed 10213 times
-
ICONS32.PNG
Кстати, лучше использовать второй шрифт (да и юникод поддерживает только он).
Кстати, лучше использовать второй шрифт (да и юникод поддерживает только он).
Оке, спасибо, скоро займусь добавлением изображений. А тексты значит все переводим в UTF-16LE, верно?
Коротко о достижениях
Добавил: scrollbar, функцию запуска приложений, запись текущего пути в буфер обмена. Появилось лучшее видение как всё устроить, поэтому интерфейс приобретает более законченный вид.
Проблема:
При работе с буфером обмена у меня не получилось прочитать буфер. Если слота нет, то всё хорошо - в eax возвращается 1, как и положено. Но когда я указываю на номер существующего слота, то моё приложение виснет. Например, первый слот: mcall 54, 1, 1 (буфер предварительно набиваю два раза текстом из tinypad)
Функции записи в буфер, узнать кол-во слотов, удалить последний слот - успешно работают. Проблема только с прочтением, что я делаю не так?
Вот описание, которым я руководствовался:
======================================================================
====================== Функция 54, подфункция 1 ======================
================== Считать данные из буфера обмена. ==================
======================================================================
Параметры:
* eax = 54 - номер функции
* ebx = 1 - номер подфункции
* eсx = номер слота
Возвращаемое значение:
* eax = если успешно - указатель на область памяти с данными
* eax = 1 - ошибка
* eax = -1 - отсутствует область главного списка
Замечания:
* буфер, на который указывает eax, содержит следующую информацию:
* +0: dword: общая длина данных
* +4: dword: определяет тип данныx:
* 0 = Текст
* 1 = Текст с блочным выделением
* 2 = Изображение
* 3 = RAW
* 4 и выше зарезервировано
* +8: более детально смотрите файл clipboard_container_rus.txt
---------------------- Константы для регистров: ----------------------
eax - SF_CLIPBOARD (54)
ebx - SSF_READ_CB (1)
Коротко о достижениях
Добавил: scrollbar, функцию запуска приложений, запись текущего пути в буфер обмена. Появилось лучшее видение как всё устроить, поэтому интерфейс приобретает более законченный вид.
Проблема:
При работе с буфером обмена у меня не получилось прочитать буфер. Если слота нет, то всё хорошо - в eax возвращается 1, как и положено. Но когда я указываю на номер существующего слота, то моё приложение виснет. Например, первый слот: mcall 54, 1, 1 (буфер предварительно набиваю два раза текстом из tinypad)
Функции записи в буфер, узнать кол-во слотов, удалить последний слот - успешно работают. Проблема только с прочтением, что я делаю не так?
Вот описание, которым я руководствовался:
======================================================================
====================== Функция 54, подфункция 1 ======================
================== Считать данные из буфера обмена. ==================
======================================================================
Параметры:
* eax = 54 - номер функции
* ebx = 1 - номер подфункции
* eсx = номер слота
Возвращаемое значение:
* eax = если успешно - указатель на область памяти с данными
* eax = 1 - ошибка
* eax = -1 - отсутствует область главного списка
Замечания:
* буфер, на который указывает eax, содержит следующую информацию:
* +0: dword: общая длина данных
* +4: dword: определяет тип данныx:
* 0 = Текст
* 1 = Текст с блочным выделением
* 2 = Изображение
* 3 = RAW
* 4 и выше зарезервировано
* +8: более детально смотрите файл clipboard_container_rus.txt
---------------------- Константы для регистров: ----------------------
eax - SF_CLIPBOARD (54)
ebx - SSF_READ_CB (1)
... возможно, первый слот это номер 0?
Еще можно попробовать открыть debug и ввести команду:
Потом если открылось нажать g и попробовать сделать вставку, которая приводит к вылету программы.
Должно показать участок программы на котором случился вылет. В некоторых случаях это может помочь установить причину.
Code: Select all
load имя_файла
Должно показать участок программы на котором случился вылет. В некоторых случаях это может помочь установить причину.
Спасибо, за инфу по дебагу, но мне не помогает - остаётся на той же строке.
Чуть некорректно написал про первый слот, да первый это 0, но я использую для теста специально следующий. Если нет никакого слота или занят только 0 слот, то всё правильно возвращает eax=1, приложение продолжает работать. Но когда я заполняю 1 слот и обращаюсь к нему, то программа виснет на mcall.
Я воспроизвёл проблему на минимальном коде - из примера example, который брал за основу своего. В оригинале я обрабатываю нажатия клавиш по инструкции (тут в примере это всё опустил), но результат с зависанием одинаковый.
Ниже прикладываю скрин и код этого example:
Чуть некорректно написал про первый слот, да первый это 0, но я использую для теста специально следующий. Если нет никакого слота или занят только 0 слот, то всё правильно возвращает eax=1, приложение продолжает работать. Но когда я заполняю 1 слот и обращаюсь к нему, то программа виснет на mcall.
Я воспроизвёл проблему на минимальном коде - из примера example, который брал за основу своего. В оригинале я обрабатываю нажатия клавиш по инструкции (тут в примере это всё опустил), но результат с зависанием одинаковый.
Ниже прикладываю скрин и код этого example:
- Attachments
-
-
Пример кода.zip (3.97 KiB)
- Пример кода:
Downloaded 293 times
-
скрин.PNG (22.05 KiB)Скриншот изменений example.asm Viewed 10114 times
-
Я пробовал запускать твой пример (451 б) в эмуляторе, при открытии сразу пишет что не поддерживаемая инструкция процессора.theonlymirage wrote:Я воспроизвёл проблему на минимальном коде - из примера example, который брал за основу своего. В оригинале я обрабатываю нажатия клавиш по инструкции (тут в примере это всё опустил), но результат с зависанием одинаковый.
Потом попробовал перекомпилировать его, но с другим файлом macros.inc (с тем что лежит на rd/1). Получился файл размером (402 б) который у меня запускается и работает, даже при нажатии на F1 ничего не виснет.
Может у тебя какой-то старый файл macros.inc из-за которого что-то не работает.