نظام التشغيل Haiku: ترقية التطبيقات وإنشاء الحزم

في خريف هذا العام ، بعد 6 سنوات من التطوير ، تم إصدار النسخة التجريبية الأولى من "R1 / beta1" لنظام التشغيل Haiku . لقد تابعت هذا المشروع المثير للاهتمام لفترة طويلة ، والذي يهدف إلى إعادة تطوير وتطوير نظام BeOS الذي كان موجودًا في الفترة 1994-2000. لذلك ، حالما رأيت أخبارًا عن إصدار الإصدار التجريبي من Haiku على مواقع أخبار تكنولوجيا المعلومات ، قررت على الفور معرفة ما تمت إضافته إلى هذا الإصدار الذي طال انتظاره. بعد تثبيت النظام في الجهاز الظاهري VirtualBox وقليل من المعرفة بوظائفه الرئيسية ، اعتقدت أنه سيكون من الجيد مساعدة مجتمع OpenSource ، الذي يقوم بتطوير نظام التشغيل هذا ، قليلاً اليوم. قررت أن أبدأ بما اكتسبته من خبرة قليلة في: نقل بعض مشاريع الألعاب.


سطح مكتب نظام التشغيل هايكو.

بعد ذلك ، حاولت تحسين بعض التطبيقات والمكتبات الحالية. هذا هو نشاطي الصغير في مستودعات متعددة المصادر مفتوحة سيتم تخصيصها لهذه المقالة. في ذلك ، سوف أصف باستمرار المشاكل التي واجهتها والتحدث عن طرق لحلها. لقد حاولت إرسال معظم التصحيحات التي تم إجراؤها أثناء هذا العمل إلى المشروعات الحالية من أجل توفير دعم Haiku فيها وتلبية اهتمام مطوريها بوجود أنظمة تشغيل بديلة.

يستخدم نظام التشغيل Haiku نواة مختلطة ، وهو عبارة عن تطبيق لبنية microkernel مع القدرة على تحميل الوحدات الضرورية ديناميكيًا. يعتمد على شوكة نواة NewOS ، التي تم تطويرها بواسطة مهندس سابق في شركة Be Inc. ، بقلم ترافيس Geiselbrecht. يعمل هذا المطور اليوم في Google على نواة تسمى Zircon لنظام تشغيل Google Fuchsia الجديد ، لكن هذه قصة أخرى. لذا ، نظرًا لأن مطوري Haiku يعلنون توافقًا ثنائيًا مع BeOS ، فإنهم يضطرون إلى دعم ليس فرعين معماريين مألوفين ، بل ثلاثة: x86_64 و x86 و x86_gcc2. العمارة الأخيرة عبارة عن تحميل للتوافق مع برنامج التحويل البرمجي للإصدار القديم من GCC 2.95. بفضلها ، من الممكن تشغيل التطبيقات المكتوبة لنظام التشغيل BeOS الأصلي. لسوء الحظ ، بسبب تحميل هذا التوافق ، لا يمكن لمطوري Haiku استخدام الميزات الحديثة للغة برمجة C ++ في واجهات برمجة التطبيقات للنظام. ومع ذلك ، يعدون صور التثبيت لبنيان فقط: x86_64 و x86. الشيء هو أن توزيع Haiku لـ x86 مختلط: على الرغم من حقيقة أن جميع مكونات النظام مبنية تحت x86_gcc2 من أجل التوافق الثنائي ، يتم منح المستخدم الفرصة لتثبيت أو إنشاء أي تطبيقات حديثة تم تصميمها من أجل المجمعين الحديثين ومعمارية x86 . توزيع Haiku للعمارة x86_64 بالكامل 64 بت وليس لديه القدرة على تشغيل تطبيقات BeOS و Haiku 32 بت. ومع ذلك ، هناك توافق على مستوى واجهة برمجة التطبيقات ، لذلك إذا كان لديك شفرة المصدر للتطبيق تحت BeOS أو Haiku x86 ، فيمكنك تجميعه بسهولة تحت Haiku x86_64 ويجب أن يعمل كل شيء. يوصى بتثبيت صورة لنظام التشغيل للهيكل x86_64 على الأجهزة الحقيقية إذا كنت لا تحتاج إلى دعم لأية تطبيقات BeOS محددة أو تطبيقات Haiku 32 بت.

تجدر الإشارة إلى أنه يوجد في نظام التشغيل هذا دعم جزئي لمعيار POSIX . هذا الأساس يجعله أقرب إلى الأنظمة المشابهة لنظام UNIX ويجعل من السهل نقل برامجهم. لغة البرمجة الرئيسية هي لغة C ++ ، حيث يتم استخدامها بنشاط ، نظرًا لأن واجهات برمجة التطبيقات (API) العامة في Haiku تتبع بشكل أساسي نموذجًا للبرمجة موجهة للكائنات. ومع ذلك ، لا أحد يحظر استخدام لغة البرمجة C ، إلا أنه في معظم الحالات ، من الضروري كتابة طبقات التوافق المقابلة. يتم تجميع واجهة البرنامج الخاصة بنظام التشغيل في أطر نظام منفصلة تكون مسؤولة عن فرصة معينة ، على سبيل المثال ، عن دعم واجهة أو شبكة. هذا يشبه إلى حد ما ما هو متاح على ماك أو في إطار كيو تي . تأكد من ملاحظة أن نظام التشغيل هذا مستخدم فردي ، على الرغم من توفر بعض التقدم نحو توفير وضع عمل متعدد المستخدمين لمطوري Haiku.

لا يسعني إلا أن أشارك القراء في هذه المقالة التجربة الإيجابية لاستخدام نظام إدارة نافذة التطبيق المتوفر في هايكو. في رأيي ، هي واحدة من الأكثر ملاءمة وفي طريقها هي السمة المميزة لنظام التشغيل هذا.


إدارة النوافذ المتقدمة في نظام التشغيل Haiku: دعم التبليط وعلامات التبويب.

يمكن تثبيت Windows معًا في علامات تبويب ، كما هو الحال في المتصفحات الحديثة ، وإرفاقها ببعضها البعض وتغيير حجمها بسهولة. تبليط بسيط ، ونقل سياقات بعض التطبيقات من نافذة إلى أخرى ، ويتم دعم النسخ المتماثلة . يمكنك قراءة المزيد حول جميع ميزات نظام النوافذ المحلي في الوثائق الرسمية ، وهناك جميع مفاتيح الاختصار اللازمة موصوفة هناك.

لن أكتب في هذه المقالة نظرة عامة كاملة على جميع ميزات وقدرات Haiku ، لأن أولئك الذين يهتمون به سيكونون قادرين على العثور بسهولة على المعلومات الضرورية على الإنترنت بأنفسهم.

المحتوى:


1. الحزم والمستودعات في هايكو
2. الخطوات الأولى: ترقية آدمنت درع عاطفة المغامرة
3. تعديل منفذ NXEngine الحالي (Cave Story)
4. ترقية لعبة Gish
5. مشروع BeGameLauncher ، والذي يسمح لك بإنشاء قاذفات للألعاب بسرعة
6. ترقية Xash3D: لعبة Half-Life الأسطورية والإضافات الرسمية
7. نقل شطري اللعبة Serious Sam: اللقاء الأول واللقاء الثاني
8. ترقية لعبة Vangers
9. تنفيذ مربعات الحوار في مكتبة SDL2 لـ Haiku
10. ترقية شوكي من قارئ بارد
11. الانتهاء من برنامج KeymapSwitcher
12. الخاتمة

1. الحزم والمستودعات في هايكو


مقارنةً بـ BeOS الأصلي ، ظهر ابتكار هام في Haiku: نظام إدارة الحزم الذي يتضمن أدوات متنوعة للحصول على البرامج وتثبيتها من مصادر مختلفة. يمكن أن تكون هذه المصادر مستودعات Haiku و HaikuPorts الرسمية ، ومستودعات غير رسمية ، وببساطة مجموعات HPKG منفصلة ومعدّة خصيصًا. هذه القدرات لتثبيت البرامج وتحديثها معروفة منذ زمن طويل في عالم أنظمة التشغيل المشابهة لـ Unix ، ولكن الآن وصلت كل قوتها وراحتها إلى Haiku بنجاح ، وهو ما لا يسعه إلا إرضاء المستخدمين العاديين لنظام التشغيل هذا. بفضل البنية التحتية المبنية على مدير الحزم ، أصبح بإمكان أي مطور الآن بسهولة نقل تطبيق جديد أو تعديل تطبيق موجود مفتوح المصدر ، ثم إضافة نتائج أعمالهم إلى مستودع منفذ برنامج HaikuPorts ، وبعد ذلك سوف تكون متاحة لجميع مستخدمي Haiku. ونتيجة لذلك ، فإن النظام البيئي الناتج يشبه أنظمة تشغيل macOS مع Homebrew أو FreeBSD مع منافذها أو Windows مع MSYS2 أو Arch Linux مع AUR .

يتم توفير أداة لإنشاء حزم وبرامج ترقية ، تسمى HaikuPorter ، بشكل منفصل عن نظام التشغيل ويتم تثبيتها باستخدام دليل صغير موجود في المستودع على GitHub. بعد تثبيت هذه الأداة من نفس GitHub ، يتم تنزيل شجرة الوصفة بالكامل ، والتي يعمل عليها المطور. الوصفة عبارة عن برنامج نصي عادي لـ Shell مع تعليمات يقوم HaikuPorter بجمعها لحزمة HPKG المطلوبة. من الجدير بالذكر أن الأداة نفسها مكتوبة بلغة برمجة Python 2 ، وتتفاعل عن كثب مع نظام إدارة الحزم الحالي ، وتستخدم الأداة القياسية Git داخليًا لإصلاح التغييرات على الكود المصدري للبرنامج وإنشاء مجموعة من التصحيحات. بفضل هذه المجموعة من التكنولوجيا ، أصبحت عملية إعداد وصفات لبناء حزم HPKG وتصحيحات البرامج في شكل ملفات patchset مريحة للغاية وبسيطة. في معظم الحالات ، كان علي استخدام ثلاثة أوامر فقط عند العمل مع HaikuPorter:

alias hp="haikuporter -S -j4 --get-dependencies --no-source-packages" hp libsdl2 hp libsdl2 -c hp libsdl2 -e 

يقوم الأمر الأول ببساطة بتجميع الحزمة المحددة ، بينما يقوم الأمر الثاني بمسح دليل الإنشاء ، بينما يقوم الثالث بإنشاء أو تحديث مجموعة من التصحيحات وفقًا للتغييرات التي تم تسجيلها في مستودع Git لدليل العمل من خلال عمليات الالتزام.

وبالتالي ، من أجل نشر حزمة إلى مستودع HaikuPorts وإتاحتها لجميع مستخدمي Haiku ، يجب على المطور تثبيت HaikuPorter ، وتوسيع شجرة الوصفة ، وجمع حزمة HPKG محليًا واختبارها ، ثم الالتزام بشوكة شجرة الوصفة الخاصة به. ثم تقديم طلب سحب على جيثب. يجب على مطوري Haiku النظر في العمل المنشور ، وبعد ذلك قرروا دمج تغييراتك في المستودع أو إرسالها للمراجعة. إذا تم قبول التغييرات ، فسوف يقوم نفس HaikuPorter المثبت على خادم الإنشاء بعد ذلك بتجميع الحزمة ونشرها تلقائيًا إلى المستودع.

تمت إضافة برنامج HaikuDepot خاص إلى الإصدار التجريبي من "R1 / beta1" لنظام التشغيل Haiku ، والذي يسمح بالعمل مع الحزم والمستودعات من خلال واجهة مستخدم رسومية ، وليس من خلال أوامر وحدة التحكم في الجهاز.


برنامج HaikuDepot يعمل على نظام التشغيل Haiku.

بفضل هذه الأداة ، يمكن لمستخدمي هايكو عديمي الخبرة والمبتدئين إدارة قاعدة الحزم الخاصة بهم بسهولة. تجدر الإشارة إلى أن هذا التطبيق ليس فقط واجهة المستخدم الرسومية قذيفة على مدير الحزمة الحالية ، ولكن أيضا تنفيذ وظائف إضافية. على سبيل المثال ، يمكن للمستخدمين المصرح لهم تقييم وكتابة تعليقات على الحزم المتاحة للتثبيت. بالإضافة إلى ذلك ، يوجد لدى HaikuDepot موقع Haiku Depot خاص على الويب يتيح لك عرض تغييرات الحزمة على الإنترنت أو تنزيل حزم HPKG الفردية.

<< تخطى إلى المحتوى

2. الخطوات الأولى: ترقية آدمنت درع عاطفة المغامرة


بعد أن تعرفت على وظائف نظام التشغيل في الجهاز الظاهري VirtualBox ، قررت تقييم مكتبة SDL2 فيه وتوصيل لعبة Adamant Armor Affection Adventure إلى Haiku ، والتي كتبت عنها حول النقل إلى نظام Android في وقت سابق. بناء البرنامج لا يتطلب أي تغييرات على الكود المصدري ، لقد قمت فقط بتثبيت جميع الأدوات اللازمة والمكتبات وملفات رأسها من المستودع وقمت بما يلي:

 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 . = إيقاف -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 . 

نظرًا لأن Haiku لديه POSIX ، فإن -D__linux__ أو -D__unix__ يحدد حل العديد من المشكلات المرتبطة بتعريف النظام الأساسي. ومع ذلك ، تجدر الإشارة إلى أنه من الأفضل التخلي عن استخدامها وتنفيذ دعم Haiku في التعليمات البرمجية المصدر للمشروع إذا كانت هناك مشاكل بناء مماثلة. يتيح لك استدعاء الأداة المساعدة لنظام finddir باستخدام وسيطة معينة الحصول على المسار الصحيح لملفات الرأس للعديد من الأشكال المعمارية.

لذلك ، من خلال تنفيذ الأوامر أعلاه ، قمت بتجميع ملف قابل للتنفيذ تم تشغيله بشكل مثالي ، وكانت اللعبة تعمل بشكل مثالي. اعتقدت أنه سيكون من الرائع إعداد حزمة HPKG مكتفية ذاتياً من خلال اللعبة ، ولهذا تعمقت في البحث عن المعلومات التي أحتاجها. ثم لم أكن أعلم أي أدوات ملائمة لبرامج النقل ، مثل HaikuPorter ، التي كتبت عنها في القسم أعلاه ، ومن أجل تحقيق هدفي قررت الغش وتفكيك بعض حزم النظام لمعرفة كيف يتم ترتيبها داخل و القيام عن طريق القياس.

على الإنترنت ، عثرت على المعلومات المطلوبة ، ثم قمت بفك حزمة نظام عشوائي باستخدام أرشيف Expander المضمّن في مدير الملفات المحلي ، وعثرت على ملف .PackageInfo ، وقمت بتحريره ، واستبدلت الملفات وفقًا لهيكل طلبي. بعد ذلك قمت بتشغيل الأوامر لإنشاء حزمة HPKG وتثبيتها على النظام:

 package create -C AAAA/ aaaa.pkg pkgman install aaaa.pkg 

لسوء الحظ ، لم ينجح تشغيل اللعبة من قائمة "التطبيقات". عن طريق تشغيل الملف القابل للتنفيذ في الجهاز الطرفي ، تلقيت رسالة خطأ تفيد بأنه كان من المستحيل العثور على ملفات البيانات اللازمة لتشغيل التطبيق وتشغيله. في هذه الحالة ، إذا كان في المحطة انتقل إلى دليل حزمة التطبيق ، ثم بدأ كل شيء على ما يرام. قادني ذلك إلى فكرة أنه عند بدء اللعبة من القائمة ، تحتاج إلى إجراء تغيير قسري على دليل التطبيق. يمكن القيام بذلك إما باستخدام برنامج نصي Shell أو عن طريق تغيير مصدر اللعبة. اخترت الخيار الثاني وأضفت شيئًا مشابهًا لهذا الرمز:

 #ifdef __HAIKU__ // To make it able to start from Deskbar chdir(dirname(argv[0])); #endif 

في بداية وظيفة البداية main () ، والتي تحل هذه المشكلة تمامًا ، وتبين أن الحزمة قابلة للتطبيق. في التعليقات على الأخبار المتعلقة بإصدار نسخة بيتا من Haiku على Linux.org.ru ، أسقطت الرابط إلى الحزمة المجمعة وطلبت من شخص أن يرسلني إلى بعض مجتمعات المستخدمين النشطة في نظام التشغيل هذا ، ثم انتقلت إلى الفراش.


ميناء لعبة آدمانت درع المغامرة المغامرة يعمل على هايكو.

في الصباح كتب لي شخص يستخدم لقب 3dEyes رسالة بريد إلكتروني. كما اتضح فيما بعد ، كان Gerasim Troeglazov ، أحد مطوري Haiku النشطين ومؤلف منفذ إطار عمل Qt لنظام التشغيل هذا ، مختبئًا خلف هذا الاسم. أطلعني على مستودع HaikuPorts وأخبرني كيفية استخدام الأداة المساعدة HaikuPorter. بالإضافة إلى ذلك ، كتب وصفة لإنشاء حزمة HPKG لـ Adamant Armor Affection Adventure وإضافتها إلى HaikuDepot.

بعد تحليل جميع التغييرات التي أجراها هذا المطور ، لاحظت وجود بعض العيوب في الحزمة المجمعة يدويًا ، على سبيل المثال ، لم يتم حفظ الإعدادات ، نظرًا لأن الدلائل المثبتة للحزم المثبتة لا تملك إمكانيات للكتابة. تم حل هذه المشكلة في إعدادات الكتابة أو الحفظ في الحزمة الخاصة به بأناقة بمساعدة الارتباطات في دليل خاص يمكن الوصول إليه للتسجيل والمقصود لحفظ بيانات المستخدم. حزمة بلدي أيضا لم يكن لديك رمز الأصلي الخاص به.

بالإضافة إلى ذلك ، علمت أن Haiku لا يحتوي على تسريع أجهزة للرسومات ثلاثية الأبعاد ، ويتم تقديم OpenGL نفسه برمجيًا باستخدام طاقة وحدة المعالجة المركزية. بالنسبة لتطبيقات الرسومات الثقيلة ، هذا بالطبع ليس جيدًا ، ولكن بالنسبة للألعاب القديمة ، هذا أكثر من كافٍ. حتى أنني قررت التحقق من حزمة اللعبة على وجه التحديد وتثبيت Haiku على جهاز الكمبيوتر المحمول القديم ، أي على أجهزة حقيقية. لدهشتي ، ظهرت صورة مغامرة أدامانت أرمور أدفنتشرز بسرعة كبيرة لدرجة أنه إذا لم يخبروني عن عدم وجود تسارع في الأجهزة ، فلن لاحظت أن العرض يتم بواسطة المعالج الخاص بي.

مصدر المشروع: https://github.com/EXL/AdamantArmorAffectionAdventure

لقد قمت بإيقاف الإنشاء اليدوي لحزم HPKG حتى أوقات أفضل وتحولت بالكامل إلى استخدام أداة HaikuPorter وكتابة الوصفات. ولكن في بعض الأحيان تكون هناك مواقف عندما تكون إعادة البناء اليدوي للحزمة مطلوبة. على سبيل المثال ، إذا قام HaikuPorter بتعيين الإصدار الليلي Haiku في ملف .PackageInfo عاليًا جدًا ، وتحتاج الحزمة إلى اختباره على إصدار إصدار نظام التشغيل. تجدر الإشارة إلى أنه بفضل استجابة Gerasim وتجربته ، تمكنت من فهم العديد من التفاصيل الدقيقة لإنشاء حزم لنظام التشغيل Haiku واستمرار عملي.

<< تخطى إلى المحتوى

3. تعديل منفذ NXEngine الحالي (Cave Story)


لقد فوجئت بشكل لا يصدق بإيجاد وصفة في مستودع HaikuPorts الذي أشار إلى مفترقتي الخاصة بمحرك NXEngine للعبة Cave Story ، التي كنت قد قمت بتحليلها على مدونتي لفترة طويلة جدًا. تم إعداد الوصفة والبقع من قبل مطور يدعى Zoltán Mizsei ، وذلك باستخدام extrowerk للاسم المستعار وصاحب نشط للعديد من الحزم لـ Haiku.

كشف تحليل سطحي وتثبيت الحزمة وتشغيل التطبيق عن نفس المشكلات التي وصفتها في القسم السابق من هذه المقالة: لم ينجح حفظ اللعبة والإعدادات لم يتم حفظها أيضًا ولم تحتوي الحزمة على الرمز الأصلي. قررت إصلاح هذه العيوب وبدأت العمل على التصحيح ، أولاً دمج جميع الأفكار الطارد. كتبت Makefile الأصلي لنظام التشغيل Haiku وقمت بتصحيح الكتابة وحفظ بيانات المستخدم المختلفة.


لعبة Port of the Cave Story تعتمد على محرك NXEngine ، الذي تم إطلاقه في نظام التشغيل Haiku.

نظرًا لأن اللعبة افترضت الإصدارات الروسية والإنجليزية مع مجموعة مختلفة من الملفات القابلة للتنفيذ وملفات البيانات ، فقد قررت إنشاء حزمة مشتركة تجمع بين نسختين في وقت واحد وتختار تلقائيًا الحزمة الصحيحة بناءً على لغة النظام التي اختارها المستخدم. تم تنفيذ ذلك بواسطة أبسط برامج شل:

 #!/bin/bash if [[ `locale -l` == ru* ]] ; then EXE="`finddir B_SYSTEM_APPS_DIRECTORY`/NXEngine/RUS/Cave Story" else EXE="`finddir B_SYSTEM_APPS_DIRECTORY`/NXEngine/ENG/Cave Story" fi "$EXE" $@ 

يتم تشغيل هذا البرنامج النصي عند تحديد عنصر اللعبة في قائمة "التطبيقات" وتحديد لغة النظام الحالية. في حالة اختيار المستخدم للغة الروسية كلغة نظام ، ستبدأ النسخة الروسية من اللعبة ، وفي جميع الحالات الأخرى ، النسخة الإنجليزية.

ولكن مع إنشاء الرمز الأصلي للتطبيق كان علي أن العبث. الحقيقة هي أنه في نظام التشغيل Haiku يُسمح فقط برموز المتجهات بتنسيق HVIF الخاص ، والتي يتم تعيينها كسمات لنظام الملفات Be File System . في الوثائق الرسمية ، يوجد دليلان كبيران حول إنشاء أيقوناتك الخاصة للتطبيقات: يصف الدليل الأول أسلوب الرسم والتصميم ، ويوضح الدليل الثاني بالتفصيل كيفية استخدام برنامج نظام Icon-O-Matic لإنشاء الرموز.

يسمح لك Icon-O-Matic باستيراد أبسط ملفات SVG وتصدير الأيقونة الناتجة إلى التنسيق الضروري لـ HaikuPorter ، ويسمى HVIF RDef ويمثل نفس HVIF ، ولكن يتم تحويله إلى طريقة عرض نص. لا يمكن أن تحتوي ملفات RDef على صور فحسب ، بل تحتوي أيضًا على معلومات إضافية ، على سبيل المثال ، إصدار التطبيق ووصفه. في بعض الطرق ، تشبه هذه الملفات ملفات RES المستخدمة في Windows. الأوامر التالية في الوصفة تقوم بترجمة ملفات RDef وتعيين النتيجة على سمات خاصة:

 rc nxengine-launcher.rdef resattr -o "$appsDir/NXEngine/Cave Story" nxengine-launcher.rsrc addResourcesToBinaries $sourceDir/build/nxengine-rus.rdef "$appsDir/NXEngine/RUS/Cave Story" 

بالإضافة إلى ذلك ، يتم تعريف الوظيفة addResourcesToBinaries في الوصفات ، والتي تتيح أتمتة هذا العمل. هناك مشكلة واحدة ولكنها خطيرة للغاية في Icon-O-Matic: ملفات SVG التي يحفظها محرر Inkscape الشعبي لا يتم فتحها أو استيرادها دون دعم بعض الميزات الضرورية ، على سبيل المثال ، التدرجات. لذلك ، فإن السعي وراء المغامرة بتحويل الصور النقطية إلى صور متجهية من خلال استخدام مختلف المحولات المدفوعة وغير المجانية على الإنترنت وغير المتصلة ، ثم فتح ملفات SVG الناتجة في Icon-O-Matic ، فشلت فشلاً ذريعًا. بعد ذلك ، تمكنت من حل مشكلة فتح ملفات SVG والعثور على حل لها ، لكنني سأكتب عن ذلك أدناه. في غضون ذلك ، قررت الاستفادة من الميزات القياسية لـ Icon-O-Matic ورسم الرمز بنفسي. بعد نصف ساعة من النسخ الثابتة للبكسل ، حصلت على الفن التالي:


برنامج Icon-O-Matic القياسي في نظام التشغيل Haiku.

نعم ، استخدمت محرر متجه لإنشاء صورة في نوع Pixel Art. في رأيي الهواة عن رجل ضليع في الفن ، اتضح أنه جيد. قمت بحفظ هذا الرمز بالتنسيق المطلوب ، وأعدت كل التغييرات ، وقمت بتحديث الوصفة وأرسلت كل شيء إلى مستودع HaikuPorts.

شفرة مصدر المشروع: https://github.com/EXL/NXEngine

لقد أرسلت الحزم الناتجة فقط في القضية وإلى موقع المعجبين في لعبة Cave Story (Doukutsu Monogatari) ، التي أضفت إدارتها نظام التشغيل Haiku إلى قسم التنزيل.

<< تخطى إلى المحتوى

4. ترقية لعبة Gish


كان المشروع التالي الذي قررت نقله إلى Haiku هو لعبة Gish ، التي سبق أن نقلتها إلى Android. يحتوي مستودع HaikuPorts على وصفة لتنفيذ مجاني لم يكتمل لعبة تسمى Freegish ، لذلك قررت إضافة اللعبة الأصلية هناك أيضًا ، لكن بدون ملفات البيانات ، حيث يتم تسليمها بشكل منفصل ولا يتم إطلاقًا مجانًا.


ميناء لعبة Gish يعمل على نظام التشغيل Haiku.

لم يكن لدي أي مشاكل خاصة مع ترقية هذه اللعبة. تم ترجمة الملف القابل للتنفيذ مباشرة بعد تنفيذ أوامر الإنشاء التالية:

 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 . 

بعد ذلك ، قمت بتطبيق القدرة على تشغيل اللعبة من قائمة "التطبيقات" وقدمت الدعم لحفظ بيانات المستخدم إلى دليل يمكن الوصول إليه للتسجيل ويهدف إلى ذلك:

 char* getHaikuSettingsPath() { char path[PATH_MAX]; find_directory(B_USER_SETTINGS_DIRECTORY, -1, false, path, sizeof(path)); strcat(path, "/Gish/"); return strdup(path); } 

تشكل وظيفة getHaikuSettingsPath () باستخدام دالة find_directory () لواجهة برمجة تطبيقات Haiku المسار الكامل إلى الدليل الذي أحتاج إليه.

شفرة مصدر المشروع: https://github.com/EXL/Gish

يبقى لحل السؤال التالي: كيف يجب على المستخدم اختيار الدليل مع الملفات الأصلية للعبة Gish؟ يمكنك محاولة حل المشكلة باستخدام البرامج النصية Shell والأداة المساعدة لنظام التنبيه ، لكنني قررت التعامل مع هذه المشكلة بشكل أكثر شمولًا وتنفيذ مشغل واجهة المستخدم الرسومية مريحة باستخدام Haiku API وإطار عمل Interface Kit .

<< تخطى إلى المحتوى

5. مشروع BeGameLauncher ، والذي يسمح لك بإنشاء قاذفات للألعاب بسرعة


تقرر كتابة مشروعي BeGameLauncher في الإصدار C ++ من المعيار القديم لعام 1998 ، باستخدام الأدوات الأصلية لنظام التشغيل لإنشاء تطبيقات بواجهة مستخدم رسومية. نظرًا لأن أسماء العديد من البرامج الخاصة بـ Haiku و BeOS تبدأ بالبادئة "Be" ، فقد قررت أيضًا اختيار مثل هذا الاسم للمشروع. قررت البدء بالتعرف على إطار عمل Interface Kit ، والذي يعد جزءًا من واجهة برمجة تطبيقات Haiku. بالإضافة إلى الوثائق التفصيلية إلى حد ما على موقع Haiku الرسمي ، فقد وجدت دورتين دراسيتين ممتازتين لـ DarkWyrm تتيحان لمطور مبتدئ أن يفهم بسرعة كيف تعمل بعض فصول النظام. تسمى الدورة الأولى " تعلم البرمجة مع هايكو" وفي البداية تغطي أساسيات لغة البرمجة C ++ ، والتي ستكون مفيدة جدًا للمبتدئين. الدورة الثانية تسمى البرمجة مع هايكو وهي مصممة لأولئك الذين هم بالفعل على دراية C ++ ولديهم معرفة أساسية بهذه اللغة. تتحدث كلتا الدورتين عن أكثر الجوانب تنوعًا في Haiku API ، وبالتالي ستكون مفيدة جدًا لأي شخص يريد بدء إنشاء تطبيقات لنظام التشغيل هذا.

بعد قراءة هذه المادة الممتازة قطريًا ، تركت انطباعًا عامًا عن واجهة برمجة تطبيقات Haiku وبدأت في التفكير في الخطوات التالية. كان لدي بالفعل بعض الخبرة في تطوير تطبيقات التطبيقات باستخدام إطار عمل Qt ، والذي تمت كتابته أيضًا بلغة برمجة C ++ ويستخدم نموذج البرمجة الموجه للكائنات. لذا ، فإن واجهة برمجة تطبيقات Haiku تشبهها كثيرًا ، باستثناء عدم وجود نظام إشارة وفتحات ، لذلك سأرسم غالبًا بعض المقارنات والمقارنات مع Qt. بالإضافة إلى ذلك ، تجدر الإشارة إلى استخدام مبدأ البرمجة الذي يحركه الأحداث ، وهو أمر شائع في واجهة برمجة تطبيقات Haiku ، والذي يسمح للكيانات المختلفة بالتفاعل مع بعضها البعض من خلال نقل الأحداث أو الرسائل. التماثل من فئة QEvent هنا هو فئة BMessage ، حيث يتم بناء نظام تفاعل الكائنات. يحصل مثيل فئة BMessage بشكل عام على رقم فريد يسمح لك بتحديد المرسل وإجراءاته في عامل تصفية حدث شائع.

بالنسبة لمشروعي ، كان علي اختيار فئات واجهة برمجة تطبيقات Haiku المناسبة التي تسمح لي بتنفيذ الوظيفة المقصودة. أولاً ، لبدء تشغيل تطبيق خارجي ، كان من الضروري العثور على نسخة تماثلية من فئة QProcess أو وظيفة POSIX execve () ، والتي ، بالمناسبة ، تعمل بشكل جيد في نظام التشغيل Haiku ، ومع ذلك ، فقد قررت أن استخدام الأدوات الأصلية سيكون من الأفضل ، ولكن فقط في حالة تركت القضية إمكانية تشغيل التطبيقات من خلال وظيفة POSIX. كانت فئة التواصل بين المعالجات BRoster كبيرة لهذا الغرض. عثر على طريقة Launch () مناسبة تتيح لك تحديد المسار إلى الملف القابل للتنفيذ وتمرير الوسائط إليه. نظرًا لأن المشغل يجب أن يكون قادرًا على حفظ بعض المعلمات ، على سبيل المثال ، دليل محدد من قبل المستخدم مع ملفات بيانات اللعبة ، فقد احتجت إلى فصل يقوم بكل هذا. في Qt ، تسمى هذه الفئة QSettings ، وفي واجهة برمجة تطبيقات Haiku ، كما طالبني Gerasim ، هناك فئة BMessage أعرفها بالفعل ، والتي لها ميزة مفيدة للغاية. الشيء هو أنه يمكن إجراء تسلسل سهل للمعلومات من هذه الفئة ، على سبيل المثال ، حفظها على القرص. هذا مناسب جدًا وغالبًا ما يستخدم لتسجيل أي بيانات مستخدم في البرامج ، ولهذا اخترت هذه الفئة لحفظ الإعدادات في مشروعي لتنفيذ المشغلات. , Haiku API QDebug , stderr , fprintf() C:

 // .h #if __cplusplus >= 201103L #define BeDebug(...) fprintf(stderr, __VA_ARGS__) #else extern void BeDebug(const char *format, ...); #endif // __cplusplus == 201103L // .cpp #if __cplusplus < 201103L #include <cstdarg> void BeDebug(const char *format, ...) { va_list args; va_start(args, format); vfprintf(stderr, format, args); va_end(args); } #endif 

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 , .


Qt Creator, Haiku.

IDE Haiku . ? , DarkWyrm Adam Fowler , Paladin . Pe IDE.


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() , .

 // Error const char* args[] = { "/bin/open", fURL.String(), NULL }; be_roster->Launch(&ref, 2, args); // Good const char* args[] = { fURL.String(), NULL }; be_roster->Launch(&ref, 1, args); // See "src/kits/app/Roster.cpp", BRoster::ArgVector::Init() method: if (error == B_OK) { fArgs[0] = fAppPath.Path(); // <= Here if (argc > 0 && args != NULL) { for (int i = 0; i < argc; i++) fArgs[i + 1] = args[i]; if (hasDocArg) fArgs[fArgc - 1] = fDocPath.Path(); } // NULL terminate (eg required by load_image()) fArgs[fArgc] = NULL; } 

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:

 // Somewhere fBitmap = BTranslationUtils::GetBitmap(B_PNG_FORMAT, fIndex); void BeImageView::Draw(BRect rect) { // Fail const BRect bitmapRect = fBitmap->Bounds(); ... } 

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__ . , , Half-Life Black Mesa.


Xash3D Haiku Qt Creator.

, SDL2, , - , , : , OpenGL-, . SDL2 . , Haiku , , , .

, , . C++- :


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() , SDL2 Haiku . . .


Xash3D, Haiku Depot.

, Xash3D Haiku, SDL2 ; 3D- . , , . , , . , . SDL2 Haiku Half-Life . , 3D- . , FPS. GPU, Intel.

: https://github.com/FWGS/xash3d

FWGS 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, , .

, . . Linux . . , , SDL_Window , OpenGL- - . SDL2 Haiku . , , . , : , , .

. Linux, , . , libvorbisfile , , dlopen() , OGG-. , Haiku , .

 void CUnixDynamicLoader::DoOpen(const char *lib) { // Small HACK for Haiku OS (: #ifdef __HAIKU__ static int vorbis_cnt = 3; char path[PATH_MAX]; char libpath[PATH_MAX]; find_directory(B_SYSTEM_LIB_DIRECTORY, -1, false, libpath, PATH_MAX); if (strstr(lib, "vorbis")) { snprintf(path, sizeof(path), "%s/libvorbisfile.so.%c", libpath, char(vorbis_cnt + '0')); vorbis_cnt++; lib = path; } #endif // fprintf(stderr, "dlopen => %s\n", lib); module = ::dlopen(lib, RTLD_LAZY | RTLD_GLOBAL); SetError(); } 

, , . , . , 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) # 32-bit message("Warning: Will building 32-bit executable with MMX, SSE, SSE2 support.") add_compile_options(-mmmx -msse -msse2) else() # 64-bit message("Warning: Will building 64-bit executable.") endif() endif() 

- 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; // This UTF-8 friendly. PS G_MAX_STRING_LENGTH = 120 BString message = aMessage; int32 length = message.CountChars(); for (int i = 0, c = 0; i < length; ++i) { c++; if (*(message.CharAt(i)) == '\n') { c = 0; } if (c > final) { final = c; } } return (final > G_MAX_STRING_LENGTH); } 

120- . UTF-8 , Haiku . , , - , . .

x86_gcc2, SDL2. , GCC 2.95 , , :

 rgb_color ConvertColorType(const SDL_MessageBoxColor *aColor) const { // return { aColor->r, aColor->g, aColor->b, 255 }; rgb_color color = { aColor->r, aColor->g, aColor->b, color.alpha = 255 }; return color; } 

, .

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.


Haiku API, , , . Haiku , .


, Haiku.

, 3D- , , Haiku , . , 3D- GTK+3 , HaikuPorts QtWebEngine . GTK+3 Firefox Chromium, QtWebEngine Blink , Qt, Otter Browser Falkon .

, , , Lubuntu Windows XP. , . , - , , .

Haiku. . , . stackoverflow.com google.com , .

1. Haiku .
2. Haiku .
3. Haiku .
4. Haiku .
5. 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 !

<<

Source: https://habr.com/ru/post/ar434690/


All Articles