اليوم سوف نتحدث عن كيفية ترتيب الرسم فانتوم واجهة المستخدم.
(ما هو Phantom OS الذي يمكنك اكتشافه
بقراءة هذه المقالات .)
بتعبير أدق - كيف ولدت هذه واجهة المستخدم الرسومية. لفترة طويلة كان لدى Phantom استنتاج بياني فقط - كان من المستحيل تقريبًا توصيل أي شيء إلى النظام باستخدام الماوس.
لقد حان الوقت الآن لجعل ما لا يقل عن بسيطة - ولكن التطبيقات ، مما يعني - تحتاج إلى واجهة مستخدم. على أي حال - النظام ، سنكون صادقين ، بدا الأمر مخيفًا. وهذا ليس في الموضة الآن.
ما الذي كان متاحًا في بداية مشروع واجهة المستخدم؟ من حيث المبدأ - الكثير.
في الواقع ، كان هناك رسومات - برنامج تشغيل فيديو ، نظام فرعي للنافذة في وضع العرض فقط ، خطوط نقطية ، نظام فرعي لأحداث النوافذ (أحداث) ، تحكم في تركيز النافذة والأولويات ذات الصلة.
الآن الخطوات وأكثر من ذلك بقليل.
يمكن للنظام الفرعي لبرنامج تشغيل الفيديو تشغيل وظيفة probe () للعديد من برامج التشغيل بدورها ، وتلقي الطلبات منها للحصول على أقصى درجات الدقة وشاهد الألوان ، بالإضافة إلى القدرة على العمل في وضع التسريع ثنائي الأبعاد. يتطلب النظام لونًا لا يقل عن 24 بت. في هذا المستوى ، لدينا أداة ضبط إطارات (شاشة في الذاكرة) ، وماوس ، وأنواع متعددة من بدائل bitblt.
بدائل Bitblt - تم تنفيذ ثلاثة أنواع أساسية - النسخ الكامل للرسومات (مع قطع المستطيلات) والنسخ مع مراعاة الشفافية الثنائية (البيكسل إما شفافة بالكامل أو غير شفافة تمامًا) و z-buffer. بمعنى ، القدرة على النسخ على الشاشة فقط تلك البكسلات ذات الإحداثي z أكبر من الإحداثي z للبكسل الموجود - للعمل على تداخل جزئي من النوافذ.
الطبقة التالية من الوظائف هي النظام الفرعي للنافذة. يوجد هنا مفهوم النافذة ، زخرفة النافذة (الإطار ، نافذة العنوان مع الأزرار) ، إحداثيات x / y / z للنوافذ ومجموعة من الوظائف المسؤولة عن رسم النوافذ على الشاشة والتحكم في حركتها على طول جميع المحاور.
تتبع الأحداث التالية - قائمة انتظار microtask ، والتي تتم معالجتها بواسطة برنامج التشغيل ذي المستوى الأدنى لتقديم حالة الإطارات وإدارتها.
تجدر الإشارة إلى أن أفضل عقول البشرية تدعي أنه لا يمكن كتابة نظام رسم بياني يعمل بثبات وبدون مشاكل في بيئة ذات مؤشرات ترابط دون قائمة انتظار للأحداث. محاولاتي المتواضعة لتجاهل هذا البيان لم تؤكده حتى الآن. من الصعب للغاية الاستغناء عن قائمة انتظار الرسائل وجعل كافة مؤشرات الترابط التي تطلب أحداث نافذة للبرنامج وأحيانًا تؤدي إلى نشوب حرب على الشاشة.
لذلك ، يتم تطبيق معظم بدائل نظام النافذة المتعلقة بأي شيء أكبر من الصورة داخل النافذة من خلال قائمة انتظار الرسائل. يرسل الطلب إلى قائمة الانتظار رسالة "ارسم هذه المنطقة على الشاشة" أو "إعادة ترتيب النافذة أعلى الآخرين" ، ويقوم مؤشر ترابط منفصل أدناه بتنفيذها بطريقة منظمة ومدروسة.
إنه ببساطة يحصل على تدفق الأحداث من الماوس (مضغوط ، يتم سحبه) ، ولوحة المفاتيح (مضغوطة ، تم إصدارها) ونظام النافذة نفسه (أحداث ثانوية - بعد تحريك النافذة لأعلى ، إعادة رسم منطقة الشاشة).
مهمة منفصلة على مستوى تدفق الأحداث هي ما يسمى التركيز. تستقبل النافذة المركزة مجموعة من الأحداث من لوحة المفاتيح ، وبالفعل يتم تمييزها بوضوح على الشاشة كنقطة لمعالجة نشاط المستخدم. بالإضافة إلى المهمة الواضحة المتمثلة في اختيار نافذة لتوجيه الحدث ، يُعلم هذا النظام النافذة أيضًا بفقدان التركيز ، وهو أمر مهم في بعض الأحيان.
المستوى التالي هو الرسومات الأولية للرسم على النافذة.
هناك خياران رئيسيان للتنفيذ. قديم واقتصادي - عندما لا تخزّن النافذة نسخة مما يوجه إليها. إذا تم مسح مثل هذه النافذة ، وكنت بحاجة إلى رسمها مرة أخرى (على سبيل المثال ، تم إرجاع النافذة إلى الشاشة من الحافة) ، ثم تقوم النافذة باستدعاء الوظيفة من برنامجها ، وينبغي أن تقوم هذه الوظيفة بسحب كل ما هو مطلوب. هذا نموذج نموذجي وغير مريح بشكل رهيب لمجموعة متنوعة من الأسباب. يتم تحديد الإطار الثاني في Phantom - تحتوي كل نافذة على صورة نقطية حيث يتم رسم محتويات الإطار حاليًا. يمكن لنظام الرسوم الرجوع دائمًا إلى هذه النسخة وتحديثها على الشاشة دون سحب برنامج المستخدم.
لاحظ أن النافذة التي ينتمي إليها برنامج المستخدم (وليس النواة) في Phantom ، بالطبع ، ثابتة ، ويتم تخزينها في ذاكرة ثابتة وبعد إعادة التشغيل ، يحفظ نظام التشغيل كل شيء مرسوم فيه. هذا ، بالمناسبة ، مفيد بشكل مدهش ويبسط كود التطبيق في بعض الأماكن إلى غير لائق.
تسمح مجموعة من أشكال الرسم الأولية لرمز التطبيق ، كالمعتاد ، برسم نقطة وخط وخريطة نقطية وسطر نص في خط صورة نقطية وبعض الأشياء الصغيرة الأخرى في النافذة.
على هذا ثراء النظام الفرعي للرسومات في بداية مشروع "New Phantom UI" وانتهى. من حيث المبدأ ، كانت مجموعة هذا الرجل كافية للكثير ، ولكن فقط تجاه المستخدم. لا المدخلات.
بتعبير أدق ، كان هناك دعم أولي لمفهوم "الزر" ، ولكن فقط باستخدام الماوس ، فقط في شريط الأدوات وإغلاق النافذة فقط. :)
كانت مهمة التطوير كما يلي:
- تروتايب. بدون هذا ، إنه عار.
- أحداث لوحة المفاتيح وضوابط لوحة المفاتيح. على الأقل الأساسية.
- للتفكير في توطين التخطيطات - على الأقل الأبجدية السيريلية ، ولكن إرساء الأساس لتغيير المخططات.
- عناصر التحكم - أزرار ، أزرار الراديو ، حقول النص ، التسميات ، القوائم وهلم جرا.
- التركيز على التحكم هو اختيار نقطة التحكم داخل النافذة.
- نوع من مكون الشاشة لإدارة النوافذ على الشاشة. شريط المهام؟
- في الواقع ، يجب ألا تكون صور عناصر التحكم وبشكل عام نوعًا ما من تصميم واجهة المستخدم - مزرعة جماعية كما كانت.
كان مثل هذا:

على الطريق ، اتضح أن هناك حاجة أيضًا إلى مزج ألفا ، أي الشفافية الجزئية للبكسل عند تركيب الصور. حسنًا ، أصبح من الواضح أن الوقت قد حان للمس Unicode من أجل الضرع.
ينقسم نهج هذا الوزن إلى ثلاثة أجزاء كبيرة: التصميم ، ترامب ، البقية.
حول التصميم ، باختصار: هناك تصميمات UI مجانية على الإنترنت دون متطلبات الاستخدام الشريرة. ثلاثة أيام للبحث والاختيار ، وقت لا نهاية له لقطع الفنية للعناصر الرسومية.
ورقة رابحة
كنت خائفة من هذا ، لكن ، كما اتضح ، عبثا. هناك libfreetype ، وهناك أمثلة للتطبيق ، وبعد يومين ، كان تقديم الخطوط المتجهة يعمل جيدًا في وضع الاختبار.
ومع ذلك ، هناك الدقيقة ، وليس كل الطريق قد تمت تغطيتها. وهي. العمل مع الخطوط من النواة - هو. ثم يتم تشغيل الخطوط بواسطة القرص الثابت إلى ثنائي النواة. هذا أمر لا مفر منه بالنسبة لخط النظام ، ولكن يجب أن يكون لرمز المستخدم آليات التحميل الخاصة به. على الرغم من أن بعض FS في الفانتوم ، بالطبع ، سيكون وسيظل ، هذا النموذج غير طبيعي بالنسبة له. يجب أن تكون قادرًا على تخزين الخطوط في كائنات ثابتة والحصول عليها عبر الشبكة.
والثاني أكثر بساطة - وفرة خطوط الخطوط المجانية وفيرة ، ولن يكون تنظيمها طويلاً.
لكن الأول ...
ربما لا تعرف ، لكن متغيرات السلسلة في Phantom تمتلك خصائص غير متوقعة للمبرمجين الذين لا يعتادون على الثبات. يمكنهم استبدال الملفات. دفق البايت هو دفق البايت. ليس ذلك فحسب ، بل هو أيضًا ، حسب التعريف ، معيّن للذاكرة - إنه متغير. هذا هو ، من حيث المبدأ ، ما نقوم بتخزينه في نظام التشغيل العادي في ملف ، في فانتوم ، يمكنك ببساطة وضعه في متغير سلسلة. أتصرف كثيرًا - ولدي برنامج التحويل البرمجي لـ Phantom تصميم - لامتصاص الملف في سلسلة ثابتة. حتى في userland فانتوم تخترق ، على سبيل المثال ، الصور النقطية. ولكن هذه طريقة مخزية أيضًا ، لأنه في وقت التشغيل يجب تحليل هذا المتغير للحصول على تمثيل قابل للتشغيل للكائن. ومع ذلك ، بالنسبة للصور النقطية ، على شرف مفهوم Phantom ، كل شيء على ما يرام هنا. نقوم بتجميع الملف الرسومي إلى سلسلة عند التجميع ، وعندما يتم تشغيل Phantom لأول مرة ، يتم تحويله إلى كائن ثنائي ثابت من نوع bitmep ، ويتم استخدامه بالفعل لاحقًا بعد أي عدد من إعادة تشغيل نظام التشغيل ولا يتطلب المصدر الأصلي. يجب أن يتم ذلك أيضًا باستخدام الخطوط ، ولكنه أقل شيوعًا. عند العمل ، يتم تقديم الخط المتجه إلى نقطية ، وسيكون من الضروري تخزين مثل هذه البيانات النقطية المقدمة. هذه ليست خدعة أو مشكلة - يمكن طيها مرة أخرى في كائنات Phantom مثل الصورة النقطية ، ولكن يوجد بالفعل نوع من البنية التحتية اللازمة - صورة نقطية لصورة حرفية على غرار نمط رسم الخط (رمز UTF).
هذه ليست مهمة صعبة ، ولكن ، على ما يبدو ، مهمة المرحلة المقبلة. بينما يتم تنقيط الخطوط عند الاستئناف.
يونيكود
يتضمن تقديم الخطوط بحكم التعريف العمل مع Unicode. هذا ، بالطبع ، أمر جيد ، لأنه كان على المرء أن يبدأ في وقت ما. في الواقع ، كان يكفي لتزويد العارض بمحول من UTF-8 إلى UTF-32 (وهذا هو رقم الصورة الرمزية في الخط) ، وتنزيل الخطوط باستخدام الأبجدية السيريلية وهذا الجزء من الترجمة يعمل. علاوة على ذلك ، إذا كنا نريد لغات أخرى ، فمن الضروري والكافي استبدال الخط. ومع ذلك ، يحتوي الخط الأساسي المحدد على الكثير - بالنسبة لأوروبا ، وهو ما يكفي بالتأكيد. الصين سوف تحتاج إلى استبدال الخط ، نعم.
العمل مع لوحة المفاتيح
لم يكن هناك أي دليل على القيام بعمل عسكري على الإطلاق ، ولكن أكثر من الآمال ، كان علي القتال. اتضح أن برنامج تشغيل لوحة المفاتيح القديم لا يزال ... على أمل رؤية الأجهزة من IBM PC XT. نعم ، القرن الماضي. الحقيقة هي أن وحدة التحكم في لوحة المفاتيح قادرة على (كانت قادرة!) على تحويل رموز مسح لوحات المفاتيح الحديثة (ما يسمى المجموعة الثانية من الرموز) إلى تلك القديمة.
اتضح بسبب تأخر QEMU ، مثل هذا التحويل ، على ما يبدو ، أخيرًا. أو اندلعت عن طريق الخطأ. ولكن الحقيقة هي أن السائق رفض العمل. مع الحزن ، لمدة ساعة ، وبمساعدة بعض الأم ، قمت بنقل السائق من جامعة الشارقة المفتوحة إلى فانتوم. فقط لمعرفة أن لديه نفس المشكلة. المجموعة الأولى. اضطررت إلى إعادة كتابة جدول رموز المسح والمحلل. لم أعد إلى السائق القديم ، ولهذا السبب. اتضح أن برنامج التشغيل من uOS لديه واجهة أكثر أناقة للنظام. وهو لا يرجع إليه ، كما كان معتادًا ، زوج (رمز حرف ، رمز مسح زر) ، ولكن حرف UTF-32 واحد 32 بت. اتضح أنه في UTF هناك مجموعة خاصة من الأكواد المخصصة للاستخدام المحلي ، وهي أكثر من كافية لجميع مفاتيح الوظائف الممكنة. العمل مع دفق مثل هذه الأحداث في رمز واجهة المستخدم أبسط بكثير.
علاوة على ذلك ، وقع التعريب تمامًا على مثل هذا النموذج. يكفي تراكب جدول ASCII-> UTF32 للغة المرغوبة (مجموعة الحروف) والهتافات - لدينا السيريلية. حسنا - تقريبا هناك. الآن سيكون من الضروري إما تحويلها إلى رمز UTF-8 ، أو إعادة تشكيل مخلفات بعض أجزاء واجهة المستخدم إلى UTF-32. أنا أيضًا ، وضعت هذه اللحظة كأولوية منخفضة.
ضوابط
الأزرار والراديو وخانات الاختيار وعناصر واجهة المستخدم المحددة الأخرى.
البنية التحتية المشتركة تشمل:
- آلية لتخزين الضوابط فيما يتعلق النافذة
- عناصر تصور التحكم النموذجي - الإطار ، الخلفية ، النص ، الأيقونة ، إلخ.
- انتقال إلى التحكم في الحدث وأنماط رد الفعل النموذجية (الضغط / التبديل)
- تتبع أحداث الماوس وحالة التمرير
- عمليات الاسترجاعات وإنشاء أحداث ثانوية للإبلاغ عن تغييرات الحالة
التركيز السيطرة
من أجل استخدام عنصر التحكم (زر ، على سبيل المثال) بدون ماوس ، هناك حاجة إلى عدة أشياء.
- القدرة على تحديده من لوحة المفاتيح
- عرض هذا الاختيار
- استجابة لوحة المفاتيح
- التركيز فقدان الكشف.
هذا الأخير هو الأصعب.
في الواقع ، يركز عنصر التحكم على كل من لوحة المفاتيح والماوس ، وهذا هو نفس الكيان - إذا اخترنا حقل نص باستخدام الماوس ، فسيستجيب أيضًا للمفاتيح. إذا قمت بعد ذلك بالضغط على TAB ، فسوف ينتقل الحق في العمل باستخدام لوحة المفاتيح إلى جهاز آخر.
المهمة المنفصلة هي أنه يمكن تجميع بعض عناصر التحكم ويجب تحديث حالتها بطريقة مرتبطة. إن الضغط على أحد شعاع الراديو "يضغط" على جيرانه في المجموعة.
مرة أخرى ، عد إلى حقيقة أننا نكتب نظام تشغيل مستمر. هذا يعني أن التحكم المحتمل يمكن تخزينه في ذاكرة الوصول العشوائي المستمرة والبقاء على قيد الحياة عند إعادة تشغيل نواة النظام.
وهذا يعني أن علاقتها بالنواة ستكون جيدة لتقليلها. كل مؤشر إلى الذاكرة غير الدائمة (فعليًا إلى kernel) بعد إعادة التشغيل سيكون غير صالح ويجب استعادته. هذا يعني أن هذا المؤشر لا يملك الحق في تخزين المعلومات حول حالة عنصر التحكم. موقف المؤشر كعدد صحيح - نعم. مؤشر إلى مخزن مؤقت في kernel الذي يتم تحديد موضعه بواسطة موضع المؤشر لا. حسنًا أو نعم ، فقط عدد صحيح لا يزال موجودًا وهو أكثر أهمية. هذا في الممارسة العملية ليست مرهقة للغاية ، ولكن يجب علينا أن نتذكر.
وأخيرا ، شريط المهام. هذا شيء من هذا القبيل في الجزء السفلي (الجانب العلوي) من الشاشة حيث يقوم المستخدم بدس إذا فقد النافذة.
من حيث المبدأ ، يجب أن يكون هذا جزءًا من أرض المستخدم ، ولكن ... النواة تستخدم بالفعل واجهة المستخدم الرسومية ، لذلك في الوقت الحالي سيكون هذا الجزء أيضًا في الأسفل. آمل مؤقتا.
في المجموع

في رأيي ، تم حل المهام التي تم تعيينها في هذا الاتجاه بشكل عام. بالطبع ، لا يوجد حد للكمال ، ولكن ، كما يبدو لي ، اتخذت الواجهة خطوة ملموسة من المتسلل إلى العالمي.