Всем привет!
Вот решил в качестве ознакомления с системой написать файловый менеджер. Сильно не пинайте. ;) Их уже "в достаточном кол-ве", а значит есть у кого поучиться.
Для написания использую 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 10366 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 10308 times
-
Собственно, моё пожелание как раз было про интерфейс, не похожий на kfm, а то сейчас во всех ФМ вид только таблицей, как-то несовременненько...
За сегодня разбил код в inc'и. В целом разделение на модули прошло успешно.
В боковой панели появится подробная информация о выбранном файле.
Pathoswithin
Как и было заявлено в шапке, вариантов отображения будет несколько. Помимо таблички уже есть тайлы/плитки. В них текст относительно изображения может располагаться как внизу, так и сбоку. Из тайлов несложно будет сделать значки.
Вопрос: откуда можно взять (следует брать) иконки для папок, файлов и прочего? какие есть готовые варианты? Рисование не осилю.
В боковой панели появится подробная информация о выбранном файле.
Pathoswithin
Как и было заявлено в шапке, вариантов отображения будет несколько. Помимо таблички уже есть тайлы/плитки. В них текст относительно изображения может располагаться как внизу, так и сбоку. Из тайлов несложно будет сделать значки.
Вопрос: откуда можно взять (следует брать) иконки для папок, файлов и прочего? какие есть готовые варианты? Рисование не осилю.
- Attachments
-
-
Режим таблицы.PNG (11.86 KiB)Viewed 10253 times
-
Режим плитки.PNG (10.86 KiB)Viewed 10253 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 294 times
-
скрин.PNG (22.05 KiB)Скриншот изменений example.asm Viewed 10154 times
-
Я пробовал запускать твой пример (451 б) в эмуляторе, при открытии сразу пишет что не поддерживаемая инструкция процессора.theonlymirage wrote:Я воспроизвёл проблему на минимальном коде - из примера example, который брал за основу своего. В оригинале я обрабатываю нажатия клавиш по инструкции (тут в примере это всё опустил), но результат с зависанием одинаковый.
Потом попробовал перекомпилировать его, но с другим файлом macros.inc (с тем что лежит на rd/1). Получился файл размером (402 б) который у меня запускается и работает, даже при нажатии на F1 ничего не виснет.
Может у тебя какой-то старый файл macros.inc из-за которого что-то не работает.
Полдня ушло на эту проблему, я сразу знал, что она мелкая
Пробовал заменять mcall напрямую int 0x40. Перепробовал кучу разных версий macros.inc из репозитария svn, разные версии KoOS и эмулятора. Пока не наткнулся на маленький пример Марата в SVN ClipView файл clip_get.asm Скомпилировал его с inc от 22 числа, код работает. А мой с теми же macros.inc (и прочее) не работал. Оставалось сравнить код.
Далеко сравнивать не пришлось, буквально заголовок и... Сперва подумал на стек, но очень быстро сообразил в чём реально проблема:
Перед вызовом mcall 54, 1, [номер слота] обязательно должна быть проинициализирована куча процесса: mcall 68, 11 ;инициализация кучи.
Эта мелочь конечно понятна, но жалко, что дополнительно не сказано в вики http://wiki.kolibrios.org/wiki/SysFn54/ru Куда бы больше времени ушло с пользой.
Пожалуйста, просьба обновить описание системных функций и упомянуть там об этом.
Спасибо за помощь, версия macros.inc тоже довольно сказывается (когда закончу с ФМ поизучаю изменения в них).
Пробовал заменять mcall напрямую int 0x40. Перепробовал кучу разных версий macros.inc из репозитария svn, разные версии KoOS и эмулятора. Пока не наткнулся на маленький пример Марата в SVN ClipView файл clip_get.asm Скомпилировал его с inc от 22 числа, код работает. А мой с теми же macros.inc (и прочее) не работал. Оставалось сравнить код.
Далеко сравнивать не пришлось, буквально заголовок и... Сперва подумал на стек, но очень быстро сообразил в чём реально проблема:
Перед вызовом mcall 54, 1, [номер слота] обязательно должна быть проинициализирована куча процесса: mcall 68, 11 ;инициализация кучи.
Эта мелочь конечно понятна, но жалко, что дополнительно не сказано в вики http://wiki.kolibrios.org/wiki/SysFn54/ru Куда бы больше времени ушло с пользой.
Пожалуйста, просьба обновить описание системных функций и упомянуть там об этом.
Спасибо за помощь, версия macros.inc тоже довольно сказывается (когда закончу с ФМ поизучаю изменения в них).
Работа продолжается, решил отписаться о прогрессе.
Хотелось сделать плавную прокрутку списков, но с текущим API это оказалось проблемной задачей. Было три варианта решения, и я выбрал самый радикальный и бьющий на производительность - отрисовку в отдельном буфере.
В результате родился новый страшный велосипед под названием koView. Сейчас перевожу все компоненты (вкладки, скроллбары и тд) на его использование. Что из этого выйдет и как скажется на производительности вскоре узнаем.
Если кому-то нужен подобный элемент, то прикладываю исходник (koView.inc). Плюс временный вспомогательный файлик с функциями размера и типа кодировки шрифта (fonts.inc).
Структура и устройство koView:
Хотелось сделать плавную прокрутку списков, но с текущим API это оказалось проблемной задачей. Было три варианта решения, и я выбрал самый радикальный и бьющий на производительность - отрисовку в отдельном буфере.
В результате родился новый страшный велосипед под названием koView. Сейчас перевожу все компоненты (вкладки, скроллбары и тд) на его использование. Что из этого выйдет и как скажется на производительности вскоре узнаем.
Если кому-то нужен подобный элемент, то прикладываю исходник (koView.inc). Плюс временный вспомогательный файлик с функциями размера и типа кодировки шрифта (fonts.inc).
Структура и устройство koView:
Пример использования:Структура koView:
; coord dd 0 ;координаты Х и Y (x dw 0 ; y dw 0)
; width dd 0 ;ширина
; height dd 0 ;высота
; pixels dd 0 ;указатель на буфер с пикселями (32 бита)
Структура буфера с пикселями изображения:
; width dd 0 ;ширина
; height dd 0 ;высота
; pixels db 0 dup(4*width*height) ; пиксели в формате AARRGGBB размер области 4*W*H
Текущие функции koView:
; createImage: конвертировать в изображение: создаёт буфер с картинкой для текущего koView (в edi) в ebx возвращает буфер с картинкой
; deleteImage: удаляет буфер с картинкой по адресу ebx
; fullDrawInWindow: отрисовать Kolibri View по указателю edi целиком как есть в текущем окне
; createSubImage: создать буфер с изображением : Внимание тут нет проверок, поэтому область строго должна быть внутри koView (все её точки); принимает: edi - koView, eax - координаты области в koView, ecx - размеры области в koView; возвращает: ebx - адрес на буфер с изображением
; deleteSubImage: удаляет буфер с картинкой по адресу ebx
; subDrawInWindow: отрисовать только нужную часть koView в окне: edi - указатель на koView, eax - координаты внутри koView, ecx - размеры внутри koView
; drawRect: нарисовать прямоугольник: eax - координаты, ebx - размеры по ширине и высоте, ecx - цвет, edi - указатель на koView; ничего не возвращает
; drawPoint: задать цвет(=ecx) точки/пикселя(координаты в eax) на Kolibri View (указатель в edi), внимание: нет проверки что точка внутри koView (возможен крах приложения)
; drawImage: нарисовать картинку: eax - координаты, esi - указатель на картинку, edi - указатель на koView
; drawText: отобразить текст (требуется усовершенствовать); входные: edi - указатель на буфер koView, eax - цвет, ebx - координаты текста, edx - указатель на начало строки (оканчивается нулём, но сейчас печатает столько символов сколько влазиет по ширине в koView);ничего не возвращает
; clear: очистить koView (указатель в edi) в цвет ecx
; resize: изменить размеры: edi - koView с уже изменёнными новыми значениями
; create: создать объект в памяти возвращает: edi - новый объект koView
; delete: удалить объект из памяти: указатель в edi
; pointInView: проверяет точка внутри области koView или нет? (координаты точки должны быть относительно того же объекта что и координаты koView) ;входящие: eax - координаты точки, edi - указатель на структуру koView ;выходные: eax = 0 - да, точка во вьювере, 1 - нет, точка не над вьювером.
Code: Select all
call setEncodingSymbolSize ;устанавливаем размер символов текущим шрифтом
call koView.create ;создаём новый koView с размерами 0 на 0
mov word[edi], 24 ;задаём ему координаты в окне
mov word[edi+2], 5
mov dword[edi+4], 30 ;задаём размеры: ширина и высота
mov dword[edi+8], 50
call koView.resize ;применяем новые размеры
mov ecx, 0xFF0000 ;AARRGGBB
call koView.clear ;очищаем его область - заливка единым цветом
mov eax, 1*65536+2 ;рисуем прямоугольник зелёного цвета
mov ebx, 60*65536+20
mov ecx, 0x00FF00
call koView.drawRect
mov eax, 0x0000FF ;цвет текста - синий
mov ebx, 0*65536+0 ;координаты текста
mov edx, button_refresh.utf ;cp;;указатель на текст в текущей кодировке
call koView.drawText ;рисуем текстовую строку (что не влезет в область - обрезается)
mov eax, 4*65536+5 ;задать цвет нужной точки koView
mov ecx, 0xFFFFFF
call koView.drawPoint
mov eax, 24*65536+45 ;нарисовать картинку
mov esi, testing
call koView.drawImage
mov eax, 0;2*65536+3
mov ecx, 30*65536+50 ;28*65536+47
call koView.subDrawInWindow ;отрисовать определённую область koView в окне приложения
mov word[edi], 24
mov word[edi+2], 5+60
call koView.fullDrawInWindow ;отрисовать всю область koView целиком в окне приложения
call koView.delete ;удалить koView и очистить память
- Attachments
-
-
fonts.inc (1.33 KiB)Downloaded 293 times
-
koView.inc (17.5 KiB)Downloaded 290 times
-
buf2d library?
Who is online
Users browsing this forum: No registered users and 1 guest