В вычислительной технике Nano -X — это оконная система , которая достаточно полнофункциональна для использования на ПК , встроенной системе [1] [2] или КПК . [3] [4] Это проект с открытым исходным кодом , направленный на перенос функций современных графических оконных сред на меньшие устройства и платформы. Проект был переименован из Microwindows из-за юридических угроз со стороны Microsoft относительно торговой марки Windows .
Система Nano-X Window System чрезвычайно портативна и полностью написана на языке C. Она была портирована на 16-, 32- и 64-битные процессоры Intel, Broadcom BCM2837 ARM Cortex-A53 , а также на чипы MIPS R4000 (NEC Vr41xx) StrongARM и PowerPC, используемые в карманных и портативных компьютерах.
В настоящее время система Nano-X Window работает на системах Linux с поддержкой фреймбуфера ядра или с использованием драйвера X11 , который позволяет запускать приложения Microwindows поверх рабочего стола X Window . Этот драйвер эмулирует все режимы TrueColor и палитры Microwindows , так что приложение можно предварительно просмотреть, используя характеристики отображения целевой системы непосредственно на дисплее рабочего стола, независимо от характеристик дисплея рабочего стола. Кроме того, он был портирован на Windows , Emscripten , Android (на основе библиотеки Allegro ) и MS-DOS . Драйверы экрана Microwindows были написаны на основе библиотек SDL1 и SDL2, а также библиотек Allegro и SVGAlib . Также имеются драйверы VESA и VGA 16 color 4 planes.
Microwindows по сути является многоуровневой конструкцией, которая позволяет использовать или переписывать различные слои в соответствии с потребностями реализации. [5] На самом нижнем уровне драйверы экрана , мыши / тачпада и клавиатуры обеспечивают доступ к реальному дисплею и другому оборудованию для ввода данных пользователем. На среднем уровне реализован переносимый графический движок, обеспечивающий поддержку рисования линий, заливки областей, многоугольников, обрезки и цветовых моделей. На верхнем уровне реализованы три API, обеспечивающие доступ к программисту графических приложений. В настоящее время Microwindows поддерживает API Xlib, Nano-X и Windows Win32 / WinCE GDI . Эти API обеспечивают тесную совместимость с системами Win32 и X Window , однако с ограниченной функциональностью. Эти API позволяют легко переносить программы из других систем.
Интерфейсы драйверов устройств определены в device.h. Данная реализация Microwindows свяжет в системе по крайней мере один драйвер экрана, мыши и клавиатуры. Затем процедуры среднего уровня в ядре графического движка, независимого от устройств, напрямую вызывают драйвер устройства для выполнения операций, специфичных для оборудования. Такая настройка позволяет добавлять различные аппаратные устройства в систему Microwindows, не влияя на работу всей системы.
Microwindows в настоящее время поддерживает три различных интерфейса прикладного программирования (API). Этот набор процедур обрабатывает клиент - серверную активность, действия оконного менеджера, такие как рисование заголовков, закрытие окон и т. д., а также обрабатывает запросы программиста на вывод графики. Эти API работают поверх основных процедур графического движка и драйверов устройств.
API NX11 совместим с API X Window . Он основан на API Nano-X и предоставляет функции Xlib, используя функции, доступные в API Nano-X. Его можно скомпилировать как отдельную библиотеку или вместе с библиотекой Nano-X как единую библиотеку под названием libPX11. Всего он предоставляет 180 функций Xlib и заглушек для дополнительных функций, которые не реализованы.
На основе API NX11 библиотека графического пользовательского интерфейса FLTK может использоваться для предоставления GUI для прикладных программ. Дистрибутив Nanolinux использует API NX11 и FLTK для реализации операционной системы Linux, используя 19 МБ дискового пространства.
API Nano-X смоделирован по образцу сервера mini-x, изначально написанного Дэвидом Беллом, который был переопределением X в операционной системе MINIX . Он примерно следует API X Window System Xlib, но все имена с GrXXX(), а не с X...(). Базовая модель любого API поверх Microwindows заключается в инициализации драйверов экрана, клавиатуры и мыши, а затем в цикле select() в ожидании события. Когда происходит событие, если это системное событие, например, активность клавиатуры или мыши, то эта информация передается в пользовательскую программу, преобразуясь в событие expose, сообщение paint и т. д. Если это пользователь, запрашивающий графическую операцию, то параметры декодируются и передаются в соответствующую процедуру движка GdXXX. Обратите внимание, что концепция окна по сравнению с необработанными графическими операциями обрабатывается на этом уровне API. То есть API определяет концепции того, что такое окно, что такое системы координат и т. д., а затем все координаты преобразуются в «экранные координаты» и передаются в основные процедуры движка GdXXX для выполнения реальной работы. Этот уровень также определяет графику или контексты отображения и передает эту информацию, включая информацию об отсечении, в основные процедуры движка.
API, который пытается соответствовать стандарту Microsoft Win32 и WinCE GDI, — это Microwindows API. [6] В настоящее время поддерживается большинство графических процедур рисования и обрезки, а также автоматическое рисование заголовка окна и перетаскивание окон для перемещения. Microwindows API основан на сообщениях и позволяет писать программы без учета окончательной политики управления окнами, реализуемой системой. Microwindows API в настоящее время не является клиент-серверным.
Основным механизмом связи в API Microwindows является сообщение. Сообщение состоит из известного номера сообщения и двух параметров, известных как wParam и lParam. Сообщения хранятся в очереди сообщений приложения и извлекаются с помощью функции GetMessage. Приложение блокируется в ожидании сообщения. Существуют сообщения, соответствующие аппаратным событиям, например WM_CHAR для ввода с клавиатуры или WM_LBUTTONDOWN для нажатия кнопки мыши. Кроме того, отправляются события, сигнализирующие о создании и уничтожении окна WM_CREATE и WM_DESTRUCTION. В большинстве случаев сообщение связано с окном, идентифицируемым как HWND. После получения сообщения приложение отправляет сообщение в процедуру обработки связанного окна с помощью DispatchMessage. Когда создается класс окна, указывается связанная с ним процедура обработки сообщений, поэтому система знает, куда отправлять сообщение.
Архитектура передачи сообщений позволяет основному API управлять многими системными функциями, отправляя сообщения о всех видах событий, таких как создание окна, необходимость рисования, перемещение и т. д. По умолчанию связанная функция обработки окна получает «первый проход» в сообщении, а затем вызывает функцию DefWindowProc, которая обрабатывает действия по умолчанию для всех сообщений. Таким образом, все окна могут вести себя одинаково при перетаскивании и т. д., если это специально не переопределено пользователем. Основные политики управления окнами можно переопределить, просто повторно реализовав DefWindowProc, а не внося изменения во всю систему.
Базовой единицей организации экрана в Microwindows API является окно. Окна описывают область экрана для рисования, а также связанную с ней «процедуру окна» для обработки сообщений, предназначенных для этого окна. Программисты приложений могут создавать окна из предопределенных классов, таких как кнопки, поля редактирования и т. п., или определять собственные классы окон. В обоих случаях метод создания и взаимодействия с окнами остается абсолютно одинаковым.
Nano-X берет свое начало с NanoGUI. NanoGUI был создан Алексом Холденом, который взял mini-X-сервер Дэвида Белла и модификации Алана Кокса, а также добавил клиент-серверную сеть. Затем Грегори Хаерр заинтересовался проектом NanoGUI и начал вносить значительные улучшения и модификации в NanoGUI. Около версии 0.5 Грегори Хаерр добавил поддержку нескольких API и начал распространять Microwindows. В Microwindows 0.84 были включены все предыдущие изменения NanoGUI, и с тех пор это объединенный дистрибутив NanoGUI/Microwindows. В январе 2005 года система сменила название на Nano-X Window System. Поскольку Nano-X просто вольно следует API X Window System Xlib, был разработан дополнительный интерфейс под названием NXlib, который предоставляет API, совместимый с Xlib, на основе Nano-X.