| UIL(file formats) | UIL(file formats) |
نام (NAME)
UIL - قالب پرونده زبان واسط کاربری (User Interface Language)
خلاصه دستور (SYNOPSIS)
MODULE module_name
[ NAMES = CASE_INSENSITIVE | CASE_SENSITIVE ]
[ CHARACTER_SET = character_set ]
[ OBJECTS = { widget_name = GADGET | WIDGET; [...] } ]
{ [
[ value_section ] |
[ procedure_section ] |
[ list_section ] |
[ object_section ] |
[ identifier_section ]
[ ... ]
] }
END MODULE;
توضیحات (DESCRIPTION)
زبان UIL برای توصیف وضعیت اولیه واسط کاربری یک برنامه مبتنی بر ویجت (widget) به کار میرود. UIL ویجتهای بهکاررفته در واسط، منابع (resources) آن ویجتها، و بازخوانیهای (callbacks) آنها را توصیف میکند. پرونده UIL با استفاده از دستور uil یا توسط کامپایلر قابل فراخوانی Uil() به یک پرونده UID کامپایل میشود. سپس محتویات پرونده UID کامپایلشده میتواند از طریق توابع مختلف مدیریت منابع موتیف (MRM) از درون یک برنامه کاربردی در دسترس قرار گیرد.
پرونده UID مستقل از بستری است که برنامه Motif در نهایت روی آن اجرا خواهد شد. به عبارت دیگر، همان پرونده UID را میتوان در هر سیستمی که قادر به اجرای Motif باشد استفاده کرد.
پرونده (File)
یک پرونده UIL از یک ماژول کامل منفرد (که در ساختار نحوی بالا توضیح داده شد) تشکیل میشود، یا اگر قرار باشد پرونده در یک پرونده UIL بزرگتر گنجانده شود، از یک «بخش» کامل (همانطور که در ادامه شرح داده شده) تشکیل میگردد. زبان UIL از پنج نوع بخش مختلف استفاده میکند: مقدار (value)، روال (procedure)، فهرست (list)، شیء (object)، و شناسه (identifier).
زبان UIL یک زبان آزادقالب (free-form) است. این بدان معناست که سازههای سطح بالا مانند اعلانهای شیء و مقدار نیازی به شروع از ستون خاصی ندارند و میتوانند در چند خط امتداد یابند. سازههای سطح پایین مانند کلمات کلیدی و نشانههای نگارشی نیز میتوانند در هر ستونی آغاز شوند؛ با این حال، به استثنای رشتههای متنی صریح و توضیحات درونکد، نمیتوانند در چند خط شکسته شوند.
کامپایلر UIL خطوط ورودی با طول حداکثر ۱۳۲ کاراکتر را میپذیرد.
- MODULE module_name
- نامی که ماژول UIL در پرونده UID با آن شناخته میشود. این نام در پرونده UID ذخیره میشود تا بعداً توسط MRM برای بازیابی منابع مورد استفاده قرار گیرد. این نام در پرونده UID همواره با حروف بزرگ ذخیره میشود.
- NAMES = CASE_INSENSITIVE | CASE_SENSITIVE
- مشخص میکند که آیا نامها باید حساس به حروف بزرگ و کوچک در نظر گرفته شوند یا غیرحساس به حروف بزرگ و کوچک. مقدار پیشفرض حساس به حروف بزرگ و کوچک (case sensitive) است. بند حساسیت به حروف باید نخستین بند در هدر ماژول باشد، و در هر صورت باید بر هر عبارتی که شامل یک نام است تقدم داشته باشد. اگر نامها در یک ماژول UIL حساس به حروف باشند، کلمات کلیدی UIL در آن ماژول باید با حروف کوچک نوشته شوند. هر نام با همان حالتی که در ماژول UIL ظاهر شده در پرونده UIL ذخیره میشود. اگر نامها غیرحساس به حروف باشند، کلمات کلیدی میتوانند با حروف بزرگ، کوچک، یا ترکیبی نوشته شوند، و معادل با حروف بزرگ هر نام در پرونده UID ذخیره میشود.
- CHARACTER_SET = character_set
- مجموعه نویسه (character set) پیشفرض را برای رشتههای متنی صریح در ماژول که به صراحت مجموعه نویسه خود را تعیین نکردهاند مشخص میکند. مجموعه نویسه پیشفرض در صورت نبود این بند، بخش کدبندی متغیر محیطی LANG، یا مقدار XmFALLBACK_CHARSET در صورتی است که LANG تنظیم نشده باشد یا فاقد بخش کدبندی باشد. مقدار XmFALLBACK_CHARSET توسط ارائهدهنده UIL تعریف میشود، اما معمولاً ISO8859-1 (معادل با ISO_LATIN1) است. استفاده از این بند، تمام پردازشهای رشتههای بومیسازیشده را که توسط فلگ کامپایلر -s یا عنصر ساختار داده Uil_command_type با نام use_setlocale_flag فعال شده باشد خاموش میکند.
- OBJECTS = { widget_name = GADGET | WIDGET; }
- مشخص میکند که آیا حالت ویجت (widget) یا گجت (gadget) کنترلی که با widget_name مشخص شده به صورت پیشفرض استفاده شود یا خیر. به صورت پیشفرض حالت ویجت استفاده میشود، بنابراین معمولاً کلمه کلیدی gadget تنها کلمهای است که استفاده میشود. کنترل مشخصشده باید کنترلی باشد که هر دو نسخه ویجت و گجت را داشته باشد: XmCascadeButton، XmLabel، XmPushButton، XmSeparator، و XmToggleButton. حالت بیش از یک کنترل را میتوان با جدا کردن آنها با نقطه-ویرگول (semicolon) مشخص کرد. حالت گجت یا ویجت یک نمونه از کنترل را میتوان با کلمات کلیدی GADGET و WIDGET در اعلان شیء خاص تعیین کرد.
- value_section
- روشی برای نامگذاری یک عبارت مقدار یا یک مقدار صریح فراهم میکند. سپس میتوان به نام مقدار در اعلانهایی که در جای دیگر ماژول UIL رخ میدهند در هر زمینهای که مقدار قابل استفاده باشد ارجاع داد. مقادیر را میتوان به صورت ارجاع به جلو (forward reference) استفاده کرد. بخشهای مقدار بعداً در این صفحه راهنما با جزئیات بیشتر شرح داده شدهاند.
- procedure_section
- روالهای بازخوانی (callback routines) مورد استفاده توسط یک ویجت و روالهای ایجاد را برای ویجتهای تعریفشده توسط کاربر تعریف میکند. این تعاریف برای بررسی خطا استفاده میشوند. بخشهای روال بعداً در این صفحه راهنما با جزئیات بیشتر شرح داده شدهاند.
- list_section
- روشی برای گروهبندی مجموعهای از آرگومانها، کنترلها (فرزندان)، بازخوانیها، یا روالها برای استفادههای بعدی در ماژول UIL فراهم میکند. فهرستها میتوانند شامل فهرستهای دیگر باشند، تا بتوانید یک سلسلهمراتب ایجاد کنید که به روشنی نشان دهد کدام آرگومانها، کنترلها، بازخوانیها، و روالها میان کدام ویجتها مشترک هستند. بخشهای فهرست بعداً در این صفحه راهنما با جزئیات بیشتر شرح داده شدهاند.
- object_section
- اشیا تشکیلدهنده واسط کاربری برنامه را تعریف میکند. شما میتوانید به نام اشیا در اعلانهایی که در جای دیگر ماژول UIL قرار دارند در هر زمینهای که نام شیء قابل استفاده است ارجاع دهید (برای مثال، در یک فهرست کنترلها، به عنوان ارجاع نمادین به شناسه ویجت، یا به عنوان آرگومان tag_value برای یک روال بازخوانی). اشیا میتوانند ارجاع به جلو داشته باشند. بخشهای شیء بعداً در این صفحه راهنما با جزئیات بیشتر شرح داده شدهاند.
- identifier_section
- یک اتصال زمان اجرا (run-time binding) از دادهها به نامهایی که در ماژول UIL ظاهر میشوند تعریف میکند. بخشهای شناسه بعداً در این صفحه راهنما با جزئیات بیشتر شرح داده شدهاند.
پرونده UIL همچنین میتواند حاوی توضیحات درونکد (comments) و دستورالعملهای include باشد که در بخشهای بعدی همراه با عناصر اصلی قالب پرونده UIL شرح داده شدهاند.
توضیحات درونکد (Comments)
توضیحات درونکد میتوانند به یکی از دو شکل زیر باشند:
- •
- توضیح با توالی /* آغاز میشود، با متن توضیح ادامه مییابد و با توالی */ پایان میپذیرد. این شکل از توضیحات میتواند در چندین خط منبع امتداد یابد.
- •
- توضیح با علامت ! (علامت تعجب) آغاز میشود، با متن توضیح ادامه مییابد و با انتهای خط منبع خاتمه مییابد.
هیچیک از دو شکل توضیحات نمیتوانند به صورت تودرتو (nested) قرار گیرند.
بخشهای مقدار (Value sections)
یک بخش مقدار شامل کلیدواژه VALUE و بهدنبال آن دنبالهای از تعریفهای مقدار است. این بخش دارای نحو (سینتکس) زیر است:
VALUE value_name : [ EXPORTED | PRIVATE ] value_expression | IMPORTED value_type ;
که در آن value_expression به value_name انتساب داده میشود یا یک value_type به نام مقدار واردشده (imported) اختصاص مییابد. یک تعریف مقدار راهی برای نامگذاری یک عبارت مقدار یا مقدار صریح (literal) فراهم میکند. به نام مقدار میتوان در تعریفهایی که بعداً در ماژول UIL رخ میدهند، در هر زمینهای که یک مقدار قابل استفاده باشد، ارجاع داد. مقادیر را میتوان بهصورت ارجاع به جلو (forward reference) نیز به کار برد.
- EXPORTED
- مقداری که به عنوان صادره (exported) تعریف میکنید در فایل UID به عنوان یک منبع نامگذاریشده ذخیره میشود و بنابراین میتوان با نام در سایر فایلهای UID به آن ارجاع داد. هنگامی که مقداری را به عنوان صادره تعریف میکنید، MRM در زمان اجرا به خارج از ماژولی که مقدار صادره در آن اعلان شده است مینگرد تا مقدار آن را به دست آورد.
- PRIVATE
- یک مقدار خصوصی (private) مقداری است که وارد یا صادر نشده باشد. مقداری که به عنوان خصوصی تعریف میکنید به عنوان یک منبع مجزا در فایل UID ذخیره نمیشود. شما فقط میتوانید در ماژول UIL حاوی تعریف مقدار، به یک مقدار خصوصی ارجاع دهید. مقدار یا شیء مستقیماً در هر چیزی در ماژول UIL که به تعریف ارجاع میدهد، گنجانده میشود.
- IMPORTED
- مقداری که به عنوان واردشده (imported) تعریف میکنید مقداری است که به عنوان یک منبع نامگذاریشده در یک فایل UID تعریف شده باشد. MRM این تعریف را با تعریف صادره متناظر در زمان اجرای برنامه حلوفصل و تطبیق میدهد.
بهطور پیشفرض، مقادیر و اشیاء خصوصی هستند. در ادامه فهرستی از انواع مقادیر پشتیبانیشده در UIL آمده است:
- •
- ANY
- •
- ARGUMENT
- •
- BOOLEAN
- •
- COLOR
- •
- COLOR_TABLE
- •
- COMPOUND_STRING
- •
- FLOAT
- •
- FONT
- •
- FONT_TABLE
- •
- FONTSET
- •
- ICON
- •
- INTEGER
- •
- INTEGER_TABLE
- •
- KEYSYM
- •
- REASON
- •
- SINGLE_FLOAT
- •
- STRING
- •
- STRING_TABLE
- •
- TRANSLATION_TABLE
- •
- WIDE_CHARACTER
- •
- WIDGET
بخشهای رویه (Procedure sections)
یک بخش رویه شامل کلیدواژه PROCEDURE و بهدنبال آن دنبالهای از تعریفهای رویه است. این بخش دارای نحو (سینتکس) زیر است:
PROCEDURE
procedure_name [ ( [ value_type ]) ];
از یک تعریف رویه برای اعلان موارد زیر استفاده کنید:
- •
- روالی که میتواند به عنوان یک روال بازخوانی (callback routine) برای یک ویجت استفاده شود
- •
- تابع ایجاد برای یک ویجت تعریفشده توسط کاربر
میتوانید به نام یک رویه در تعریفهایی که بعداً در ماژول UIL رخ میدهند در هر زمینهای که یک رویه قابل استفاده باشد ارجاع دهید. رویهها را میتوان بهصورت ارجاع به جلو (forward reference) نیز به کار برد. نمیتوانید از نامی که در زمینه دیگری استفاده کردهاید به عنوان نام رویه استفاده کنید.
در یک تعریف رویه، این امکان اختیاری را دارید که مشخص کنید یک پارامتر در زمان اجرا به روال بازخوانی متناظر ارسال خواهد شد. این پارامتر تگ بازخوانی (callback tag) نامیده میشود. میتوانید نوع داده تگ بازخوانی را با قرار دادن نوع داده در پرانتز بهدنبال نام رویه مشخص کنید. هنگامی که ماژول را کامپایل میکنید، کامپایلر UIL بررسی میکند که آرگومان مشخصشده در ارجاعها به رویه، از همین نوع باشد. توجه داشته باشید که نوع داده تگ بازخوانی باید یکی از انواع داده معتبر UIL باشد. میتوانید از یک ویجت به عنوان تگ بازخوانی استفاده کنید، تا زمانی که ویجت در همان سلسلهمراتب ویجت بازخوانی تعریف شده باشد؛ یعنی دارای یک جد مشترک باشند که در همان سلسلهمراتب UIL قرار دارد.
فهرست زیر چگونگی بررسی نوع آرگومان و تعداد آرگومان توسط کامپایلر UIL را بسته به تعریف رویه خلاصه میکند.
- بدون پارامتر
- هیچ بررسی نوع آرگومان یا تعداد آرگومانی انجام نمیشود. میتوانید در ارجاع به رویه 0 یا یک آرگومان ارائه دهید.
- ( )
- بررسی میکند که تعداد آرگومانها 0 (صفر) باشد.
- (ANY)
- بررسی میکند که تعداد آرگومانها 1 باشد. نوع آرگومان را بررسی نمیکند. برای جلوگیری از بررسی نوع روی تگهای رویه، از نوع ANY استفاده کنید.
- (type)
- یک آرگومان از نوع مشخصشده را بررسی میکند.
- (class_name)
- یک آرگومان ویجت از کلاس ویجت مشخصشده را بررسی میکند.
اگرچه استفاده از هر نوع داده UIL برای مشخص کردن نوع یک تگ در تعریف رویه امکانپذیر است، اما باید بتوانید آن نوع داده را در زبان برنامهنویسی مورد استفاده خود بازنمایی کنید. برخی از انواع داده (مانند integer، Boolean و string) انواع داده رایجی هستند که توسط اکثر زبانهای برنامهنویسی شناخته میشوند. سایر انواع داده UIL (مانند جداول رشته) پیچیدهتر هستند و ممکن است نیازمند این باشند که ساختار داده متناظر مناسبی را در برنامه برپا کنید تا بتوانید تگی از آن نوع را به یک روال بازخوانی ارسال کنید.
همچنین میتوانید از تعریف رویه برای مشخص کردن تابع ایجاد یک ویجت تعریفشده توسط کاربر استفاده کنید. در این حالت، هیچ پارامتر رسمی مشخص نمیکنید. رویه با سه آرگومان استاندارد که به تمام توابع ایجاد ویجت ارسال میشوند، فراخوانی میشود. (برای اطلاعات بیشتر درباره توابع ایجاد ویجت، به مستندات Motif Toolkit مراجعه کنید.)
بخشهای فهرست (List sections)
یک بخش فهرست شامل کلیدواژه LIST و به دنبال آن دنبالهای از اعلانهای فهرست است. نحو آن به شرح زیر است:
LIST
list_name: { list_item; [...] }
[...]
همچنین میتوانید از بخشهای فهرست برای گروهبندی مجموعهای از آرگومانها، کنترلها (فرزندان)، فراخوانیهای بازگشتی (callbacks) یا رویهها برای استفادههای بعدی در ماژول UIL بهره ببرید. فهرستها میتوانند شامل فهرستهای دیگری نیز باشند، به طوری که میتوانید ساختاری سلسلهمراتبی ایجاد کنید تا مشخص شود کدام آرگومانها، کنترلها، فراخوانیهای بازگشتی و رویهها بین کدام ویجتها مشترک هستند. شما نمیتوانید انواع مختلف فهرستها را با یکدیگر ترکیب کنید؛ یک فهرست با نوعی خاص نمیتواند شامل ورودیهایی از نوع فهرست دیگر باشد یا به نام یک نوع فهرست متفاوت ارجاع دهد. نام فهرست همواره برای همان ماژول UIL که در آن اعلان شده خصوصی (private) است و نمیتواند به عنوان یک منبع نامگذاریشده در فایل UID ذخیره شود.
انواع دیگر فهرستها در بخشهای زیر شرح داده شدهاند.
ساختار فهرست آرگومانها (Arguments List Structure)
فهرست آرگومانها مشخص میکند که هنگام فراخوانی روتین ایجاد برای یک شیء خاص در زمان اجرا، چه آرگومانهایی باید در پارامتر فهرست آرگومانها تعیین شوند. همچنین یک فهرست آرگومان، مقادیر این آرگومانها را مشخص میسازد. فهرستهای آرگومان دارای نحو زیر هستند:
LIST
list_name: ARGUMENTS {
argument_name = value_expression;
[...] }
[...]
نام آرگومان باید یک نام آرگومان توکار (built-in) یا یک نام آرگومان تعریفشده توسط کاربر باشد که با تابع ARGUMENT مشخص شده است.
اگر از یک نام آرگومان توکار به عنوان ورودی فهرست آرگومانها در تعریف شیء استفاده کنید، کامپایلر UIL نام آرگومان را بررسی میکند تا مطمئن شود نوع شیئی که تعریف میکنید از آن پشتیبانی میکند. اگر یک نام آرگومان بیش از یک بار در یک فهرست آرگومان مشخص ظاهر شود، آخرین ورودی که از آن نام آرگومان استفاده میکند جایگزین تمام ورودیهای قبلی با همان نام میشود و کامپایلر یک پیام هشدار صادر میکند.
برخی از آرگومانها، مانند XmNitems و XmNitemCount، توسط کامپایلر UIL با یکدیگر جفت (coupled) شدهاند. هنگامی که یکی از این آرگومانها را مشخص میکنید، کامپایلر آرگومان دیگر را نیز به طور خودکار تنظیم میکند. آرگومان جفتشده در دسترس مستقیم شما نخواهد بود.
جعبهابزار Motif و جعبهابزار X (بخش intrinsics) از آرگومانهای قید (constraint arguments) پشتیبانی میکنند. یک آرگومان قید، آرگومانی است فراتر از آرگومانهای معمولیِ در دسترس، که به فرزندان یک شیء ارسال میشود. برای نمونه، ویجت Form مجموعهای از آرگومانهای قید را به فرزندان خود اختصاص میدهد. این آرگومانها موقعیت قرارگیری فرزندان را درون Form کنترل میکنند.
برخلاف آرگومانهایی که برای تعریف ویژگیهای یک ویجت خاص استفاده میشوند، آرگومانهای قید منحصراً برای تعریف ویژگیهای اضافی فرزندان یک ویجت مشخص به کار میروند. این ویژگیها بر رفتار فرزندان درون والد خود تأثیر میگذارند. برای ارائه آرگومانهای قید به فرزندان، این آرگومانها را در فهرست آرگومانهای فرزند قرار میدهید.
برای کسب اطلاعات درباره اینکه کدام آرگومانها توسط کدام ویجتها پشتیبانی میشوند، به پیوست B (Appendix B) مراجعه کنید. برای آگاهی از نوع مقدار معتبر برای هر آرگومان توکار، به پیوست C (Appendix C) مراجعه نمایید.
ساختار فهرست فراخوانیهای بازگشتی (Callbacks List Structure)
از فهرست فراخوانیهای بازگشتی (callbacks list) برای تعیین این که چه دلایل فراخوانی (callback reasons) در زمان اجرا توسط یک ویجت خاص پردازش شوند، استفاده کنید. فهرستهای فراخوانی بازگشتی نحو زیر را دارند:
LIST list_name : CALLBACKS { reason_name = PROCEDURE procedure_name [ ( [ value_expression ] ) ]; | reason_name = procedure_list ; [...] } [...]
برای ویجتهای جعبهابزار Motif، نام دلیل باید یک نام دلیل توکار (built-in) باشد. برای یک ویجت تعریفشده توسط کاربر، میتوانید از نام دلیلی استفاده کنید که پیشتر با استفاده از تابع REASON مشخص کردهاید. اگر در تعریف یک شیء از دلیل توکار استفاده کنید، کامپایلر UIL اطمینان حاصل میکند که آن دلیل توسط نوع شیئی که تعریف میکنید پشتیبانی میشود. پیوست B نشان میدهد هر شیء از چه دلایلی پشتیبانی میکند.
اگر همان دلیل بیش از یک بار در فهرست فراخوانیهای بازگشتی ظاهر شود، آخرین ورودی ارجاعدهنده به آن نام، جایگزین تمام ورودیهای قبلی با همان دلیل شده و کامپایلر UIL یک پیام تشخیصی صادر میکند.
اگر مقداری نامگذاریشده برای آرگومان رویه (برچسب فراخوانی بازگشتی / callback tag) تعیین کنید، نوع داده مقدار باید با نوع مشخصشده برای برچسب فراخوانی بازگشتی در اعلان رویه متناظر مطابقت داشته باشد. هنگام تعیین نام ویجت به عنوان عبارت مقدار رویه، باید نوع ویجت و یک فاصله را پیش از نام ویجت نیز مشخص کنید.
از آنجا که کامپایلر UIL به جای یک ماژول شیء (.o) یک فایل UID تولید میکند، پیوند دادن نام UIL به آدرس نقطه ورود (entry point) رویه توسط بارگذار (loader) انجام نمیشود، بلکه در زمان اجرا از طریق تابع MRM با نام MrmRegisterNames برقرار میگردد. شما این تابع را پیش از واکشی هر شیء فراخوانی کرده و هم نامهای UIL و هم آدرسهای رویه هر فراخوانی بازگشتی را به آن میدهید. نامی که در برنامه کاربردی با MRM ثبت میکنید باید با نامی که برای رویه در ماژول UIL مشخص کردهاید دقیقاً مطابقت داشته باشد.
هر رویه فراخوانی بازگشتی سه آرگومان دریافت میکند. دو آرگومان نخست برای هر فراخوانی بازگشتی شکل یکسانی دارند. شکل آرگومان سوم از شیئی به شیء دیگر متفاوت است.
آرگومان اول، آدرس ساختار دادهای است که توسط جعبهابزار Motif برای نمونه این شیء نگهداری میشود. این آدرس شناسه ویجت (widget ID) برای این شیء نامیده میشود.
آرگومان دوم، آدرس مقداری است که در فهرست فراخوانیهای بازگشتی برای این رویه مشخص کردهاید. اگر آرگومانی تعیین نکنید، این آدرس NULL خواهد بود. توجه داشته باشید در حالتی که مقدار مشخصشده یک رشته یا XmString باشد، مقدار تعیینشده در فهرست فراخوانیهای بازگشتی خود نمایانگر یک آدرس است نه یک مقدار واقعی. برای نمونه در مورد یک رشته ساده، مقدارْ آدرس اولین کاراکتر آن رشته است. در این حالتها، UIL یک سطح ارجاع غیرمستقیم (indirection) اضافه نمیکند و آرگومان دوم برای رویه فراخوانی بازگشتی صرفاً همان مقدار مشخصشده در فهرست فراخوانیهای بازگشتی خواهد بود.
آرگومان سوم، نام دلیلی است که در فهرست فراخوانیهای بازگشتی مشخص کردهاید.
ساختار فهرست کنترلها (Controls List Structure)
یک فهرست کنترلها مشخص میکند چه اشیائی فرزند یک شیء خاص هستند یا توسط آن کنترل میشوند. هر ورودی در فهرست کنترلها دارای نحو زیر است:
LIST
list_name: CONTROLS {
[child_name: ] [MANAGED | UNMANAGED] object_definition;
[...] }
[...]
اگر کلیدواژه MANAGED را مشخص کنید، در زمان اجرا شیء ایجاد و مدیریت (managed) میشود؛ اگر UNMANAGED را مشخص نمایید، در زمان اجرا شیء تنها ایجاد میگردد. اشیاء به طور پیشفرض مدیریت میشوند.
میتوانید از child_name برای مشخص کردن منابع مربوط به فرزندانِ بهطور خودکار ایجادشده یک کنترل خاص استفاده کنید. نامهای فرزندانِ خودکار ایجادشده با افزودن Xm_ به ابتدای نام ویجت فرزند تشکیل میشوند. این نام در مستندات ویجت والد مشخص شده است.
برخلاف فهرست آرگومانها و فهرست فراخوانیهای بازگشتی، ورودی فهرست کنترلها که همسان با ورودی قبلی باشد جایگزین ورودی قبلی نمیشود. در زمان اجرا، هر ورودی فهرست کنترلها هنگام ایجاد والد باعث ایجاد یک فرزند میشود. اگر از تعریف شیء یکسانی برای چند فرزند استفاده شود، در زمان اجرا چندین نمونه از آن فرزند ایجاد میگردد. برای مشاهده فهرستی از این که کدام انواع ویجت میتوانند توسط کدام انواع دیگر کنترل شوند، به پیوست B (Appendix B) مراجعه کنید.
ساختار فهرست رویهها (Procedures List Structure)
میتوانید با تعریف یک فهرست رویهها در UIL، چندین رویه را برای یک دلیل فراخوانی بازگشتی مشخص کنید. همانند سایر انواع فهرست، فهرستهای رویهها را میتوان به صورت درونخطی (in-line) یا درون یک بخش فهرست تعریف کرد و با نام به آنها ارجاع داد.
اگر دلیلی را بیش از یک بار تعریف کنید (به عنوان مثال، زمانی که دلیل هم در یک فهرست رویه ارجاعشده و هم در فهرست فراخوانیهای بازگشتی شیء تعریف شده باشد)، تعریفهای قبلی با آخرین تعریف بازنویسی میشوند. نحو فهرست رویهها به شرح زیر است:
LIST
list_name: PROCEDURES {
procedure_name [ ( [ value_expression ]) ];
[...] }
[...]
هنگام تعیین نام ویجت به عنوان عبارت مقدار رویه، باید نوع ویجت و یک فاصله را پیش از نام ویجت نیز مشخص نمایید.
بخشهای شیء (Object Sections)
یک بخش شیء شامل کلیدواژه OBJECT بههمراه دنبالهای از اعلانهای شیء است. نحو آن به شرح زیر است:
OBJECT object_name:
[ EXPORTED | PRIVATE | IMPORTED ] object_type
[ PROCEDURE creation_function ]
[ object_name [ WIDGET | GADGET ] | {list_definitions } ]
از اعلان شیء برای تعریف اشیایی که قرار است در فایل UID ذخیره شوند استفاده کنید. میتوانید در هر زمینهای از ماژول UIL که استفاده از نام شیء در آن مجاز است (برای مثال، در فهرست کنترلها، بهصورت یک ارجاع نمادین به شناسه ویجت، یا بهعنوان آرگومان tag_value برای یک روتین فراخوانی برگشتی)، به نام شیء در اعلانهایی که در جای دیگر ماژول رخ دادهاند ارجاع دهید. اشیاء را میتوان بهصورت رو به جلو ارجاع داد؛ یعنی میتوانید نام یک شیء را پس از ارجاع به آن اعلان کنید. تمام ارجاعات به نام یک شیء باید با نوع آن شیء که در اعلان شیء مشخص شده است سازگار باشند. میتوانید یک شیء را بهصورت EXPORTED ،IMPORTED یا PRIVATE مشخص کنید.
تعریف شیء میتواند شامل دنبالهای از فهرستها باشد که آرگومانها، سلسلهمراتب و فراخوانیهای برگشتی (callbacks) را برای ویجت تعریف میکنند. برای یک شیء فقط میتوانید یک فهرست از هر نوع مشخص کنید. هنگامی که یک ویجت تعریفشده توسط کاربر را اعلان میکنید، باید ارجاعی به تابع ایجاد ویجت برای آن ویجت تعریفشده بگنجانید.
نکته: چندین ویجت در جعبهابزار Motif در عمل از دو ویجت پیوندخورده تشکیل شدهاند. برای مثال، XmScrolledText و XmScrolledList هر یک از ویجتهای فرزند XmText و XmList در زیر یک ویجت XmScrolledWindow تشکیل شدهاند. هنگامی که چنین ویجتی ایجاد میشود، منابع آن در دسترس هر دو ویجت زیرین قرار میگیرد. این مسئله گهگاه میتواند مشکلاتی ایجاد کند، مانند زمانی که برنامهنویس میخواهد یک روتین XmNdestroyCallback تعیین کند تا هنگام تخریب ویجت اجرا شود. در این حالت، منبع callback در دسترس هر دو زیرویجت خواهد بود و هنگام تخریب ویجت، موجب بروز خطا میشود. برای جلوگیری از این مشکلات، برنامهنویس باید ویجتهای والد و فرزند را بهصورت جداگانه ایجاد کند، بهجای اینکه به این ویجتهای پیوندخورده متکی باشد.
از کلیدواژه GADGET یا WIDGET برای تعیین نوع شیء یا بازنویسی گونه پیشفرض برای این نوع شیء استفاده کنید. میتوانید از نام نوع شیء در جعبهابزار Motif که دارای گونه گجت است (برای مثال، XmLabelGadget) بهعنوان یک مشخصه در اعلان شیء استفاده کنید. مقدار object_type میتواند هر نوع شیئی باشد، از جمله گجتها. فقط در اعلان یک شیء نیاز به تعیین کلیدواژه GADGET یا WIDGET دارید، نه زمانی که به آن شیء ارجاع میدهید. شما نمیتوانید کلیدواژه GADGET یا WIDGET را برای یک شیء تعریفشده توسط کاربر مشخص کنید؛ اشیاء تعریفشده توسط کاربر همواره ویجت هستند.
بخشهای شناسه (Identifier sections)
بخش شناسه به شما امکان میدهد یک شناسه (identifier) تعریف کنید؛ سازوکاری که پیوند زمان اجرا (run-time binding) بین دادهها و نامهای موجود در یک ماژول UIL را محقق میسازد. بخش شناسه شامل کلیدواژه رزروشده IDENTIFIER است که بهدنبال آن فهرستی از نامها میآید و پس از هر نام یک نقطهویرگول قرار میگیرد.
IDENTIFIER identifier_name; [...;]
بعداً میتوانید از این نامها در ماژول UIL بهعنوان مقدار یک آرگومان برای یک ویجت یا مقدار تگ برای یک روتین callback استفاده کنید. در زمان اجرا، از توابع MRM شامل MrmRegisterNames و MrmRegisterNamesInHierarchy برای پیوند دادن نام شناسه با دادهها (یا در مورد callbackها، با نشانی دادهها) مرتبط با شناسه استفاده میکنید.
هر ماژول UIL دارای یک فضای نام واحد است؛ بنابراین، نمیتوانید نامی را که برای یک مقدار، شیء یا روتین (procedure) استفاده کردهاید، بهعنوان نام شناسه در همان ماژول به کار ببرید.
کامپایلر UIL هیچگونه بررسی نوعی (type checking) روی استفاده از شناسهها در یک ماژول UIL انجام نمیدهد. بر خلاف مقدار UIL، یک شناسه هیچ نوع UIL مرتبطی ندارد. صرفنظر از اینکه یک آرگومان ویجت یا تگ روتین فراخوانی برگشتی با چه نوع خاصی تعریف شده باشد، میتوانید در آن زمینه بهجای مقداری از نوع متناظر، از یک شناسه استفاده کنید.
برای ارجاع به این نامهای شناسه در یک ماژول UIL، از نام شناسه در هر کجایی که میخواهید مقدار آن استفاده شود استفاده میکنید.
دستورالعملهای گنجاندن (Include directives)
دستورالعمل include محتویات یک فایل مشخصشده را در یک ماژول UIL ادغام میکند. این سازوکار به چندین ماژول UIL امکان میدهد تعاریف مشترک را به اشتراک بگذارند. نحو دستورالعمل include به شرح زیر است:
INCLUDE FILE file_name;
کامپایلر UIL دستورالعمل include را با محتویات فایل include جایگزین میکند و آن را بهگونهای پردازش میکند که گویی این محتویات در فایل منبع UIL فعلی ظاهر شدهاند.
میتوانید فایلهای include را بهصورت تو در تو استفاده کنید؛ یعنی یک فایل include میتواند حاوی دستورالعملهای include باشد. کامپایلر UIL میتواند تا ۱۰۰ ارجاع (شامل فایلی که ماژول UIL را در بر دارد) را پردازش کند. بنابراین، میتوانید تا ۹۹ فایل را در یک ماژول UIL منفرد، شامل فایلهای تو در تو، بگنجانید. هر بار باز شدن یک فایل یک ارجاع محسوب میشود، بنابراین گنجاندن یک فایل یکسان برای دو بار، دو ارجاع به شمار میآید.
مقدار file_name یک رشته ساده شامل مشخصات فایلی است که فایل مورد نظر را برای گنجانده شدن مشخص میکند. قواعد یافتن فایل مشخصشده مشابه قواعد یافتن فایلهای سرایند (header) یا .h با استفاده از دستورالعمل #include بههمراه رشته نقلقولشده در زبان C است. زبان UIL از گزینه -I برای تعیین دایرکتوری جستجوی فایلهای include استفاده میکند.
- •
- اگر دایرکتوری را مشخص نکنید، کامپایلر UIL فایل include را در دایرکتوری فایل منبع اصلی جستجو میکند.
- •
- اگر کامپایلر فایل include را در آنجا پیدا نکند، کامپایلر در همان دایرکتوری فایل منبع جستجو میکند.
- •
- اگر دایرکتوری را مشخص کنید، کامپایلر UIL فقط همان دایرکتوری را برای فایل جستجو میکند.
نامها و رشتهها (Names and Strings)
نامها میتوانند از هر یک از نویسههای A تا Z، a تا z، 0 تا 9، $ (علامت دلار) و _ (زیرخط) تشکیل شوند. نامها نمیتوانند با یک رقم (0 تا 9) آغاز شوند. بیشینه طول یک نام 31 نویسه است.
زبان UIL از طریق یک بند در سرآیند MODULE امکان انتخاب بین نامهای حساس به بزرگی و کوچکی حروف یا غیرحساس به آن را فراهم میکند. برای نمونه، اگر نامها به بزرگی و کوچکی حروف حساس باشند، نامهای «sample» و «Sample» از یکدیگر متمایز هستند. اگر نامها حساس به بزرگی و کوچکی حروف نباشند، این نامها یکسان در نظر گرفته میشوند و میتوانند به جای یکدیگر استفاده شوند. به طور پیشفرض، UIL فرض میکند نامها به بزرگی و کوچکی حروف حساس هستند.
در حالت CASE-INSENSITIVE، کامپایلر تمامی نامها را در فایل UID به شکل حروف بزرگ خروجی میدهد. در حالت CASE-SENSITIVE، نامها در فایل UIL دقیقاً همانگونه که در مبدأ آمدهاند نمایش داده میشوند.
جدول زیر کلیدواژههای رزروشده را فهرست میکند که برای تعریف نامهای تعریفشده توسط برنامهنویس در دسترس نیستند.
| کلیدواژههای | |||
| ARGUMENTS | CALLBACKS | CONTROLS | END |
| EXPORTED | FALSE | GADGET | IDENTIFIER |
| INCLUDE | LIST | MODULE | OFF |
| ON | OBJECT | PRIVATE | PROCEDURE |
| PROCEDURES | TRUE | VALUE | WIDGET |
کلیدواژههای غیررزروشدهی UIL در فهرست و جدول زیر شرح داده شدهاند. این کلیدواژهها میتوانند به عنوان نامهای تعریفشده توسط برنامهنویس استفاده شوند؛ با این حال، اگر از هر کلیدواژهای به عنوان یک نام استفاده کنید، دیگر نمیتوانید از کاربرد ارائهشده توسط UIL برای آن کلیدواژه استفاده کنید.
- •
- نامهای آرگومان داخلی (برای نمونه، XmNx، XmNheight)
- •
- نامهای علت (reason) داخلی (برای نمونه، XmNactivateCallback، XmNhelpCallback)
- •
- نامهای مجموعه نویسه (برای نمونه، ISO_LATIN1، ISO_HEBREW_LR)
- •
- نامهای مقادیر ثابت (برای نمونه، XmMENU_OPTION، XmBROWSE_SELECT)
- •
- انواع شیء
(برای
نمونه،
XmPushButton، XmBulletinBoard)
کلیدواژههای ANY ARGUMENT ASCIZ_STRING_TABLE ASCIZ_TABLE BACKGROUND BOOLEAN CASE_INSENSITIVE CASE_SENSITIVE CHARACTER_SET COLOR COLOR_TABLE COMPOUND_STRING COMPOUND_STRING_COMPONENT COMPOUND_STRING_TABLE FILE FLOAT FONT FONT_TABLE FONTSET FOREGROUND ICON IMPORTED INTEGER INTEGER_TABLE KEYSYM MANAGED NAMES OBJECTS REASON RGB RIGHT_TO_LEFT SINGLE_FLOAT STRING STRING_TABLE TRANSLATION_TABLE UNMANAGED USER_DEFINED VERSION WIDE_CHARACTER WIDGET XBITMAPFILE
رشتههای لیترال (تحتاللفظی) میتوانند از حروف کوچک و بزرگ، ارقام و نویسههای نشانهگذاری تشکیل شوند. فاصلهها، تبها و کامنتها عناصر ویژهای در این زبان هستند. آنها ابزاری برای جداسازی سایر عناصر، مانند دو نام، میباشند. یک یا چند مورد از این عناصر میتوانند قبل یا بعد از هر عنصر دیگری در زبان ظاهر شوند. با این حال، فاصلهها، تبها و کامنتهایی که درون رشتههای لیترال قرار میگیرند به عنوان دنبالهای از نویسهها در نظر گرفته میشوند نه به عنوان جداکننده.
انواع داده (Data Types)
زبان UIL برای چندین مورد از انواع مقادیری که پشتیبانی میکند، لیترال ارائه میدهد. برخی از انواع مقادیر به صورت لیترال پشتیبانی نمیشوند (برای نمونه، پیکسمپها و جدولهای رشته). میتوانید مقادیر این نوعها را با استفاده از توابع شرح دادهشده در بخش توابع (Functions) تعیین کنید. زبان UIL به طور مستقیم از انواع لیترال زیر پشتیبانی میکند:
- •
- لیترال رشتهای (String literal)
- •
- لیترال عدد صحیح (Integer literal)
- •
- لیترال بولی (Boolean literal)
- •
- لیترال ممیز شناور (Floating-point literal)
زبان UIL همچنین شامل نوع دادهی ANY است که برای غیرفعال کردن بررسی انواع داده در زمان کامپایل استفاده میشود.
رشتههای لفظی (String Literals)
یک رشتهی لفظی دنبالهای از صفر یا چند نویسهی 8 بیتی یا 16 بیتی یا ترکیبی از آنهاست که با ' (علامتهای نقلقول تکی) یا " (علامتهای نقلقول جفتی) احاطه شدهاند. رشتههای لفظی همچنین میتوانند حاوی نویسههای چندبایتی احاطهشده با علامتهای نقلقول جفتی باشند. طول رشتههای لفظی نمیتواند بیش از 2000 نویسه باشد.
یک رشتهی لفظی تکگیومهای (با علامت نقلقول تکی) میتواند در چند خط مبدأ امتداد یابد. برای ادامهی یک رشتهی لفظی تکگیومهای، خط ادامهیافته را با یک \ (بکاسلش) پایان دهید. رشته با نخستین نویسه در خط بعدی ادامه مییابد.
رشتههای لفظی دوگیومهای (با علامت نقلقول جفتی) نمیتوانند در چند خط مبدأ امتداد یابند. (از آنجا که رشتههای دوگیومهای میتوانند حاوی توالیهای گریز و دیگر نویسههای خاص باشند، نمیتوانید از نویسهی بکاسلش برای مشخص کردن ادامهی رشته استفاده کنید.) برای ساخت مقداری رشتهای که باید در چند خط مبدأ امتداد یابد، از عملگر الحاق که در ادامهی این بخش شرح داده شده است استفاده کنید.
نحو (syntax) یک رشتهی لفظی یکی از موارد زیر است:
'[character_string]' [#char_set]"[character_string]"
هر دو شکل رشته، یک مجموعه نویسه را با یک مقدار رشتهای مرتبط میسازند. زبان UIL از قواعد زیر برای تعیین مجموعه نویسه و قالب ذخیرهسازی رشتههای لفظی استفاده میکند:
- •
- رشتهای که به صورت 'string' اعلان شود، معادل با #cur_charset"string" است؛ جایی که cur_charset بخش مجموعه کد (codeset) از مقدار متغیر محیطی LANG (در صورت تنظیم بودن) یا مقدار XmFALLBACK_CHARSET خواهد بود (اگر LANG تنظیم نشده باشد یا فاقد مؤلفهی مجموعه کد باشد). به طور پیشفرض، XmFALLBACK_CHARSET برابر با ISO8859-1 (معادل با ISO_LATIN1) است، اما ممکن است توزیعکنندگان پیشفرض دیگری تعریف کرده باشند.
- •
- رشتهای که به صورت "string" اعلان شود، معادل با #char_set"string" خواهد بود اگر char_set را به عنوان مجموعه نویسهی پیشفرض ماژول مشخص کرده باشید. اگر هیچ مجموعه نویسهی پیشفرضی برای ماژول مشخص نشده باشد، آنگاه اگر گزینهی -s به دستور uil داده شود یا use_setlocale_flag برای کامپایلر قابل فراخوانی، Uil()، تنظیم شده باشد، رشته به عنوان رشتهای در لوکال جاری تفسیر خواهد شد. این بدان معناست که رشته با فراخوانی setlocale در لوکال کاربر تجزیه میشود، مجموعه نویسهی آن XmFONTLIST_DEFAULT_TAG است، و اگر رشته به یک رشتهی مرکب تبدیل شود، به عنوان یک بخش متنی با کدگذاری لوکال ذخیره میگردد. در غیر این صورت، "string" معادل با #cur_charset"string" است که در آن cur_charset همانگونه که برای رشتههای تکگیومهای شرح داده شد تفسیر میشود.
- •
- رشتهای به فرم "string" یا #char_set"string" به عنوان یک رشتهی پایانیافته با تهی (null-terminated) ذخیره میشود.
اگر char_set در رشتهای با فرم بالا، یک مجموعه نویسهی داخلی یا تعریفشده توسط کاربر نباشد، مجموعه نویسهی رشته بر روی XmFONTLIST_DEFAULT_TAG تنظیم خواهد شد و یک پیام اطلاعرسانی به کاربر صادر میشود تا اعلام کند این جایگزینی انجام شده است.
جدول زیر مجموعههای نویسهی پشتیبانیشده توسط کامپایلر UIL را برای رشتههای لفظی فهرست میکند. توجه داشته باشید که چندین نام UIL به یک مجموعه نویسهی یکسان نگاشت میشوند. در برخی موارد، نام UIL بر نحوهی خواندن رشتههای لفظی تأثیر میگذارد. برای نمونه، رشتههایی که با نام مجموعه نویسهی UIL مختوم به _LR مشخص میشوند، به صورت چپبهراست خوانده میشوند. نامهایی که به اعداد متفاوتی ختم میشوند نمایانگر قلمهای متفاوتی هستند (برای نمونه، ISO_LATIN1 یا ISO_LATIN6). تمامی مجموعههای نویسه در این جدول با 8 بیت نمایش داده میشوند.
| مجموعههای نویسهی پشتیبانیشده (Supported Character Sets) | |
| نام UIL (UIL Name) | توضیحات (Description) |
| ISO_LATIN1 | GL: ASCII، GR: مکمل Latin-1 (Latin-1 Supplement) |
| ISO_LATIN2 | GL: ASCII، GR: مکمل Latin-2 (Latin-2 Supplement) |
| ISO_ARABIC | GL: ASCII، GR: مکمل Latin-Arabic (Latin-Arabic Supplement) |
| ISO_LATIN6 | GL: ASCII، GR: مکمل Latin-Arabic (Latin-Arabic Supplement) |
| ISO_GREEK | GL: ASCII، GR: مکمل Latin-Greek (Latin-Greek Supplement) |
| ISO_LATIN7 | GL: ASCII، GR: مکمل Latin-Greek (Latin-Greek Supplement) |
| ISO_HEBREW | GL: ASCII، GR: مکمل Latin-Hebrew (Latin-Hebrew Supplement) |
| ISO_LATIN8 | GL: ASCII، GR: مکمل Latin-Hebrew (Latin-Hebrew Supplement) |
| ISO_HEBREW_LR | GL: ASCII، GR: مکمل Latin-Hebrew (Latin-Hebrew Supplement) |
| ISO_LATIN8_LR | GL: ASCII، GR: مکمل Latin-Hebrew (Latin-Hebrew Supplement) |
| JIS_KATAKANA | GL: JIS Roman، GR: کاتاکانا (JIS Katakana) |
در ادامه، قواعد تجزیه برای هر یک از مجموعههای نویسه آمده است:
- تمامی مجموعههای نویسه (All character sets)
- کدهای نویسه در محدودهی 00...1F، 7F و 80...9F نویسههای کنترلی هستند، شامل هر دو بایتِ نویسههای 16 بیتی. کامپایلر این موارد را به عنوان نویسههای غیرمجاز علامتگذاری میکند.
- ISO_LATIN1 ISO_LATIN2 ISO_LATIN3 ISO_GREEK ISO_LATIN4
- این مجموعهها از چپ به راست تجزیه میشوند. توالیهای گریز برای رشتههای پایانیافته با تهی نیز توسط این مجموعههای نویسه پشتیبانی میشوند.
- ISO_HEBREW ISO_ARABIC ISO_LATIN8
- این مجموعهها از راست به چپ تجزیه میشوند. برای نمونه، رشتهی #ISO_HEBREW"012345" یک رشتهی اولیه به صورت "543210" با مجموعه نویسهی ISO_HEBREW تولید خواهد کرد. جهت رشته برای چنین رشتهای راستبهچپ خواهد بود، بنابراین هنگام رندر شدن، رشته به صورت "012345." نمایان خواهد شد. توالیهای گریز برای رشتههای پایانیافته با تهی نیز توسط این مجموعههای نویسه پشتیبانی میشوند، و نویسههایی که توالیهای گریز را میسازند به ترتیب چپبهراست هستند. برای نمونه، شما باید \n را وارد کنید، نه n\ را.
- ISO_HEBREW_LR ISO_ARABIC_LR ISO_LATIN8_LR
- این مجموعهها از چپ به راست تجزیه میشوند. برای نمونه، رشتهی #ISO_HEBREW_LR"012345" یک رشتهی اولیه به صورت "012345" با مجموعه نویسهی ISO_HEBREW تولید میکند. با این حال، جهت رشته برای چنین رشتهای همچنان راستبهچپ خواهد بود، بنابراین هنگام رندر شدن، به صورت "543210." نمایان میشود. به بیان دیگر، نویسهها در اصل به همان ترتیبی تایپ شدهاند که در عبری تایپ میشدند (اگرچه در عبری، تایپیست از ویرایشگر متنی استفاده میکرد که از راست به چپ حرکت میکرد). توالیهای گریز برای رشتههای پایانیافته با تهی نیز توسط این مجموعههای نویسه پشتیبانی میشوند.
- JIS_KATAKANA
- این مجموعه از چپ به راست تجزیه میشود. توالیهای گریز برای رشتههای پایانیافته با تهی نیز توسط این مجموعه نویسه پشتیبانی میشوند. توجه داشته باشید که ممکن است \ (بکاسلش) به صورت نماد ین نمایش داده شود.
علاوه بر تعیین قواعد تجزیه برای رشتهها، اطلاعات مجموعه نویسه به عنوان یک ویژگی از رشتهی مرکب باقی میماند. اگر رشته درون رشتهای متشکل از چندین بخش الحاقشده گنجانده شود، اطلاعات مجموعه نویسه همراه با همان بخش رشته گنجانده میشود. این امر اطلاعات مورد نیاز را در اختیار جعبهابزار موتیف (Motif Toolkit) قرار میدهد تا رشتهی مرکب را رمزگشایی کرده و قلم (font) مناسب را برای نمایش رشته انتخاب کند.
برای رابط کاربری برنامهای که تنها به زبان انگلیسی نمایش داده میشود، زبان UIL به شما امکان میدهد تمایز میان این دو کاربرد رشتهها را نادیده بگیرید. کامپایلر بر اساس بافت تشخیص میدهد که چه زمانی یک رشته باید به عنوان یک رشتهی پایانیافته با تهی یا به عنوان یک رشتهی مرکب ارسال شود.
کامپایلر UIL اطلاعات کافی دربارهی مجموعههای نویسهی گوناگون دارد تا بتواند رشتههای لفظی را به درستی تجزیه کند. همچنین اگر از یک رشتهی مرکب در بافتی استفاده کنید که فقط از رشتههای پایانیافته با تهی پشتیبانی میکند، کامپایلر خطاهایی صادر مینماید.
از آنجا که نامهای مجموعههای نویسه کلیدواژه هستند، در صورتی که حالت حساس به بزرگی و کوچکی حروف فعال باشد، باید آنها را با حروف کوچک بنویسید. اگر نامها به بزرگی و کوچکی حروف حساس نباشند، نامهای مجموعههای نویسه میتوانند با حروف بزرگ، حروف کوچک یا ترکیبی از هر دو نوشته شوند.
علاوه بر مجموعههای نویسهی داخلی شناختهشده توسط UIL، میتوانید با تابع CHARACTER_SET مجموعههای نویسهی خود را تعریف کنید. شما میتوانید از تابع CHARACTER_SET در هر جایی که مشخص کردن مجموعه نویسه مجاز است استفاده نمایید.
رشتههای لفظی میتوانند شامل نویسههایی باشند که بیت هشتم (مرتبهبالا) آنها تنظیم شده است. شما نمیتوانید نویسههای کنترلی (00-1F، 7F و 80-9F) را مستقیماً در یک رشتهی لفظی تکگیومهای تایپ کنید. با این حال، میتوانید این نویسهها را با توالیهای گریز نمایش دهید. فهرست زیر توالیهای گریز را برای نویسههای خاص نشان میدهد.
- \b
- پسبر (Backspace)
- \f
- برگهپران (Form-feed)
- \n
- خط جدید (Newline)
- \r
- بازگشت به ابتدای خط (Carriage return)
- \t
- تب افقی (Horizontal tab)
- \v
- تب عمودی (Vertical tab)
- \'
- علامت نقلقول تکی (Single quotation mark)
- \"
- علامت نقلقول جفتی (Double quotation mark)
- \\
- بکاسلش (Backslash)
- \integer\
- نویسهای که بازنمایی داخلی آن توسط integer مشخص شده است (در محدودهی 0 تا 255 دهدهی)
توجه داشته باشید که توالیهای گریز در رشتههایی که در لوکال جاری تجزیه میشوند (رشتههای محلیسازیشده)، به صورت لفظی پردازش میگردند.
کامپایلر UIL نویسههای خط جدید را در رشتههای مرکب پردازش نمیکند. تأثیر یک نویسهی خط جدید در یک رشتهی مرکب تنها به مجموعه نویسهی آن رشته بستگی دارد، و تضمینی نیست که نتیجهی آن یک رشتهی چندخطی باشد.
رشتههای لفظی مرکب (Compound String Literals)
یک رشتهی مرکب متشکل از رشتهای از نویسههای 8 بیتی، 16 بیتی، یا چندبایتی، یک مجموعه نویسهی نامگذاریشده، و یک جهت نوشتار است. نوع دادهی UIL آن compound_string میباشد.
جهت نوشتار یک رشتهی مرکب به طور ضمنی از روی مجموعه نویسهی مشخصشده برای رشته تعیین میشود. شما میتوانید با استفاده از تابع COMPOUND_STRING به طور صریح جهت نوشتار را برای یک رشتهی مرکب تنظیم کنید.
یک رشتهی مرکب میتواند از دنبالهای از رشتههای مرکب الحاقشده، رشتههای پایانیافته با تهی، یا ترکیبی از هر دو تشکیل شود، که هر یک میتواند ویژگی مجموعه نویسه و جهت نوشتار متفاوتی داشته باشد. برای ایجاد دنبالهای از رشتههای مرکب، از عملگر الحاق & (امپرسند) استفاده کنید.
هر رشته در دنباله، شامل اطلاعات مجموعه نویسه و جهت نوشتار، ذخیره میشود.
به طور کلی، یک رشتهی لفظی زمانی در فایل UID به عنوان یک رشتهی مرکب ذخیره میشود که رشتهی لفظی متشکل از رشتههای الحاقشده با مجموعه نویسهها یا جهتهای نوشتار متفاوت باشد، یا زمانی که از رشته برای تعیین مقداری برای آرگومانی استفاده کنید که نیازمند یک مقدار رشتهی مرکب است. اگر میخواهید تضمین کنید که یک رشتهی لفظی به عنوان یک رشتهی مرکب ذخیره میشود، باید از تابع COMPOUND_STRING استفاده کنید.
میزان مصرف حافظه برای رشتههای لفظی (Data Storage Consumption for String Literals)
نحوهی ذخیرهسازی یک رشتهی لفظی در فایل UID به چگونگی اعلان و استفادهی شما از رشته بستگی دارد. کامپایلر UIL در صورتی که از رشته برای تعیین مقدار آرگومانی استفاده کنید که به یک رشتهی مرکب نیاز دارد، به طور خودکار رشتهی پایانیافته با تهی را به یک رشتهی مرکب تبدیل میکند. با این حال، این تبدیل از نظر میزان مصرف فضای ذخیرهسازی پرهزینه است.
رشتههای لفظی PRIVATE، EXPORTED و IMPORTED هنگام اعلان رشتهی لفظی، نیازمند فضایی برای یک بار تخصیص هستند؛ پس از آن، فضای ذخیرهسازی تنها برای هر ارجاع به آن رشتهی لفظی لازم خواهد بود. رشتههای لفظی که به صورت درونخطی (in-line) اعلان میشوند، هم برای تخصیص و هم برای ارجاع نیازمند فضای ذخیرهسازی هستند.
جدول زیر میزان مصرف فضای ذخیرهسازی داده را برای رشتههای لفظی خلاصه میکند. فضای مورد نیاز برای یک تخصیص، شامل یک بخش ثابت و یک بخش متغیر است. بخش ثابتِ یک تخصیص تقریباً برابر با فضای مورد نیاز برای یک ارجاع است (چند بایت). فضای مصرفشده توسط بخش متغیر به اندازهی مقدار رشتهی لفظی (یعنی طول رشته) بستگی دارد. برای صرفهجویی در فضای ذخیرهسازی، از اعلان رشتههای لفظی به شیوهای که منجر به تخصیص حافظه در هر بار استفاده میشود، خودداری کنید.
| میزان مصرف حافظه برای رشتههای لفظی (Data Storage Consumption for String Literals) | |||
| فضای ذخیرهسازی مورد نیاز | |||
| در هر بار استفاده (Per Use) | |||
| یک تخصیص و یک ارجاع (درون ماژول) | |||
| یک ارجاع (درون ماژول) | |||
| یک ارجاع (درون سلسلهمراتب UID) | |||
| یک ارجاع (درون سلسلهمراتب UID) | |||
| یک تخصیص و یک ارجاع (درون ماژول) | |||
| یک تخصیص و یک ارجاع (درون ماژول) | |||
| یک ارجاع (درون سلسلهمراتب UID) | |||
| یک ارجاع (درون سلسلهمراتب UID) | |||
| یک تخصیص و یک ارجاع (درون ماژول) | |||
| یک ارجاع (درون ماژول) | |||
| یک ارجاع (درون سلسلهمراتب UID) | |||
| یک ارجاع (درون سلسلهمراتب UID) | |||
اعداد صحیح لفظی (Integer Literals)
یک عدد صحیح لفظی بیانگر مقدار یک عدد کامل (صحیح) است. اعداد صحیح لفظی به شکل یک علامت اختیاری و به دنبال آن یک یا چند رقم دهدهی هستند. یک عدد صحیح لفظی نباید دارای فاصله یا کامای داخلی باشد.
اعداد صحیح لفظی در فایل UID به عنوان اعداد صحیح ۳۲ بیتی ذخیره میشوند. اعداد صحیح لفظی صادرشده و واردشده هنگام اعلان به یک تخصیص حافظه نیاز دارند؛ پس از آن، برای هر ارجاع به آن مقدار لفظی تنها چند بایت فضای ذخیرهسازی لازم است. اعداد صحیح لفظی خصوصی و آنهایی که به صورت درونخطی اعلان شدهاند، برای هر بار استفاده نیازمند تخصیص حافظه و فضای ذخیرهسازی ارجاع هستند. برای صرفهجویی در فضای ذخیرهسازی، از اعلان اعداد صحیح لفظی به گونهای که منجر به تخصیص حافظه در هر بار استفاده شود، خودداری کنید.
جدول زیر میزان مصرف فضای ذخیرهسازی داده را برای اعداد صحیح لفظی نشان میدهد.
| میزان مصرف فضای ذخیرهسازی برای اعداد صحیح لفظی | |
| اعلان (Declaration) | الزامات ذخیرهسازی به ازای هر استفاده |
| In-line | یک تخصیص و یک ارجاع (درون ماژول) |
| Private | یک تخصیص و یک ارجاع (درون ماژول) |
| Exported | یک ارجاع (درون سلسلهمراتب UID) |
| Imported | یک ارجاع (درون سلسلهمراتب UID) |
مقدارهای بولی لفظی (Boolean Literal)
یک مقدار بولی لفظی بیانگر مقدار True (کلیدواژه رزروشده TRUE یا On) یا False (کلیدواژه رزروشده FALSE یا Off) است. این کلیدواژهها تابع قواعد حساسیت به بزرگی و کوچکی حروف هستند.
در یک فایل UID، TRUE با مقدار عدد صحیح 1 و FALSE با مقدار عدد صحیح 0 (صفر) نمایش داده میشود.
میزان مصرف فضای ذخیرهسازی داده برای مقدارهای بولی لفظی مشابه اعداد صحیح لفظی است.
اعداد ممیز شناور لفظی (Floating-Point Literal)
یک عدد ممیز شناور لفظی بیانگر مقدار یک عدد حقیقی (یا شناور) است. اعداد ممیز شناور لفظی ساختار زیر را دارند:
[+|-][integer].integer[E|e[+|-]exponent]
برای بیشترین سازگاری و انتقالپذیری، یک عدد ممیز شناور لفظی میتواند مقادیر در محدوده 1.0E-37 تا 1.0E+37 را با حداقل 6 رقم بااهمیت نمایش دهد. در بسیاری از ماشینها این محدوده با ارقام بااهمیت بیشتری گستردهتر خواهد بود. یک عدد ممیز شناور لفظی نباید دارای فاصله یا کامای داخلی باشد.
اعداد ممیز شناور لفظی در فایل UID به عنوان اعداد ممیز شناور با دقت مضاعف ذخیره میشوند. جدول زیر مثالهایی از نشانهگذاریهای معتبر و نامعتبر ممیز شناور را برای کامپایلر UIL نشان میدهد.
| Floating Point Literals | |
| Valid Floating-Point Literals | Invalid Floating-Point Literals |
| 1.0 | 1e1 (بدون نقطه ممیز) |
| 3.1415E-2 (برابر است با .031415) | 2.87 e6 (فاصلههای خالی داخلی) |
| -6.29e7 (برابر است با -62900000) | 2.0e100 (خارج از محدوده) |
میزان مصرف فضای ذخیرهسازی داده برای اعداد ممیز شناور لفظی مشابه اعداد صحیح لفظی است.
هدف از نوع داده ANY غیرفعال کردن ویژگی بررسی نوع داده در کامپایلر UIL است. میتوانید از نوع داده ANY برای موارد زیر استفاده کنید:
- •
- مشخص کردن نوع برچسب یک رویه فراخوانی بازگشتی (callback)
- •
- مشخص کردن نوع یک آرگومان تعریفشده توسط کاربر
میتوانید زمانی از نوع داده ANY استفاده کنید که نیازمند استفاده از نوعی باشید که توسط کامپایلر UIL پشتیبانی نمیشود، یا زمانی که بخواهید محدودیتهای نوع داده اعمالشده توسط کامپایلر کاهش یابد. برای نمونه، ممکن است بخواهید یک ویجت را با آرگومانی تعریف کنید که بسته به شرایط زمان اجرا، بتواند انواع مختلفی از مقادیر را بپذیرد.
اگر مشخص کنید که یک آرگومان مقداری از نوع ANY میپذیرد، کامپایلر نوع مقدار مشخصشده برای آن آرگومان را بررسی نمیکند؛ بنابراین، هنگام تعیین مقدار برای آرگومانی از نوع ANY باید دقت کافی داشته باشید. اگر مقداری با نوع دادهای ارسال کنید که ویجت برای آن آرگومان پشتیبانی نمیکند، ممکن است در زمان اجرا نتایج غیرمنتظرهای دریافت کنید.
عبارتها (Expressions)
زبان UIL شامل عبارتهای مقداری در زمان کامپایل است. این عبارتها میتوانند حاوی ارجاع به سایر مقادیر UIL باشند، اما نمیتوانند دارای ارجاع به جلو باشند.
جدول زیر مجموعهای از عملگرهای UIL را فهرست میکند که به شما امکان میدهند مقادیر صحیح، حقیقی و بولی را بر اساس سایر مقادیر تعریفشده درون ماژول UIL ایجاد کنید. در این جدول، تقدم 1 بالاترین است.
| Valid Operators | |||
| Operator | Operand Types | Meaning | Precedence |
| ~ | Boolean | نقیض | 1 |
| integer | مکمل یک | ||
| - | float | منفی کردن | 1 |
| integer | منفی کردن | ||
| + | float | NOP | 1 |
| integer | NOP | ||
| * | float,float | ضرب | 2 |
| integer,integer | ضرب | ||
| / | float,float | تقسیم | 2 |
| integer,integer | تقسیم | ||
| + | float,float | جمع | 3 |
| integer,integer | جمع | ||
| - | float,float | تفریق | 3 |
| integer,integer | تفریق | ||
| >> | integer,integer | شیفت به راست | 4 |
| << | integer,integer | شیفت به چپ | 4 |
| & | Boolean,Boolean | و منطقی | 5 |
| integer,integer | و بیتی | ||
| string,string | پیوند رشتهها | ||
| | | Boolean,Boolean | یا منطقی | 6 |
| integer,integer | یا بیتی | ||
| ^ | Boolean,Boolean | یا مانعهالجمع | 6 |
| integer,integer | یا مانعهالجمع بیتی | ||
یک رشته میتواند یک رشته مرکب تکی یا توالیای از رشتههای مرکب باشد. اگر دو رشتهی پیوندیافته ویژگیهای متفاوتی (مانند جهت نگارش یا مجموعه نویسهها) داشته باشند، نتیجهی پیوند یک رشته مرکب چندبخشی خواهد بود.
رشته حاصل از پیوند، یک رشته پایانیافته با تهی است مگر اینکه یک یا چند مورد از شرایط زیر برقرار باشد:
- •
- یکی از عملوندها یک رشته مرکب باشد
- •
- عملوندها ویژگیهای مجموعه نویسه متفاوتی داشته باشند
- •
- عملوندها جهتهای نگارش متفاوتی داشته باشند
در این صورت رشته حاصل یک رشته مرکب خواهد بود. شما نمیتوانید از مقادیر واردشده یا صادرشده به عنوان عملوندهای عملگر پیوند استفاده کنید.
نتیجه هر عملگر همان نوع عملوندهایش را دارد. نمیتوانید بدون استفاده از توابع تبدیل، انواع مختلف را در یک عبارت ترکیب کنید.
میتوانید از پرانتزها برای نادیده گرفتن اولویت عادی عملگرها استفاده کنید. در توالیای از عملگرهای یکانی، عملیات به ترتیب از راست به چپ انجام میشوند. برای نمونه، - + -A معادل -(+(-A)) است. در توالیای از عملگرهای دوتایی با اولویت یکسان، عملیات به ترتیب از چپ به راست انجام میشوند. برای نمونه، A*B/C*D معادل ((A*B)/C)*D است.
یک اعلان مقدار، به یک مقدار نام اختصاص میدهد. شما نمیتوانید مقدار آن نام را در یک اعلان مقدار بعدی دوباره تعریف کنید. میتوانید از مقداری که حاوی عملگرها و توابع است در هر کجای ماژول UIL که استفاده از مقدار مجاز است، استفاده کنید. نمیتوانید از مقادیر واردشده به عنوان عملوند در عبارتها استفاده کنید.
چندین مورد از عملگرهای دوتایی برای چندین نوع داده تعریف شدهاند. برای نمونه، عملگر ضرب (*) هم برای عملوندهای ممیز شناور و هم برای عملوندهای عدد صحیح تعریف شده است.
برای اینکه کامپایلر UIL بتواند این عملیات دوتایی را انجام دهد، هر دو عملوند باید از یک نوع باشند. اگر عملوندهایی از انواع داده مختلف ارائه دهید، کامپایلر UIL به طور خودکار یکی از عملوندها را بر اساس قواعد تبدیل زیر به نوع عملوند دیگر تبدیل میکند:
- •
- اگر عملوندها یک عدد صحیح و یک بولی باشند، مقدار بولی به یک عدد صحیح تبدیل میشود.
- •
- اگر عملوندها یک عدد صحیح و یک ممیز شناور باشند، عدد صحیح به یک ممیز شناور تبدیل میشود.
- •
- اگر عملوندها یک ممیز شناور و یک بولی باشند، مقدار بولی به یک ممیز شناور تبدیل میشود.
همچنین میتوانید نوع داده یک مقدار را با استفاده از یکی از توابع تبدیل INTEGER، FLOAT یا SINGLE_FLOAT به صورت صریح تبدیل کنید.
توابع (Functions)
زبان UIL توابعی را برای تولید انواع مقادیر زیر ارائه میدهد:
- •
- مجموعههای نویسه (Character sets)
- •
- نمادهای کلید (Keysyms)
- •
- رنگها
- •
- نقشهبیتها (Pixmaps)
- •
- اعداد ممیز شناور با دقت یگانه (Single-precision)
- •
- اعداد ممیز شناور با دقت مضاعف (Double-precision)
- •
- قلمها (Fonts)
- •
- مجموعههای قلم (Fontsets)
- •
- جدولهای قلم
- •
- رشتههای ترکیبی (Compound strings)
- •
- جدولهای رشتههای ترکیبی
- •
- جدولهای رشتهای ASCIZ (پایانیافته با null)
- •
- رشتههای نویسه پهن (Wide character strings)
- •
- نامهای کلاس ویجت
- •
- جدولهای عدد صحیح
- •
- آرگومانها
- •
- علتها (Reasons)
- •
- جدولهای ترجمه (Translation tables)
به یاد داشته باشید که تمامی مثالهای بخشهای زیر حالت غیرحساس به حروف کوچک و بزرگ (case-insensitive) را فرض میکنند. کلمات کلیدی با حروف بزرگ نشان داده شدهاند تا از نامهای مشخصشده توسط کاربر که با حروف کوچک نمایش یافتهاند، متمایز شوند. استفاده از حروف بزرگ در حالت غیرحساس به حروف الزامی نیست. در حالت حساس به حروف (case-sensitive)، کلمات کلیدی باید با حروف کوچک نوشته شوند.
- CHARACTER_SET(string_expression[, property[, ...]])
- شما میتوانید مجموعههای نویسه سفارشی خود را با تابع CHARACTER_SET تعریف کنید. شما میتوانید از تابع CHARACTER_SET در هر جایی که مشخص کردن مجموعه نویسه مجاز باشد، استفاده نمایید.
- نتیجه تابع CHARACTER_SET یک مجموعه نویسه با نام string_expression و ویژگیهای مشخصشده توسط شما است. string_expression باید یک رشته پایانیافته با null باشد. میتوانید برای تعیین ویژگیهای مجموعه نویسه حاصل، به صورت اختیاری یک یا هر دو عبارت زیر را درج کنید:
RIGHT_TO_LEFT = boolean_expression SIXTEEN_BIT = boolean_expression
- عبارت RIGHT_TO_LEFT جهت نوشتار پیشفرض رشته را در صورت True بودن boolean_expression از راست به چپ، و در غیر این صورت از چپ به راست تنظیم میکند.
- عبارت SIXTEEN_BIT به رشتههای مرتبط با این مجموعه نویسه اجازه میدهد در صورت True بودن boolean_expression به عنوان نویسههای ۱۶ بیتی، و در غیر این صورت به عنوان نویسههای ۸ بیتی تفسیر شوند.
- KEYSYM(string_literal)
- تابع KEYSYM برای مشخص کردن یک keysym جهت منبع مِنمونیک (mnemonic resource) به کار میرود. string_literal باید حاوی یک نام معتبر KeySym باشد. (برای اطلاعات بیشتر به XStringToKeysym(3 X11) مراجعه کنید.)
- COLOR(string_expression[,FOREGROUND|BACKGROUND])
- تابع COLOR از تعریف رنگها پشتیبانی میکند. با استفاده از تابع COLOR میتوانید مقداری را برای تعیین یک رنگ اختصاص داده و سپس از آن مقدار برای آرگومانهایی که نیازمند مقدار رنگ هستند استفاده کنید. عبارت رشتهای نام رنگی را که میخواهید تعریف کنید مشخص میسازد؛ کلمات کلیدی اختیاری FOREGROUND و BACKGROUND نحوه نمایش رنگ را روی دستگاه تکرنگ (monochrome) در هنگامی که از این رنگ در تعریف جدول رنگ استفاده شده باشد، تعیین میکنند.
- کامپایلر UIL نامهای رنگ توکار ندارد. رنگها یک صفت وابسته به سرور برای یک شیء هستند. رنگها روی هر سرور تعریف میشوند و ممکن است مقادیر قرمز-سبز-آبی (RGB) متفاوتی در هر سرور داشته باشند. رشتهای که به عنوان آرگومان رنگ مشخص میکنید باید توسط سروری که برنامه شما روی آن اجرا میشود، شناخته شود.
- در یک فایل UID، زبان UIL یک رنگ را به عنوان رشته نویسهای نمایش میدهد. سیستم MRM روالهای ترجمه X را فراخوانی میکند که رشته رنگ را به مقدار پیکسل خاص دستگاه تبدیل میکنند. اگر برنامه را روی یک سرور تکرنگ اجرا کنید، تمام رنگها به سیاه یا سفید تبدیل میشوند. اگر روی یک سرور رنگی باشید، در صورت برآورده شدن شرایط زیر نامهای رنگ به رنگهای مناسب خود تبدیل میشوند:
- •
- رنگ تعریف شده باشد.
- •
- جدول رنگ (colormap) هنوز پر نشده باشد.
- اگر جدول رنگ پر باشد، حتی رنگهای معتبر نیز به سیاه یا سفید (پیشزمینه یا پسزمینه) تبدیل میشوند.
- رابطهای کاربری معمولاً رنگ ویجتها را به طور مستقیم تعیین نمیکنند، تا انتخاب رنگها بتواند توسط کاربر از طریق فایل .Xdefaults کنترل شود.
- برای نوشتن برنامهای که هم روی دستگاههای تکرنگ و هم روی دستگاههای رنگی اجرا شود، باید مشخص کنید که کدام رنگها در یک جدول رنگ (تعریفشده با تابع COLOR_TABLE) به پسزمینه و کدام رنگها به پیشزمینه نگاشت میشوند. زبان UIL به شما امکان میدهد با استفاده از تابع COLOR این نگاشت را در تعریف رنگ تعیین نمایید. مثال زیر نحوه استفاده از تابع COLOR را برای نگاشت رنگ قرمز به رنگ پسزمینه در یک دستگاه تکرنگ نشان میدهد:
VALUE c: COLOR ( 'red',BACKGROUND );
- این نگاشت تنها زمانی اعمال میشود که رنگی به MRM داده شود و برنامه قرار باشد روی یک دستگاه تکرنگ نمایش یابد. در این حالت، هر رنگ در یکی از سه دسته زیر قرار میگیرد:
- •
- رنگ به رنگ پسزمینه در دستگاه تکرنگ نگاشت شده است.
- •
- رنگ به رنگ پیشزمینه در دستگاه تکرنگ نگاشت شده است.
- •
- نگاشت تکرنگ برای این رنگ تعریف نشده است.
- اگر رنگ به رنگ پیشزمینه یا پسزمینه نگاشت شده باشد، MRM به ترتیب رنگ پیشزمینه یا پسزمینه را جایگزین میکند. اگر نگاشت تکرنگ را برای یک رنگ مشخص نکنید، MRM رشته رنگ را برای نگاشت به رنگ پیشزمینه یا پسزمینه به جعبهابزار موتیف (Motif Toolkit) ارسال میکند.
- RGB(red_integer, green_integer, blue_integer)
- سه عدد صحیح مقادیر مولفههای قرمز، سبز و آبی رنگ را به همان ترتیب تعریف میکنند. مقادیر این مولفهها میتوانند در بازه ۰ تا ۶۵٬۵۳۵ (شامل هر دو) باشند. این مقادیر را میتوان به صورت عبارتهای عدد صحیح نیز نشان داد.
- در یک فایل UID، زبان UIL یک مقدار RGB را به صورت سه عدد صحیح نمایش میدهد. سیستم MRM روالهای ترجمه X را فراخوانی میکند که اعداد صحیح را به مقدار پیکسل خاص دستگاه تبدیل میکنند. اگر برنامه را روی یک سرور تکرنگ اجرا کنید، تمام رنگها به سیاه یا سفید تبدیل میشوند. اگر روی یک سرور رنگی باشید، در صورتی که جدول رنگ هنوز پر نشده باشد، مقادیر RGB به رنگهای مناسب خود تبدیل میشوند. اگر جدول رنگ پر باشد، مقادیر به سیاه یا سفید (پیشزمینه یا پسزمینه) تبدیل میشوند.
- COLOR_TABLE(color_expression='character'[,...])
- عبارت رنگ (color_expression) یک رنگ از قبل تعریفشده، رنگی که به صورت درخط با تابع COLOR تعریف شده باشد، یا عبارت BACKGROUND COLOR یا FOREGROUND COLOR است. نویسه (character) میتواند هر نویسه معتبر UIL باشد.
- تابع COLOR_TABLE روشی مستقل از دستگاه برای مشخص کردن مجموعهای از رنگها فراهم میکند. تابع COLOR_TABLE یا نامهای رنگ UIL از قبل تعریفشده یا تعاریف درخط رنگ (با استفاده از تابع COLOR) را میپذیرد. یک جدول رنگ باید به صورت اختصاصی (private) باشد زیرا محتوای آن برای ساخت آیکون باید توسط کامپایلر UIL شناخته شده باشد. با این حال، رنگهای درون یک جدول رنگ میتوانند وارداتی (imported)، صادراتی (exported) یا اختصاصی (private) باشند.
- تکحرف مرتبط با هر رنگ، نویسهای است که برای نمایش آن رنگ هنگام ایجاد آیکون استفاده میکنید. هر حرف بهکاررفته برای نمایش یک رنگ باید در داخل جدول رنگ یکتا باشد.
- ICON([COLOR_TABLE=color_table_name,] row[,...)
- color-table-name باید به یک جدول رنگ از قبل تعریفشده اشاره کند، و row یک عبارت نویسهای است که یک سطر از آیکون را مشخص میسازد.
- تابع ICON یک آیکون مستطیلی را با پهنای x پیکسل و ارتفاع y پیکسل توصیف میکند. رشتههای محصور در نقلقول تکی (single quotation marks) آیکون را توصیف میکنند. هر رشته نشاندهنده یک سطر در آیکون است؛ هر نویسه در رشته نشاندهنده یک پیکسل است.
- سطر اول در تعریف آیکون، پهنای آیکون را مشخص میکند. تمام سطرها باید تعداد نویسههایی برابر با سطر اول داشته باشند. ارتفاع آیکون با تعداد سطرها تعیین میشود. حداکثر تعداد سطرها ۹۹۹ است.
- آرگومان اول تابع ICON (مشخصات جدول رنگ) اختیاری است و رنگهای موجود در این آیکون را تعیین میکند. با استفاده از تکحرف مرتبط با هر رنگ، میتوانید رنگ هر پیکسل را در آیکون تعیین نمایید. آیکون باید از نویسههایی ساخته شود که در جدول رنگ تعیینشده تعریف شده باشند.
- اگر آرگومان مشخصکننده جدول رنگ را حذف کنید، از جدول رنگ پیشفرض استفاده میشود. برای استفاده از جدول رنگ پیشفرض، سطرهای آیکون شما فقط باید حاوی فاصلهها (spaces) و ستارهها (asterisks) باشند. جدول رنگ پیشفرض به صورت زیر تعریف میشود:
COLOR_TABLE( BACKGROUND COLOR = ' ', FOREGROUND COLOR = '*')
- میتوانید نویسههای دیگری را برای نمایش رنگ پسزمینه و رنگ پیشزمینه با جایگزین کردن فاصله و ستاره در عبارتهای BACKGROUND COLOR و FOREGROUND COLOR نشاندادهشده در دستور قبلی تعریف کنید. میتوانید آیکونها را به صورت اختصاصی (private)، وارداتی (imported) یا صادراتی (exported) تعیین نمایید. برای بازیابی یک آیکون صادرشده در زمان اجرا، از تابع MRM به نام MrmFetchIconLiteral استفاده کنید.
- XBITMAPFILE(string_expression)
- تابع XBITMAPFILE مشابه تابع ICON است از این جهت که هر دو یک آیکون مستطیلی با پهنای x پیکسل و ارتفاع y پیکسل را توصیف میکنند. با این حال، XBITMAPFILE به شما امکان میدهد یک فایل خارجی حاوی تعریف یک بیتمپ X را تعیین کنید، در حالی که تمام تعاریف تابع ICON باید مستقیماً در UIL کدنویسی شوند. فایلهای بیتمپ X میتوانند توسط برنامههای کاربردی مختلف X تولید شوند. زبان UIL این فایلها را از طریق تابع XBITMAPFILE میخواند، اما از ایجاد این فایلها پشتیبانی نمیکند. فایل بیتمپ X که به عنوان آرگومان به تابع XBITMAPFILE داده میشود، در زمان اجرای برنامه توسط MRM خوانده میشود.
- تابع XBITMAPFILE مقداری از نوع pixmap برمیگرداند و میتوان از آن در هر جایی که نوع داده pixmap مورد انتظار است استفاده کرد.
- SINGLE_FLOAT(real_number_literal)
- تابع SINGLE_FLOAT به شما امکان میدهد لیترالهای ممیز شناور را در فایلهای UIL به عنوان اعداد ممیز شناور با دقت یگانه (single-precision) ذخیره کنید. اعداد ممیز شناور با دقت یگانه اغلب میتوانند با مصرف حافظه کمتری نسبت به اعداد ممیز شناور با دقت مضاعف (double-precision) ذخیره شوند. مقدار real_number_literal میتواند یک لیترال عدد صحیح یا یک لیترال ممیز شناور باشد.
- FLOAT(real_number_literal)
- تابع FLOAT به شما امکان میدهد لیترالهای ممیز شناور را در فایلهای UIL به عنوان اعداد ممیز شناور با دقت مضاعف (double-precision) ذخیره نمایید. مقدار real_number_literal میتواند یک لیترال عدد صحیح یا یک لیترال ممیز شناور باشد.
- FONT(string_expression[, CHARACTER_SET=char_set])
- شما قلمها را با تابع FONT تعریف میکنید. با استفاده از تابع FONT، مقداری را برای تعیین یک قلم مشخص میکنید و سپس از آن مقدار برای آرگومانهایی که نیازمند مقدار قلم هستند استفاده مینمایید. کامپایلر UIL هیچ قلم توکاری (built-in) ندارد.
- هر قلم فقط در بستر (context) یک مجموعه نویسه معنادار است. تابع FONT دارای یک پارامتر اضافی است تا به شما امکان دهد مجموعه نویسه را برای قلم مشخص کنید. این پارامتر اختیاری است؛ اگر آن را حذف کنید، مجموعه نویسه پیشفرض به مقدار متغیر محیطی LANG در صورت تنظیم بودن، یا به مقدار XmFALLBACK_CHARSET در صورت تنظیم نبودن LANG بستگی خواهد داشت.
- عبارت string_expression نام قلم را تعیین میکند و عبارت CHARACTER_SET = char_set مجموعه نویسه را برای قلم مشخص میسازد. عبارت رشتهای استفادهشده در تابع FONT نمیتواند یک رشته ترکیبی (compound string) باشد.
- FONTSET(string_expression[,...][, CHARACTER_SET=charset])
- شما مجموعههای قلم (fontsets) را با تابع FONTSET تعریف میکنید. با استفاده از تابع FONTSET، مجموعهای از مقادیر را برای تعیین قلمها مشخص میکنید و سپس از آن مقادیر برای آرگومانهایی که نیازمند یک مجموعه قلم هستند استفاده مینمایید. کامپایلر UIL هیچ قلم توکاری ندارد.
- هر قلم فقط در بستر یک مجموعه نویسه معنادار است. تابع FONTSET دارای یک پارامتر اضافی است تا به شما امکان دهد مجموعه نویسه را برای قلم مشخص کنید. این پارامتر اختیاری است؛ اگر آن را حذف کنید، مجموعه نویسه پیشفرض به مقدار متغیر محیطی LANG در صورت تنظیم بودن، یا به مقدار XmFALLBACK_CHARSET در صورت تنظیم نبودن LANG بستگی خواهد داشت.
- عبارت رشتهای نام قلم را تعیین میکند و عبارت CHARACTER_SET = char_set مجموعه نویسه را برای قلم مشخص میسازد. عبارت رشتهای استفادهشده در تابع FONTSET نمیتواند یک رشته ترکیبی باشد.
- FONT_TABLE(font_expression[,...])
- یک جدول قلم دنبالهای از جفتهای قلم و مجموعه نویسه است. در زمان اجرا، هنگامی که شیئی نیاز به نمایش یک رشته دارد، آن شیء جدول قلم را برای یافتن مجموعه نویسهای که با مجموعه نویسه رشته مورد نمایش مطابقت دارد جستجو میکند. زبان UIL تابع FONT_TABLE را فراهم میسازد تا بتوانید چنین آرگومانی را ارائه دهید. مقدار font_expression با توابع FONT و FONTSET ایجاد میشود.
- اگر یک مقدار قلم منفرد را برای مشخص کردن آرگومانی که نیازمند جدول قلم است تعیین کنید، کامپایلر UIL به طور خودکار مقدار قلم را به یک جدول قلم تبدیل میکند.
- COMPOUND_STRING(string_expression[,property[,...]])
- از تابع COMPOUND_STRING برای تنظیم ویژگیهای یک رشته پایانیافته با null (null-terminated) و تبدیل آن به یک رشته ترکیبی (compound string) استفاده کنید. ویژگیهایی که میتوانید تنظیم کنید جهت نگارش و جداکننده (separator) هستند.
- نتیجه تابع COMPOUND_STRING یک رشته ترکیبی با مقدار عبارت رشتهای به عنوان مقدار آن است. شما میتوانید به صورت اختیاری یک یا چند مورد از عبارتهای زیر را برای تعیین ویژگیهای رشته ترکیبی حاصل درج کنید:
- RIGHT_TO_LEFT = boolean_expression SEPARATE = boolean_expression
- عبارت RIGHT_TO_LEFT در صورتی که boolean_expression برابر با True باشد، جهت نگارش رشته را از راست به چپ و در غیر این صورت از چپ به راست تنظیم میکند. مشخص کردن این آرگومان تغییری در مقدار عبارت رشتهای ایجاد نمیکند. اگر آرگومان RIGHT_TO_LEFT را حذف کنید، رشته حاصل دارای همان جهت نگارش string_expression خواهد بود.
- عبارت SEPARATE در صورتی که boolean_expression برابر با True باشد، یک جداکننده به انتهای رشته ترکیبی اضافه میکند. اگر عبارت SEPARATE را حذف کنید، رشته حاصل دارای جداکننده نخواهد بود.
- نمیتوانید از مقادیر وارداتی (imported) یا صادراتی (exported) به عنوان عملوندهای تابع COMPOUND_STRING استفاده کنید.
- COMPOUND_STRING_COMPONENT(component_type [, {string | enumval}])
- از تابع COMPOUND_STRING_COMPONENT برای ایجاد رشتههای ترکیبی در UIL متشکل از مؤلفههای منفرد استفاده کنید. این تابع معادل XmStringComponentCreate است. این تابع به شما امکان میدهد رشتههای ترکیبی سادهای شامل مؤلفههایی مانند XmSTRING_COMPONENT_TAB و XmSTRING_COMPONENT_RENDITION_BEGIN ایجاد کنید که توسط تابع COMPOUND_STRING تولید نمیشوند. سپس این مؤلفهها میتوانند به رشتههای ترکیبی دیگر الحاق شوند تا رشتههای ترکیبی پیچیدهتری ساخته شوند.
- آرگومان اول باید یک ثابت شمارشی XmStringComponentType باشد. نوع و تفسیر آرگومان دوم به آرگومان اول بستگی دارد. به عنوان مثال، اگر هر یک از ثابتهای شمارشی زیر را برای آرگومان اول مشخص کنید، نباید آرگومان دومی را مشخص نمایید: XmSTRING_COMPONENT_SEPARATOR، XmSTRING_COMPONENT_LAYOUT_POP، XmSTRING_COMPONENT_TAB و XmSTRING_COMPONENT_LOCALE. اما اگر ثابت شمارشیای از گروه زیر را مشخص کنید، باید یک string را به عنوان آرگومان دوم ارائه دهید: XmSTRING_COMPONENT_CHARSET، XmSTRING_COMPONENT_TEXT، XmSTRING_COMPONENT_LOCALE_TEXT، XmSTRING_COMPONENT_WIDECHAR_TEXT، XmSTRING_COMPONENT_RENDITION_BEGIN و XmSTRING_COMPONENT_RENDITION_END. اگر XmSTRING_COMPONENT_DIRECTION را به عنوان آرگومان اول مشخص کنید، باید یک ثابت شمارشی XmStringDirection را به عنوان آرگومان دوم تعیین نمایید. در نهایت، اگر XmSTRING_COMPONENT_LAYOUT_PUSH را به عنوان آرگومان اول مشخص کنید، باید یک ثابت شمارشی XmDirection را به عنوان آرگومان دوم مشخص کنید.
- مؤلفههای رشته ترکیبی XmSTRING_COMPONENT_RENDITION_BEGIN و XmSTRING_COMPONENT_RENDITION_END به عنوان آرگومان خود، «برچسب» (tag) یا نام یک بازنمایی (rendition) را از جدول رندر فعلی دریافت میکنند. برای اطلاعات بیشتر درباره نحوه مشخص کردن یک جدول رندر، بخش بعدی را ببینید.
- COMPOUND_STRING_TABLE(string_expression[,...])
- یک جدول رشته ترکیبی آرایهای از رشتههای ترکیبی است. اشیایی که به فهرستی از مقادیر رشتهای نیاز دارند، مانند آرگومانهای XmNitems و XmNselectedItems برای ویجت فهرست (list widget)، از مقادیر جدول رشته استفاده میکنند. تابع COMPOUND_STRING_TABLE مقادیر این دو آرگومان از ویجت فهرست را میسازد. تابع COMPOUND_STRING_TABLE مقداری از نوع string_table تولید میکند. نام STRING_TABLE مترادفی برای COMPOUND_STRING_TABLE است.
- رشتههای درون جدول رشته باید رشتههای ساده باشند که کامپایلر UIL آنها را به طور خودکار به رشتههای ترکیبی تبدیل میکند.
- ASCIZ_STRING_TABLE(string_expression[,...])
- یک جدول رشته ASCIZ آرایهای از مقادیر رشتهای ASCIZ (پایانیافته با null) است که با کاما از یکدیگر جدا شدهاند. این تابع به شما اجازه میدهد بیش از یک رشته ASCIZ را به عنوان مقدار برچسب فراخوانی (callback tag) ارسال کنید. تابع ASCIZ_STRING_TABLE مقداری از نوع asciz_table تولید میکند. نام ASCIZ_TABLE مترادفی برای ASCIZ_STRING_TABLE است.
- WIDE_CHARACTER(string_expression)
- از تابع WIDE_CHARACTER برای تولید یک رشته نویسه پهن (wide character string) از یک رشته پایانیافته با null در محلیسازی (locale) فعلی استفاده کنید.
- CLASS_REC_NAME(string_expression)
- از تابع CLASS_REC_NAME برای تولید نام یک کلاس ویجت استفاده کنید. برای یک کلاس ویجت تعریفشده توسط جعبهابزار (toolkit)، آرگومان رشتهای نام آن کلاس است. برای یک ویجت سفارشی (تعریفشده توسط کاربر)، آرگومان رشتهای نام روال ایجاد (creation routine) برای آن ویجت است.
- INTEGER_TABLE(integer_expression[,...])
- یک جدول عدد صحیح، آرایهای از مقادیر عدد صحیح جداشده با کاما است. این تابع به شما اجازه میدهد بیش از یک عدد صحیح را به ازای هر مقدار برچسب فراخوانی (callback tag) ارسال کنید. تابع INTEGER_TABLE مقداری از نوع integer_table تولید میکند.
- ARGUMENT(string_expression[, argument_type])
- تابع ARGUMENT آرگومانهای یک ویجت تعریفشده توسط کاربر (user-defined widget) را تعریف میکند. هر یک از اشیایی که میتوانند توسط UIL توصیف شوند، مجموعهای از آرگومانها را میپذیرند که در ضمیمه B فهرست شدهاند. برای مثال، XmNheight آرگومانی برای بیشتر اشیاء است و دارای نوع داده عدد صحیح (integer) میباشد. برای تعیین ارتفاع برای یک ویجت تعریفشده توسط کاربر، میتوانید از نام آرگومان توکار XmNheight استفاده کرده و هنگام اعلان ویجت تعریفشده توسط کاربر، یک مقدار عدد صحیح را مشخص کنید. شما از تابع ARGUMENT برای مشخص کردن آرگومانهایی که در کامپایلر UIL توکار هستند، استفاده نمیکنید.
- نام string_expression نامی است که کامپایلر UIL برای آرگومان در فایل UID استفاده میکند. argument_type نوع مقداری است که میتواند با آرگومان مرتبط شود. اگر آرگومان دوم را حذف کنید، نوع پیشفرض ANY است و هیچگونه بررسی نوع مقدار انجام نمیشود. از یکی از کلیدواژههای زیر برای مشخص کردن نوع آرگومان استفاده کنید:
- •
- ANY
- •
- ASCIZ_TABLE
- •
- BOOLEAN
- •
- COLOR
- •
- COMPOUND_STRING
- •
- FLOAT
- •
- FONT
- •
- FONT_TABLE
- •
- FONTSET
- •
- ICON
- •
- INTEGER
- •
- INTEGER_TABLE
- •
- KEYSYM
- •
- PIXMAP
- •
- REASON
- •
- SINGLE_FLOAT
- •
- STRING
- •
- STRING_TABLE
- •
- TRANSLATION_TABLE
- •
- WIDE_CHARACTER
- •
- WIDGET
- میتوانید از تابع ARGUMENT استفاده کنید تا به کامپایلر UIL امکان شناسایی افزونههای جعبهابزار موتیف (Motif Toolkit) را بدهید. برای مثال، یک ویجت موجود ممکن است یک آرگومان جدید را بپذیرد. با استفاده از تابع ARGUMENT، میتوانید این آرگومان جدید را پیش از انتشار نسخه بهروزشده کامپایلر، در دسترس کامپایلر UIL قرار دهید.
- REASON(string_expression)
- تابع REASON برای تعریف علتهای جدید برای ویجتهای تعریفشده توسط کاربر کاربرد دارد.
- هر یک از اشیاء در جعبهابزار موتیف (Motif Toolkit) مجموعهای از شرایط را تعریف میکنند که تحت آنها یک تابع تعریفشده توسط کاربر را فراخوانی مینمایند. این شرایط به عنوان علتهای بازفراخوانی (callback reasons) شناخته میشوند. به توابع تعریفشده توسط کاربر، روالهای بازفراخوانی (callback procedures) گفته میشود. در یک ماژول UIL، از لیست بازفراخوانیها (callbacks list) برای تعیین اینکه کدام توابع تعریفشده توسط کاربر برای چه علتهایی فراخوانی شوند، استفاده میکنید.
- ضمیمه B فهرست علتهای بازفراخوانی پشتیبانیشده توسط اشیاء جعبهابزار موتیف را ارائه میدهد.
- هنگامی که یک ویجت تعریفشده توسط کاربر را اعلان میکنید، میتوانید با استفاده از تابع REASON علتهای بازفراخوانی را برای آن ویجت تعریف نمایید. عبارت رشتهای، نام آرگومان ذخیرهشده در فایل UID را برای علت مشخص میکند. این نام علت در زمان اجرا به روال ایجاد ویجت تحویل داده میشود.
- TRANSLATION_TABLE(string_expression[,...])
- هر یک از ویجتهای جعبهابزار موتیف دارای یک جدول ترجمه (translation table) هستند که رویدادهای سامانه X (برای مثال، فشرده شدن کلید ۱ ماوس) را به دنبالهای از کنشها (actions) نگاشت میکند. از طریق آرگومانهای ویجت، مانند آرگومان رایج translations، میتوانید مجموعهای جایگزین از رویدادها یا کنشها را برای یک ویجت خاص مشخص کنید. تابع TRANSLATION_TABLE یک جدول ترجمه ایجاد میکند که میتواند به عنوان مقدار آرگومانی از نوع داده translation_table به کار رود.
- میتوانید از یکی از دستورالعملهای جدول ترجمه زیر به همراه تابع TRANSLATION_TABLE استفاده کنید: #override، #augment، یا #replace. حالت پیشفرض #replace است. اگر یکی از این دستورالعملها را مشخص کنید، باید نخستین مدخل در جدول ترجمه باشد.
- دستورالعمل #override سبب نادیده گرفته شدن هرگونه ترجمه تکراری میشود. برای مثال، اگر ترجمهای برای <Btn1Down> از قبل در ترجمههای جاری یک PushButton تعریف شده باشد، ترجمه تعریفشده توسط new_translations تعریف جاری را بازنویسی (override) میکند. اگر دستورالعمل #augment مشخص شده باشد، تعریف جاری اولویت مییابد. دستورالعمل #replace تمامی ترجمههای جاری را با موارد مشخصشده در منبع XmNtranslations جایگزین میکند.
بازنماییها و جدولهای بازنمایی (Renditions and Render Tables)
علاوه بر جهت رشته (string direction)، هر رشته ترکیبی حاوی حجم زیادی از اطلاعات درباره چگونگی بازنمایی (رندر شدن) متن خود است. هر رشته ترکیبی شامل یک «برچسب» (tag) است که «بازنمایی» (rendition) مورد استفاده برای ترسیم آن رشته را مشخص میکند. بازنمایی شامل اطلاعاتی همچون قلم، اندازه، رنگ، زیرخطدار بودن متن یا خطخوردگی آن، و موقعیت و سبک هر توقفگاه تب (tab stop) است. بازنماییهای متعددی در یک «جدول بازنمایی» (render table) با یکدیگر ترکیب میشوند، که از طریق منبع XmNrenderTable و در فهرست controls ویجت برای هر ویجتی مشخص میگردد.
زبان UIL جدولهای بازنمایی، بازنماییها، فهرستهای تب (tab lists) و توقفگاههای تب (tab stops) را به عنوان ردهای ویژه از اشیاء، در قالبی شبیه به رده ویجت پیادهسازی میکند. این اشیاء خود ویجت یا گجت نیستند، اما قالبی که توسط UIL برای تعیین منابع ویجت استفاده میشود، روشی مناسب برای تعیین ویژگیها و وابستگیهای این اشیاء فراهم میآورد.
برای مثال، یک جدول بازنمایی که در فهرست controls یک ویجت گنجانده شده است، باید خود نیز دارای یک فهرست controls در مشخصات خود باشد که دربردارنده نام بازنماییهای عضو آن است. هر بازنمایی در مشخصات خود، دارای فهرست arguments خواهد بود که ویژگیهایی نظیر قلم، رنگ، و زیرخطدار بودن متن را مشخص میسازد. هر یک از بازنماییها ممکن است یک tablist را نیز کنترل کنند، که آن هم به نوبه خود یک یا چند توقفگاه تب را کنترل خواهد کرد.
لطفاً برای شرح کامل بازنماییها و جدولهای بازنمایی، و مشاهده مثالی از چگونگی استفاده از آنها در UIL، به Motif Programmer's Guide مراجعه کنید.