سؤال

هذه قصة نصين وترتبط بـ أ السؤال السابق.

النصان موجودان في http://Gist.github.com/50692.يعرض البرنامج النصي ansi.rb جميع الألوان البالغ عددها 256 لونًا على جميع ألوان الخلفية البالغ عددها 256 لونًا.يعرض البرنامج النصي ncurses.rb جميع الألوان الأمامية البالغ عددها 256 لونًا، لكن الخلفية تعرض الألوان الأساسية الستة عشر ثم يبدو أنها تتنقل عبر سمات مختلفة مثل الوميض والفيديو العكسي.

إذن ما الذي يعطي؟هل هذا هو الخطأ في ncurses الذي يستخدم عددًا صحيحًا موقّعًا لأزواج الألوان؟(على سبيل المثال، تشير "ألوان tput" إلى 256 ولكن "أزواج tput" تشير إلى 32767 بدلاً من 65536) يبدو أنه إذا كان الأمر كذلك، فسيتم عرض النصف الأول من أزواج الألوان بشكل صحيح ولكن النصف الثاني سيتكرر أو يدخل في السمات مثل int يلتف.

هل كانت مفيدة؟

المحلول

والسبب هو أن ncurses قبل ABI 6، والذي يتضمن الإصدار الحالي الذي تستخدمه معظم التوزيعات بما في ذلك Debian وAmazon AMI، COLOR_PAIR(n) لا يمكن الإشارة إلى أي أزواج محددة فوق 256.وذلك لأن الحجة ل COLOR_PAIR(n) هو من النوع cchar_t .تختار البتات الثمانية السفلية زوج الألوان، ويتم التعامل مع الباقي كعلامات نقطية ORتم إدخاله لسمات طرفية محددة.ولهذا السبب ترى وميضًا، أو معكوسًا، أو تسطيرًا، وما إلى ذلك.عند محاولة تجاوز الزوج رقم 255 في نموذج التعليمات البرمجية الخاص بك.

هذا أمر مؤسف جدًا، وأخطط لاستخدام قائمة الانتظار في برنامجي لتحديد الألوان بسرعة init_pair() وقم فقط بالكتابة فوق الأزواج الأقل استخدامًا مؤخرًا كحل وسط.لقد كتبت إلى المشرف على ncurses توماس ديكي متسائلاً عما إذا كانت هناك طريقة للخروج من ncurses مؤقتًا لكتابة رموز طرفية أولية ثم العودة إلى ncurses.وكان هذا رده:

في الأساس ، يجب عليك أن تنسى تحسين الشاشة وأن تقوم برسمك الخاص باستخدام الوظائف المدرجة في TermInfo (3) ، مثل Tigetstr ، MvCur ، Tputs.

يمكنك الخروج مؤقتًا من ncurses ، ولكن بعد ذلك تضطر إلى إعادة طيبة الشاشة.وإلا فإن ncurses سيتم الخلط بين ما هو موجود على الشاشة ومكان المؤشر.

يبدو أن هذا الحل يقدم الكثير من المخاطر، ولكن إذا كنت بحاجة مطلقًا إلى أكثر من 256 زوجًا متزامنًا في برنامج ncurses (بدون حساب الأزواج التي يمكنك تزييفها باستخدام السمة المعكوسة)، فهذا ما سيتعين عليك فعله.

نصائح أخرى

لا أعرف روبي على الإطلاق، لذا لا يمكنني تقديم مثال عملي، ولكن يجب أن يخبرك البرنامج النصي ncurses.rb بشيء وهو أنه أقصر بكثير من البرنامج النصي ansi.rb.

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

تحتاج إلى استخدام int init_color(short color, short r, short g, short b) لتهيئة فهرس الألوان بقيم RGB (0 - 1000) ثم ضبط أزواج الألوان لاستخدامها في العرض int init_pair(short pair, short f, short b) قبل الاتصال COLOR_PAIR(n).

لقابلية النقل يجب عليك التحقق bool has_colors(void) و bool can_change_color(void)

على نظامي، تعتبر صفحات الدليل الخاصة بـ ncurses لا تقدر بثمن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top