مدتها این موضوع معلق بود تا اینکه فرصت کنم و تکمیلش کنم . تصمیم گرفتم کمی درباره ساخت یک UI بر مبنای text صحبت کنم . چیزی که همه ما از ابتدای برخوردمون با کامپیوتر باهاش درگیر هستیم، اما کاملا بی توجه از کنارش عبور میکنیم . در دسترس ترین مثال برای این موضوع، UI مربوط به Bios کامپیوتر ماست .یک UI گرافیکی مبتنی بر متن شامل انواع منوها و متون و صفحات مختلف.
کتابخانه مورد استفاده برای نوشتن یک UI مبتنی بر متن NCurses نام دارد. قصدم معرفی مقدماتی این کتابخانه است، شاید خیلی از دوستان بپرسند چرا Qt نه؟! Qt هم جذابیت بصری بیشتری داشته و هم احتمالا سرعت بیشتری در پیاده سازی ها برای برنامه نویس به ارمغان میآورد، من هم منکر این مزیتهای Qt نیستم، اما حجم کتابخانه NCurses نسبت به Qt قابل مقایسه نیست و اینکه من قصدم تکرار مکررات نیست، بلکه پرداختن و معرفی قسمتهایی که در جامعه آیتی کمتر بهشون پرداخته شده و معمولا ناشناخته هستند، جزء اهداف من بوده و هست . درباره Qt مطالب خیلی زیادی وجود دارد اما درباره NCurses مطلب زیادی به فارسی نداریم.
نصب کتابخانه NCurses
برای نصب Ncurses در توزیع اوبونتو از دستور
sudo apt-get update sudo apt-get install ncurses-dev
همچنین فایل سورس در آدرس GNU Operating System موجود است ، میتوان بعد از دانلود مثل تمامی برنامههای لینوکسی اقدام به نصب نمود.
tar zxvf ncurses<version>.tar.gz # unzip and untar the archive cd ncurses<version> # cd to the directory ./configure # configure the build according to your # environment make # make it su root # become root make install # install it
کامپایل کردن برنامههای شامل کتابخانه ncurses توسط gcc
برای کامپایل یک برنامه نوشته شده در لینوکس از gcc بصورت زیر استفاده میکنیم:
gcc -o exe_name program_name.c
که exe_name نام دلخواه ما برای فایل اجرایی و program_name.c نام فایل سورس ما به زبان c است.
در صورتیکه بجز کتابخانههای استاندارد موجود به همراه gcc از کتابخانهای که به صورت دستی نصب کردهایم استفاده کنیم، در انتهای دستور فوق باید نام کتابخانه مورد استفاده با پیشوند l- هم نوشته شود، در مثال ما دستور فوق بصورت زیر اصلاح میشود:
gcc -o exe_name program_name.c -lncurses
برای آموزش از Trace کردن برنامههای ساده شروع میکنیم:
#include <ncurses.h> int main() { initscr(); /* Start curses mode */ printw("Hello World !!!"); /* Print Hello World */ refresh(); /* Print it on to the real screen */ getch(); /* Wait for user input */ endwin(); /* End curses mode */ return 0; }
برنامه فوق عبارت !!!Hello World را در یک صفحه جدید نمایش میدهد.
تابع ()initscr ترمینال را جهت استفاده ncurses آماده سازی میکند. در بعضی پیاده سازیها این آماده سازی شامل ایجاد یک صفحه خالی ترمینال وتخصیص فضای مورد نیاز در حافظه سیستم برای این پنجره میشود. برای هرگونه تغییر، ابتدا باید تابع ()initscr فراخوانی شود تا بتوانیم تغییرات مدنظر خود را در صفحه ( این صفحه stdscr نامیده میشود) اعمال کنیم.
تابع ()printw همانند تابع معروف ()print عمل میکند بجز اینکه خروجی آن در صفحه stdscr ، در مختصات دلخواه (x,y) چاپ میشود.
تابع ()refresh ،عملکرد جالبی را ارائه میدهد. تابع printw تعداد زیادی flag را تنظیم کرده و محتویات مورد نظر ما را در بافر خود مینویسد. اما بدون استفاده از تابع ()refresh این نوشته ها در صفحه stdscr چاپ نمیشوند . برای چاپ باید حتما یکبار تابع ()refresh فراخوانی شود.
این کار باعث بهبود عملکرد و انعطاف پذیری بیشتر برنامه خواهد شد، به این صورت که هر برنامه ممکن است تعداد زیادی آپدیت برای نمایش در صفحه نمایش داشته باشد که همگی در بافر تجمیع شده و با هر بار اجرای تابع ()refresh صفحه نمایش به روزرسانی خواهد شد.
در انتها با فراخوانی تابع ()endwin به کار در مد curses پایان میدهیم. به این صورت که ترمینال به صورت عادی برخواهد گشت و فضاهای حافظه گرفته شده آزاد میشود.این تابع بعد از اتمام کار در مد curses فراخوانی میشود.
ادامه دارد … .
این مطلب ترجمه آزادی از این نوشته در سایت tldp.org بود .
اولین باشید که نظر می دهید