En el otoño de este año, después de 6 años de desarrollo, se lanzó la primera versión beta de "R1 / beta1" del sistema operativo
Haiku . He estado siguiendo este interesante proyecto durante mucho tiempo, cuyo objetivo es recrear y desarrollar aún más el sistema
BeOS que existió en 1994-2000. Por lo tanto, tan pronto como vi noticias sobre el lanzamiento de la versión beta de Haiku en los sitios de noticias de TI, inmediatamente decidí ver qué se agregaba a este lanzamiento tan esperado. Después de instalar el sistema en la máquina virtual
VirtualBox y un poco de familiarización con su funcionalidad básica, pensé que sería bueno ayudar a la comunidad OpenSource, que está desarrollando este sistema operativo, un poco hoy. Decidí comenzar con lo que he adquirido un poco de experiencia: portar algunos proyectos de juegos.
El escritorio del sistema operativo Haiku.Más tarde, intenté refinar algunas aplicaciones y bibliotecas existentes. Esta es mi pequeña actividad en varios repositorios de código abierto a los que se dedicará este artículo. En él, describiré constantemente los problemas que encontré y hablaré sobre los métodos para resolverlos. Traté de enviar la mayoría de los parches que se hicieron durante este trabajo para
mejorar los proyectos existentes con el fin de proporcionarles soporte a Haiku e interesar a sus desarrolladores en la existencia de sistemas operativos alternativos.
El sistema operativo Haiku utiliza un
núcleo híbrido , que es una implementación de arquitectura de microkernel con la capacidad de cargar dinámicamente los módulos necesarios. Se basa en la bifurcación del núcleo
NewOS , que fue desarrollado por un ex ingeniero de
Be Inc. , Por Travis Geiselbrecht. Hoy, este desarrollador está trabajando en Google en un núcleo llamado
Zircon para el nuevo sistema operativo
Google Fuchsia , pero esa es otra historia. Entonces, dado que los desarrolladores de Haiku declaran compatibilidad binaria con BeOS, se ven obligados a soportar no dos ramas arquitectónicas familiares, sino tres: x86_64, x86 y x86_gcc2. La última arquitectura es una carga de compatibilidad con el compilador de la versión anterior de
GCC 2.95. Es gracias a ella que es posible ejecutar aplicaciones escritas para el sistema operativo original de BeOS. Desafortunadamente, debido a esta carga de compatibilidad, los desarrolladores de Haiku no pueden usar las características modernas del lenguaje de programación C ++ en las API del sistema. Sin embargo, preparan imágenes de instalación para solo dos arquitecturas: x86_64 y x86. El caso es que la distribución Haiku para x86 es híbrida: a pesar del hecho de que todos los componentes del sistema están construidos bajo x86_gcc2 para compatibilidad binaria, el usuario tiene la oportunidad de instalar o construir cualquier aplicación moderna que haya sido diseñada para compiladores modernos y arquitectura x86 . La distribución Haiku para la arquitectura x86_64 es totalmente de 64 bits y no tiene la capacidad de ejecutar aplicaciones BeOS y Haiku de 32 bits. Sin embargo, hay compatibilidad a nivel API, por lo que si tiene el código fuente de la aplicación en BeOS o Haiku x86, puede compilarlo fácilmente en Haiku x86_64 y todo debería funcionar. Se recomienda una imagen del sistema operativo para la arquitectura x86_64 para la instalación en hardware real si no necesita soporte para ninguna aplicación BeOS específica o aplicaciones Haiku de 32 bits.
Vale la pena decir que en este sistema operativo hay soporte parcial para el estándar
POSIX . Esta base lo hace similar a los sistemas tipo UNIX y facilita la transferencia de su software. El lenguaje de programación principal es C ++, se usa activamente, ya que las API públicas de Haiku persiguen principalmente un paradigma de programación orientado a objetos. Sin embargo, nadie prohíbe el uso del lenguaje de programación C, solo en la mayoría de los casos es necesario escribir las capas de compatibilidad correspondientes. La interfaz de software del sistema operativo se agrupa en marcos de sistema separados que son responsables de una oportunidad particular, por ejemplo, de una interfaz o soporte de red. Esto es un poco como lo que está disponible en
macOS o en el marco
Qt . Cabe señalar que este sistema operativo es de usuario único, aunque existen algunos desarrollos en la dirección de proporcionar un modo de trabajo multiusuario para los desarrolladores de Haiku.
No puedo dejar de compartir con los lectores de este artículo la experiencia positiva de usar el sistema avanzado de administración de ventanas de aplicaciones que está disponible en Haiku. En mi opinión, es uno de los más convenientes y, a su manera, es el sello distintivo de este sistema operativo.
Gestión avanzada de ventanas en el sistema operativo Haiku: soporte para mosaico y pestañas.Las ventanas se pueden sujetar juntas en pestañas, como se hace en los navegadores modernos, unidos entre sí y redimensionados convenientemente.
Mosaico simple , que transfiere los contextos de algunas aplicaciones de una ventana a otra, y
se admiten
replicantes . Puede leer más sobre todas las características del sistema de ventanas local en la
documentación oficial , allí se describen todas las teclas de acceso directo necesarias.
No escribiré en este artículo una descripción completa de todas las características y capacidades de Haiku, ya que aquellos que estén interesados en él podrán encontrar fácilmente la información necesaria en Internet.
Contenido:
1. Paquetes y repositorios en Haiku2. Primeros pasos: Portar la aventura de afecto de armadura adamantina3. Modificación del puerto NXEngine existente (Cave Story)4. Portar el juego Gish5. El proyecto BeGameLauncher, que le permite crear rápidamente lanzadores para juegos6. Portar Xash3D: juego legendario Half-Life y complementos oficiales7. Portar las dos partes del juego Serious Sam: The First Encounter y The Second Encounter8. Portar el juego de los Vangers9. Implementación de diálogos en la biblioteca SDL2 para Haiku10. Portar mi tenedor de Cool Reader11. Finalización del programa KeymapSwitcher12. Conclusión1. Paquetes y repositorios en Haiku
En comparación con el BeOS original, ha aparecido una innovación significativa en Haiku: un sistema de gestión de paquetes que incluye varias herramientas para obtener e instalar software de varias fuentes. Dichas fuentes pueden ser los repositorios oficiales de
Haiku y
HaikuPorts , repositorios no oficiales y simplemente paquetes de HPKG separados y especialmente preparados. Tales capacidades para instalar y actualizar software se conocen desde hace mucho tiempo en el mundo de los sistemas operativos tipo Unix, pero ahora toda su potencia y conveniencia han llegado con éxito a Haiku, que no puede sino complacer a los usuarios comunes de este sistema operativo. Gracias a la infraestructura construida alrededor del administrador de paquetes, ahora cualquier desarrollador puede portar fácilmente una aplicación de código abierto nueva o modificar una existente, luego agregar los resultados de su trabajo al repositorio de puertos del software HaikuPorts, después de lo cual estarán disponibles para todos los usuarios de Haiku. Como resultado, el ecosistema resultante se parece al de los sistemas operativos macOS con su
Homebrew , FreeBSD con sus
puertos , Windows con
MSYS2 o Arch Linux con su
AUR .
Una herramienta para crear paquetes y portar software, llamada
HaikuPorter , se suministra por separado del sistema operativo y se instala utilizando un pequeño
manual ubicado en el repositorio en GitHub. Después de instalar esta utilidad desde el mismo GitHub, se descarga todo el árbol de recetas, en el que el desarrollador está trabajando. La receta es un script de Shell normal con instrucciones en las que HaikuPorter recopilará el paquete HPKG requerido. Es de destacar que la herramienta en sí está escrita en el
lenguaje de programación
Python 2, interactúa estrechamente con el sistema de administración de paquetes existente y utiliza la herramienta estándar
Git internamente para corregir los cambios en el código fuente del software y generar un conjunto de parches. Gracias a esta pila de tecnología, hacer recetas para construir paquetes de HPKG y parches de software en forma de archivos de parches es muy conveniente y simple. En la mayoría de los casos, tuve que usar solo tres comandos al trabajar con HaikuPorter:
alias hp="haikuporter -S -j4 --get-dependencies --no-source-packages" hp libsdl2 hp libsdl2 -c hp libsdl2 -e
El primer comando simplemente recopila el paquete seleccionado, el segundo comando borra el directorio de compilación y el tercero crea o actualiza un conjunto de parches de acuerdo con los cambios que se registraron en el repositorio Git del directorio de trabajo a través de commits.
Por lo tanto, para publicar un paquete en el repositorio de HaikuPorts y ponerlo a disposición de todos los usuarios de Haiku, el desarrollador debe instalar HaikuPorter, expandir el árbol de recetas, recolectar el paquete HPKG localmente y probarlo, luego comprometerse a su tenedor del árbol de recetas. luego haga una
solicitud de extracción en GitHub. Los desarrolladores de Haiku deben considerar el trabajo publicado, después de lo cual deciden fusionar sus cambios en el repositorio o enviarlos para su revisión. Si se aceptan los cambios, el mismo HaikuPorter instalado en el servidor de compilación recopilará de forma remota el paquete y lo publicará automáticamente en el repositorio.
Se
agregó un programa especial
HaikuDepot a la versión beta de "R1 / beta1" del sistema operativo Haiku, que permite trabajar con paquetes y repositorios a través de una interfaz gráfica de usuario, en lugar de a través de comandos de consola en el terminal.
El programa HaikuDepot que se ejecuta en el sistema operativo Haiku.Gracias a esta herramienta, los usuarios inexpertos y novatos de Haiku pueden administrar convenientemente su base de paquetes. Vale la pena señalar que esta aplicación no es solo un shell de GUI sobre el administrador de paquetes existente, sino que también implementa funcionalidades adicionales. Por ejemplo, los usuarios autorizados pueden calificar y escribir comentarios sobre los paquetes disponibles para la instalación. Además, HaikuDepot tiene un sitio
web especial de
Haiku Depot que le permite ver los cambios de paquetes en Internet o descargar paquetes individuales de HPKG.
<< Saltar al contenido2. Primeros pasos: Portar la aventura de afecto de armadura adamantina
Después de conocer la funcionalidad del sistema operativo en la máquina virtual VirtualBox, decidí evaluar la biblioteca SDL2 y portar el juego
Adamant Armor Affection Adventure a Haiku, que escribí sobre la transferencia a la plataforma Android anteriormente. La construcción del programa no requirió ningún cambio en el código fuente, simplemente instalé todas las herramientas necesarias, bibliotecas, sus archivos de encabezado desde el repositorio y realicé lo siguiente:
cmake -DCMAKE_BUILD_TYPE=Release -DGLES=off -DANDROID=off -DCMAKE_C_FLAGS="-D__linux__" -DSDL2_INCLUDE_DIR=`finddir B_SYSTEM_HEADERS_DIRECTORY` -DSDL2_MIXER_INCLUDE_DIR=`finddir B_SYSTEM_HEADERS_DIRECTORY` ../aaaa/src/main/cpp cmake --build .
= apagado -DCMAKE_C_FLAGS = "- D__linux__" -DSDL2_INCLUDE_DIR = `finddir B_SYSTEM_HEADERS_DIRECTORY` -DSDL2_MIXER_INCLUDE_DIR =` finddir B_SYSTEM_HEADERS_DIRECTORY` ../aaaa/src/main/cpp cmake -DCMAKE_BUILD_TYPE=Release -DGLES=off -DANDROID=off -DCMAKE_C_FLAGS="-D__linux__" -DSDL2_INCLUDE_DIR=`finddir B_SYSTEM_HEADERS_DIRECTORY` -DSDL2_MIXER_INCLUDE_DIR=`finddir B_SYSTEM_HEADERS_DIRECTORY` ../aaaa/src/main/cpp cmake --build .
Como Haiku tiene POSIX, las definiciones -D__linux__ o
-D__unix__ resuelven muchos de los problemas asociados con la definición de una plataforma. Sin embargo, vale la pena señalar que es mejor abandonar su uso e implementar el soporte Haiku en el código fuente del proyecto si hay problemas de compilación similares. Llamar a la utilidad del sistema
finddir con un argumento específico le permite obtener la ruta correcta a los archivos de encabezado para varias arquitecturas.
Entonces, al ejecutar los comandos anteriores, compilé un archivo ejecutable que funcionaba perfectamente, y el juego funcionó perfectamente. Pensé que sería genial preparar un paquete de HPKG autosuficiente con el juego y para esto me adentré en Internet en busca de la información que necesitaba. Entonces no conocía ninguna herramienta conveniente para portar software, como HaikuPorter, sobre la que escribí en la sección anterior, así que para lograr mi objetivo decidí hacer trampa y desarmar algún paquete del sistema para ver cómo se organiza dentro y hacer por analogía
En Internet, encontré la
información deseada, luego desempaqué un paquete de sistema aleatorio usando el archivador
Expander integrado en el administrador de archivos local, encontré el archivo
.PackageInfo , lo
edité y, de acuerdo con la estructura de mi aplicación, reemplacé los archivos. Luego simplemente ejecuté los comandos para construir el paquete HPKG e instalarlo en el sistema:
package create -C AAAA/ aaaa.pkg pkgman install aaaa.pkg
Desafortunadamente, el lanzamiento del juego desde el menú "Aplicaciones" no tuvo éxito. Al ejecutar el ejecutable en la terminal, recibí un error que decía que era imposible encontrar los archivos de datos necesarios para ejecutar y ejecutar la aplicación. En este caso, si en la terminal va al directorio del paquete de la aplicación, entonces todo comenzó bien. Esto me llevó a la idea de que al iniciar el juego desde el menú, debe realizar un cambio forzado en el directorio de la aplicación. Esto se puede hacer con un script de Shell o cambiando la fuente del juego. Elegí la segunda opción y agregué algo similar a este código:
#ifdef __HAIKU__
Al principio de la función de inicio
main () , que resolvió completamente este problema y el paquete resultó ser viable. En los comentarios sobre las noticias sobre el lanzamiento de la versión beta de Haiku en
Linux.org.ru, solté el enlace a mi paquete ensamblado y le pedí a alguien que me enviara a algunas comunidades de usuarios activos de este sistema operativo, y luego me fui a la cama.
Puerto de juego Adamant Armor Affection Adventure en Haiku.En la mañana, una persona que usaba el apodo de
3dEyes me escribió un correo electrónico . Como resultó más tarde,
Gerasim Troeglazov , uno de los desarrolladores activos de Haiku y autor del puerto de marco Qt para este sistema operativo, se escondía detrás de este nombre. Me mostró el repositorio HaikuPorts y me dijo cómo usar la utilidad HaikuPorter. Además, escribió una receta para construir el paquete HPKG para Adamant Armor Affection Adventure y lo agregó a HaikuDepot.
Después de analizar todos los cambios realizados por este desarrollador, noté que había algunos inconvenientes en mi paquete ensamblado manualmente, por ejemplo, la configuración no se guardó, ya que los directorios montados de los paquetes instalados no tenían capacidades de escritura. Este problema con la configuración de escritura o guardado en su paquete se resolvió elegantemente con la ayuda de enlaces simbólicos en un directorio especial accesible para grabación y destinado a guardar datos de usuario. Mi paquete tampoco tenía su propio ícono original.
Además, aprendí que Haiku no tiene aceleración de hardware de gráficos 3D, y que el mismo OpenGL se representa mediante programación utilizando la potencia de la CPU. Para aplicaciones de gráficos pesados esto, por supuesto, no es bueno, pero para juegos más antiguos es más que suficiente. Incluso decidí verificar específicamente el paquete del juego e instalé Haiku en mi vieja computadora portátil, es decir, en hardware real. Para mi sorpresa, la imagen de Adamant Armor Affection Adventure se renderizó tan rápido que si no me hubieran contado sobre la falta de aceleración de hardware, no me habría dado cuenta de que el procesador realiza el renderizado.
Fuente del proyecto: https://github.com/EXL/AdamantArmorAffectionAdventureDejé la creación manual de paquetes HPKG hasta tiempos mejores y cambié completamente a usar la herramienta HaikuPorter y escribir recetas. Pero a veces hay situaciones en las que se requiere la reconstrucción manual del paquete. Por ejemplo, si HaikuPorter establece la versión nocturna de Haiku en el archivo
.PackageInfo demasiado alta, y el paquete debe probarse en la versión de lanzamiento del sistema operativo. Vale la pena señalar que fue gracias a la capacidad de respuesta y la experiencia de Gerasim que pude entender las muchas sutilezas de crear paquetes para el sistema operativo Haiku y continué mi trabajo.
<< Saltar al contenido3. Modificación del puerto NXEngine existente (Cave Story)
Me sorprendió increíblemente encontrar una receta en el repositorio de HaikuPorts que hacía referencia a mi bifurcación del motor
NXEngine para el juego Cave Story , que había estado
analizando en mi
blog durante mucho tiempo. La receta y los parches fueron preparados por un desarrollador llamado
Zoltán Mizsei , utilizando el apodo
extrowerk y un mantenedor activo de muchos paquetes para Haiku.
Un análisis superficial, la instalación del paquete y el inicio de la aplicación revelaron los mismos problemas que describí en la sección anterior de este artículo: el guardado del juego no funcionó, la configuración tampoco se guardó y el paquete no tenía el ícono original. Decidí corregir estas deficiencias y comencé a trabajar en el parche, primero integrando todas las ideas de extrowerk. Escribí el
Makefile original para el sistema operativo Haiku y corregí la escritura y el almacenamiento de varios datos de usuario.
El juego Port of the Cave Story basado en el motor NXEngine, lanzado en el sistema operativo Haiku.Como el juego asumió las versiones en ruso e inglés con un conjunto diferente de archivos ejecutables y archivos de datos, decidí hacer un paquete común que combine dos versiones a la vez y seleccione automáticamente la correcta en función del idioma del sistema elegido por el usuario. Esto fue implementado por el script de Shell más simple:
Este script se inicia cuando se selecciona un elemento del juego en el menú "Aplicaciones" y determina la configuración regional actual del sistema. En caso de que el usuario elija el ruso como idioma del sistema, se iniciará la versión rusa del juego y, en todos los demás casos, la versión en inglés.
Pero con la creación del ícono original para la aplicación tuve que jugar bastante. El hecho es que en el sistema operativo Haiku solo se
permiten iconos vectoriales del formato
HVIF especial, que se establecen como atributos del
sistema de archivos
Be File System . En la documentación oficial, hay dos grandes manuales sobre cómo crear sus propios iconos para aplicaciones: el
primer manual describe el estilo de dibujo y diseño, y el
segundo manual explica en detalle cómo usar el programa del sistema
Icon-O-Matic diseñado para crear iconos.
Icon-O-Matic le permite importar los archivos SVG más simples y exportar el icono resultante al formato necesario para HaikuPorter, llamado HVIF RDef y que representa el mismo HVIF, pero convertido a una vista de texto. Los archivos RDef pueden contener no solo imágenes, sino también información adicional, por ejemplo, la versión de la aplicación y su descripción. De alguna manera, estos archivos se parecen a los archivos RES utilizados en Windows. Los siguientes comandos en la receta compilan los archivos RDef y establecen el resultado en atributos especiales:
rc nxengine-launcher.rdef resattr -o "$appsDir/NXEngine/Cave Story" nxengine-launcher.rsrc addResourcesToBinaries $sourceDir/build/nxengine-rus.rdef "$appsDir/NXEngine/RUS/Cave Story"
Además, la función
addResourcesToBinaries se define en las recetas, lo que permite automatizar este trabajo. Hay un problema, pero muy serio, con Icon-O-Matic: los archivos SVG que guarda el popular editor de vectores
Inkscape no se abren o se importan sin admitir algunas características necesarias, por ejemplo, degradados. Por lo tanto, una aventura de aventura con la conversión de imágenes de trama a vectores mediante el uso de varios convertidores en línea y sin conexión de pago y gratuitos, y luego abriendo los archivos SVG resultantes en Icon-O-Matic, fracasé miserablemente. Más tarde, resolví el problema de abrir archivos SVG y encontré una solución, pero escribiré sobre esto a continuación. Mientras tanto, decidí aprovechar las características estándar de Icon-O-Matic y dibujar el icono yo mismo. Después de media hora de copia impresa de píxeles, obtuve el siguiente arte:
El programa estándar Icon-O-Matic en el sistema operativo Haiku.Sí, utilicé un editor de vectores para crear una imagen en el género Pixel Art. En mi opinión aficionada de un hombre poco versado en arte, resultó bastante bien. Guardé este icono en el formato requerido, preparé todos los cambios, actualicé la receta y envié todo al repositorio de HaikuPorts.
Código fuente del proyecto: https://github.com/EXL/NXEngineEnvié los paquetes resultantes por si acaso y al sitio de fanáticos del juego
Cave Story (Doukutsu Monogatari) , cuya administración agregó el sistema operativo Haiku a la sección de descargas.
<< Saltar al contenido4. Portar el juego Gish
El siguiente proyecto que decidí transferir a Haiku fue el juego
Gish , que anteriormente había portado a Android. El repositorio HaikuPorts tenía una receta para una implementación gratuita inacabada de un juego llamado
Freegish , así que decidí agregar el juego original allí también, pero sin archivos de datos, ya que, a diferencia del motor, se entregan por separado y no son gratuitos.
Puerto de juego Gish que se ejecuta en el sistema operativo Haiku.No tuve ningún problema especial con portar este juego. El archivo ejecutable se compiló inmediatamente después de ejecutar los siguientes comandos de compilación:
cmake gish/src/main/cpp/ \ -DGLES=0 \ -DANDROID=0 \ -DSDL2_INCLUDE_DIR=`finddir B_SYSTEM_HEADERS_DIRECTORY` \ -DCMAKE_C_FLAGS="`sdl2-config --cflags` -D__linux__" \ -DCMAKE_BUILD_TYPE=Release cmake --build .
A continuación, implementé la capacidad de iniciar el juego desde el menú "Aplicaciones" y proporcioné soporte para guardar los datos del usuario en un directorio accesible para la grabación y destinado a esto:
char* getHaikuSettingsPath() { char path[PATH_MAX]; find_directory(B_USER_SETTINGS_DIRECTORY, -1, false, path, sizeof(path)); strcat(path, "/Gish/"); return strdup(path); }
La función
getHaikuSettingsPath () que usa la función
find_directory () de la API de Haiku forma la ruta completa al directorio que necesito.
Código fuente del proyecto: https://github.com/EXL/GishQuedaba por resolver la siguiente pregunta: ¿cómo debería elegir el usuario el directorio con los archivos originales del juego Gish? Podría intentar resolver el problema utilizando los scripts de Shell y la utilidad del sistema de
alerta , pero decidí abordar este problema más a fondo e implementar un práctico iniciador de GUI usando la API Haiku y el marco del
Kit de interfaz .
<< Saltar al contenido5. El proyecto BeGameLauncher, que le permite crear rápidamente lanzadores para juegos
Se decidió escribir mi proyecto BeGameLauncher en C ++ del antiguo estándar de 1998, utilizando las herramientas nativas del sistema operativo para crear aplicaciones con una interfaz gráfica de usuario. Como los nombres de muchos programas para Haiku y BeOS comienzan con el prefijo "Be", también decidí elegir un nombre para el proyecto. Decidí comenzar familiarizándome con el marco del Kit de interfaz, que es parte de la API de Haiku. Además de la documentación bastante detallada en el sitio web oficial de Haiku, encontré dos
cursos de lecciones
DarkWyrm simplemente excelentes que permiten a un desarrollador novato comprender rápidamente cómo funcionan ciertas clases de sistemas. El primer curso se llama
Aprender a programar con Haiku y al principio cubre los conceptos básicos del lenguaje de programación C ++, que será muy útil para los principiantes. El segundo curso se llama
Programación con Haiku y está destinado a aquellos que ya están familiarizados con C ++ y tienen conocimientos básicos de este lenguaje. Ambos cursos hablan sobre los aspectos más diversos de la API de Haiku y, por lo tanto, serán muy útiles para cualquiera que quiera comenzar a crear aplicaciones para este sistema operativo.
Después de leer este excelente material en diagonal, hice una impresión general de la API de Haiku y comencé a pensar en mis próximos pasos. Ya tenía algo de experiencia desarrollando aplicaciones de aplicaciones usando el marco Qt, que también está escrito en el lenguaje de programación C ++ y usa el paradigma de programación orientado a objetos. Entonces, la API de Haiku es muy similar, a excepción de la falta de un sistema de señal y ranuras, por lo que a menudo trazaré algunos paralelos y comparaciones con Qt. Además, vale la pena señalar el uso del principio de la
programación basada en eventos , que está muy extendida en la API de Haiku, que permite que varias entidades interactúen entre sí a través de la transmisión de eventos o mensajes. Un análogo de la clase
QEvent aquí es la clase
BMessage , alrededor de la cual se construye el sistema de interacción de objetos. Una instancia de la clase
BMessage generalmente obtiene un número único que le permite identificar al remitente y su acción en un filtro de eventos común.
Para mi proyecto, tuve que elegir las clases API de Haiku apropiadas que me permitieran implementar la funcionalidad deseada. En primer lugar, para iniciar una aplicación externa, era necesario encontrar un análogo de la clase
QProcess o la función
execve () POSIX, que, por cierto, también funciona bien en el sistema operativo Haiku, sin embargo, decidí que sería preferible usar herramientas nativas, pero por si acaso El caso dejaba la posibilidad de iniciar aplicaciones a través de la función POSIX. La clase de comunicación entre procesos
BRoster fue excelente para este propósito. Encontró un método
Launch () adecuado que le permite especificar la ruta al archivo ejecutable y pasarle argumentos. Como el lanzador debería poder guardar algunos parámetros, por ejemplo, un directorio seleccionado por el usuario con archivos de datos del juego, necesitaba una clase que hiciera todo esto. En Qt, dicha clase se llama
QSettings , y en la API de Haiku, como Gerasim me
indicó , hay una clase de
BMessage que ya
conozco , que tiene una característica muy útil. La cuestión es que la información de esta clase se puede serializar fácilmente y, por ejemplo, guardar en el disco. Esto es muy conveniente y a menudo se usa para registrar cualquier información de usuario en los programas, por eso elegí esta clase para guardar la configuración en mi proyecto para implementar lanzadores. , Haiku API
QDebug ,
stderr ,
fprintf() C:
BeDebug() , , . - , C++98 .
Qt
QMessageBox , - , , , . Haiku API
BAlert , , Qt. , , , - . , - .
. , , . ,
BeLauncherBase , , GUI-. ,
BeAboutWindow , « ...» , . , , , Gish, :
class GishAboutWindow : public BeAboutWindow { ... }; class GishLauncher : public BeLauncherBase { ... }; int main(void) { BeApp *beApp = new BeApp(SIGNATURE); GishLauncher *gishLauncher = new GishLauncher(BeUtils::GetPathToHomeDir()); beApp->SetMainWindow(gishLauncher); beApp->Run(); delete beApp; beApp = NULL; return 0; }
-,
main() , - . C++- Gish .
« ...» Gish., . . . «Run»
setenv() ,
getenv() , . , ,
BRoster Launch() : , , . . . . , . , , . , . .
, . : Makefile « »
CMake . , Haiku
makefile-engine , , , Haiku API, , . , , CMake makefile-engine. , .
Gish Haiku.. Qt -
tr() ,
lrelease lupdate , .
Qt Linguist , . Haiku API . , ,
B_TRANSLATE() ,
B_TRANSLATION_CONTEXT , . :
-DB_COLLECTING_CATKEYS , -
grep PRE- .
collectcatkeys , CATKEYS-.
linkcatkeys , . , . , Haiku API . ,
Localizing an application , . , BeOS
Locale Kit Haiku.
C++. , Haiku Qt, HaikuPorts IDE,
Qt Creator KDevelop . ,
JVM , IDE, Java, ,
NetBeans IntelliJ IDEA . Qt Creator,
LibClang , .
El entorno de desarrollo integrado Qt Creator que se ejecuta en el sistema operativo Haiku.En términos de IDE conocidos y multiplataforma en Haiku, todo está bien. ¿Pero qué hay de las soluciones exclusivas? No puedo dejar de mencionar un proyecto muy interesante, patrocinado por DarkWyrm y que actualmente apoya a Adam Fowler , se llama Paladin . Este programa hace que el editor de texto Pe esté disponible en la distribución del sistema operativo casi como un IDE real.Paladin Haiku, HaikuPorts.Haiku Paladin Pe . HaikuPorts
Koder ,
Notepad++ Windows
Scintilla . PLD- , Paladin IDE, .
Qt Creator , . , , . BeOS GUI- . , , , . , Haiku
Layout API , Interface Kit.
Layout API Haiku.Layout API, . Haiku
Laying It All Out , , .
, , . , Haiku . ,
Launch() BRoster . , , , . Haiku , , ,
Launch() , .
Launch() , , . . Haiku? . , ! GitHub Gerrit-
Haiku Code Review , SSH-, Haiku,
Code review :
git clone ssh://EXL@git.haiku-os.org/haiku --depth=1 -b master && cd haiku git commit git push origin master:refs/for/master
, commit- ID, Haiku Code Review. , , Haiku , . . ,
jam ,
Perforce Jam Haiku, .
ReadMe.Compiling.md , .
, Icon-O-Matic SVG-, Inkscape. , Icon-O-Matic
viewBox , , SVG- , Inkscape
Plain SVG file , Icon-O-Matic. SVG-, Icon-O-Matic . ReadMe- , Inkscape.
, . , . ,
GetBitmap() BTranslationUtils NULL:
Draw() fBitmap . , , . , C++ .
BeGameLauncher GitHub. , - Haiku:
: https://github.com/EXL/BeGameLauncher, HaikuPorts. Haiku, , , :
settype -t application/x-vnd.Be-elfexecutable $appsDir/Gish/engine/Gish rc $portDir/additional-files/gish.rdef -o gish.rsrc resattr -o $appsDir/Gish/engine/Gish gish.rsrc
QuickLaunch , . .
<<6. Xash3D: Half-Life
Xash3D GoldSrc,
Half-Life . Xash3D
, . ,
FWGS Xash3D , , Windows. FWGS Xash3D
mittorn a1batross (
libpony ),
MotoFan.Ru , .
: Haiku, Xash3D , Haiku Half-Life, ? — .
, , Xash3D, Haiku. -,
-D__linux__e intenté construir un ejecutable y un montón de bibliotecas. Sorprendentemente, las cosas fueron bastante rápido y al anochecer, después de haber enviado los archivos de datos para el juego, logré lanzar Half-Life y tomar el tren a la estación principal en Black Mesa.Xash3D Haiku Qt Creator., SDL2, , - , , : , OpenGL-, . SDL2 . , Haiku , , , .
El proyecto para crear lanzadores, sobre el cual escribí un poco más arriba, fue muy útil para mí. Usando la herencia de las clases de C ++, amplié seriamente su funcionalidad e implementé la capacidad de seleccionar varias adiciones al juego:Xash3D Haiku.: , . , . ,
XASH3D_BASEDIR , .
XASH3D_GAME , .
XASH3D_MIRRORDIR , . Xash3D . , , - Xash3D Haiku :
• ./cl_dlls/libclient-haiku.so
• ./dlls/libserver-haiku.so
• ./cl_dlls/libclient-haiku64.so
• ./dlls/libserver-haiku64.so
. Xash3D Half-Life,
Blue Shift Opposing Force , , - .
Xash3D . , ,
--help ,
MAX_SYSPATH ,
MAX_PATH , Haiku API. , , . , -
stderr . - ,
MAX_PATH Haiku. 1024 . , 4096 , . :
MAX_PATH , .
Half-Life, Blue Shift Opposing Force, Xash3D Haiku (, ).. ,
XASH_INTERNAL_GAMELIBS , . .
a1batross , ,
OpenVGUI . Xash3D Haiku ,
XASH_INTERNAL_GAMELIBS .
Haiku
WebPositive Xash3D . , , .
execve() ,
system() , - .
Xash3D
SDL_ShowSimpleMessageBox() SDL_ShowMessageBox(), solo el puerto de biblioteca SDL2 actual para Haiku no admite la creación de estos cuadros de diálogo. Nuestra versión de la biblioteca simplemente no tiene esta funcionalidad. Pero hablaré sobre la solución de este problema a continuación.El puerto del motor Xash3D, publicado en el repositorio de Haiku Depot., Xash3D Haiku, SDL2 ; 3D- . , , . , , . , . SDL2 Haiku Half-Life . , 3D- . , FPS. GPU, Intel.
: https://github.com/FWGS/xash3dFWGS Xash3D, , HaikuPorts HaikuDepot Haiku.
<<7. Serious Sam: The First Encounter The Second Encounter
Croteam Serious Engine , Serious Sam:
The First Encounter The Second Encounter . Haiku, .
Serious Engine Haiku.- , - , SDL2, Haiku.
stderr , .
Serious Sam: The Second Encounter, Serious Engine Haiku.. 3D-, , , . , , FPS, Xash3D, , . , . , , . , , , Haiku .
Serious Sam: The First Encounter, Serious Engine Haiku., . , Serious Sam: The First Encounter, . Serious Sam: The Second Encounter, , .
Lamentablemente, no fue sin problemas. Un cambio repetido en la resolución del modo de video en el juego condujo a la caída de todo el motor. En este caso, en mi distribución de Linux, este bloqueo no fue así. Pasé mucho tiempo localizando el problema y solucionándolo. Resultó que el punto era que con cada cambio en la resolución, la ventana SDL_Window se destruía y se creaba de nuevo. , OpenGL- - . SDL2 Haiku . , , . , : , , .
. Linux, , . ,
libvorbisfile, pero el motor en sí no se vincula con él, pero usa la función del sistema dlopen () para alimentar la secuencia de archivos de audio OGG a esta biblioteca. El problema era que el motor no podía encontrar esta biblioteca en Haiku, ya que no había un enlace simbólico al archivo de la biblioteca sin una versión. void CUnixDynamicLoader::DoOpen(const char *lib) {
, , . , . , API.
, , x86, x86_64 . x86
SERIOUS_MHZ , . , - . , , Haiku API , :
#include <kernel/OS.h> #include <stdio.h> ... uint64 cpuFreq = 0; uint32 count = 0; get_cpu_topology_info(NULL, &count); if (count != 0) { cpu_topology_node_info *topology = new cpu_topology_node_info[count]; get_cpu_topology_info(topology, &count); for (uint32 i = 0; i < count; ++i) { if(topology[i].type == B_TOPOLOGY_CORE) { cpuFreq = topology[i].data.core.default_frequency; } } delete[] topology; } fprintf(stderr, "%llu\n", cpuFreq);
. x86_64 , CPU 1 MHz, . ,
__GNU_INLINE_X86_32__ , , x86, x86_64. , SDL2, inline-
rdtsc /proc/cpuinfo , , x86, .
.
CMakeLists.txt -march=native , : , .
if(NOT PANDORA AND NOT HAIKU) message("Warning: arch-native will be used!") add_compile_options(-march=native) endif() if(HAIKU) if(CMAKE_SIZEOF_VOID_P EQUAL 4)
- build- , . MMX, SSE SSE2 , inline- , , .
, Croteam - , :
: https://github.com/EXLMOTODEV/Serious-Engine, Serious Sam, HaikuPorts. .
<<8. (Vangers)
, , 90- KD Lab.
Telegram IM , Haiku,
GitHub- , .
Haiku.Haiku - .
FFmpeg , . ,
VANGERS_DATA , .
Haiku Qt Creator., KD Lab. «» «» «» «», «» . , , .
, Haiku., , , ,
GOG.com Steam , . ,
stalkerg Linux. , . , .
NXEngine (Cave Story), , , , .
stalkerg -DBINARY_SCRIPT=Off , , , . , . : , , , .
, Haiku Depot., , Haiku.
libclunk.so , . Linux, ,
LD_LIBRARY_PATH , , , , Haiku , Windows. , , Haiku
./lib/ , . .
: https://github.com/KranX/Vangers, HaikuPorts HaikuDepot, , Linux- Fedora .
<<9. SDL2 Haiku
Xash3D Serious Engine, ,
SDL2 .
SDL_ShowSimpleMessageBox() SDL_ShowMessageBox() , - , , . : Windows, macOS, iOS, X11 Android, - Haiku. SDL2.
Haiku API, Interface Kit,
BAlert , . . , , , , ,
BAlert , . , : , ,
Go() . , , .
SDL2 Haiku., , ,
BAlert ,
BApplication ,
app_server . ,
BAlert , ,
BApplication , . Haiku API
BApplication ,
be_app , Qt
qApp , . ,
be_app NULL, , , . .
, SDL2 C, Haiku API, , C++. -
extern "C" , . ,
new new(std::nothrow) , NULL, , SDL2, , .
. , SDL2 , Haiku API .
, , . - , , . API SDL2, .
- ,
BTextView ,
BAlert ,
SetWordWrap() true , , . , :
strlen() . , SDL2 UTF-8, ,
strlen() , . Haiku API
BString ,
CountChars() , , :
bool CheckLongLines(const char *aMessage) { int final = 0;
Esta función comprueba el texto del mensaje en busca de líneas de más de 120 caracteres y, si corresponde, devuelve verdadero. En cuanto a UTF-8, todavía hubo un momento en que en algunas fuentes del sistema Haiku no hay soporte para caracteres chinos. Por lo tanto, por ejemplo, no puede establecer ninguna inscripción en chino en el título de la ventana. Pero el texto en ruso se instala sin problemas.Mientras preparaba el paquete, encontré un error de compilación para la arquitectura x86_gcc2, que se activa en la receta de la biblioteca SDL2. Resultó que el compilador GCC 2.95 más antiguo no podía adivinar que el código comentado es equivalente al siguiente: rgb_color ConvertColorType(const SDL_MessageBoxColor *aColor) const {
, .
SDL2 HaikuPorts, Xash3D Serious Engine - , , . SDL2 , HaikuPorts upstream SDL2. -
BE_* HAIKU_* , .
<<10. Cool Reader
Cool Reader ,
(
Buggins ), . , - , .
Cool Reader, Haiku.HaikuPorts Cool Reader, - - ,
SourceForge , , . HaikuPorts, Cool Reader. , , Haiku. Cool Reader GitHub-:
: https://github.com/EXLMOTODEV/coolreader, , .
__HAIKU__ , -
_LINUX , , . , Haiku ,
_LINUX , . , , . , .
<<11. KeymapSwitcher
Meta/Opt/Cmd/Win+Space . , . macOS, Windows Linux GNOME 3 . Android . , .
,
KeymapSwitcher , Haiku, , - . . , Haiku, . , HaikuPorts . , KeymapSwitcher Haiku, API - .
KeymapSwitcher Haiku ., KeymapSwitcher, , - Haiku. , , ,
Opt . ,
Opt . , HaikuPorts, KeymapSwitcher Haiku.
: https://github.com/HaikuArchives/KeymapSwitcher, .
<<12.
Estudiar la API de Haiku, así como resolver varios problemas exóticos que surgieron como resultado de portar nuevas y actualizar aplicaciones existentes para este sistema operativo, me trajo mucha experiencia valiosa y placer. Pude promover parches de soporte de Haiku en el repositorio de código fuente de algunos proyectos grandes y conocí a nuevas personas interesantes que de alguna manera estaban relacionadas con este hermoso sistema operativo., Haiku., 3D- , , Haiku , . ,
3D- GTK+3 , HaikuPorts
QtWebEngine . GTK+3 Firefox Chromium, QtWebEngine Blink , Qt,
Otter Browser Falkon .
, , ,
Lubuntu Windows XP. , . , - , , .
Todos mis puertos y mejoras ya se han publicado y están disponibles para su instalación para todos los usuarios de Haiku. Todos los cambios en el código fuente están disponibles en los respectivos repositorios bajo sus licencias originales. En este trabajo, utilicé una gran cantidad de materiales, el principal de los cuales destacaré en los enlaces útiles a continuación. Muchas gracias a stackoverflow.com y google.com por estar allí.1. El sitio web oficial del sistema operativo Haiku .2. El foro oficial del sistema operativo Haiku .3. Documentación oficial para usuarios de Haiku .4. Documentación oficial para desarrolladores de Haiku .5. Descripción de las características de la interfaz gráfica de usuario Haiku .6. Haiku .
7. Icon-O-Matic .
8. HVIF .
9. Interface Kit .
10. Locale Kit .
11. , Haiku .
12. Layout API .
13. , Haiku Layout API .
14. GitHub- Haiku .
15. GitHub- HaikuPorts .
16. HPKG- Haiku Depot Web .
17. «Haiku: -» INSTEAD, .
18. «Haiku: » INSTEAD, .
19. «Learning to Program with Haiku» DarkWyrm .
20. «Programming With Haiku» DarkWyrm .
21. « Haiku?» Linux.org.ru, .
22. Telegram IM, Haiku .habr ! , , 2019 !
<<