| FVWMSCRIPT(1) | FVWMSCRIPT(1) |
نام (NAME)
FvwmScript - ماژولی برای ساخت واسط گرافیکی کاربر
خلاصه دستور (SYNOPSIS)
دستور FvwmScript باید توسط Fvwm فراخوانی و اجرا شود. این برنامه از خط فرمان کار نخواهد کرد.
توضیحات (DESCRIPTION)
ماژول FvwmScript به شما امکان میدهد برنامههای گرافیکی متعددی از قبیل ابزارهای جانبی دسکتاپ، پنلهای دکمه با منوهای بازشو، پنجرههای محاورهای مُدال و غیره را ایجاد کنید. در زمان راهاندازی، FvwmScript فایلی را که در خط فرمان مشخص شده میخواند. این فایل حاوی اسکریپت است و در فایل پیکربندی اصلی Fvwm گنجانده نمیشود.
اسکریپتهای FvwmScript کاملاً از طریق صفحهکلید قابل کنترل هستند. کلیدهای (Shift)-Tab میان ویجتها پیمایش میکنند، Return یک کلیک ماوس را شبیهسازی میکند، کلیدهای جهتنما مکاننما را جابهجا کرده یا مقادیر ویجت را تغییر میدهند، و Escape برای Menu و PopupMenu عمل "انصراف" را انجام میدهد.
فراخوانی (INVOCATION)
ماژول FvwmScript را میتوان با درج خط `Module FvwmScript name_of_script' در فایل .fvwm2rc فراخوانی کرد. نام فایل "name_of_script" میتواند با یک اسلش آغاز شود که در این حالت یک مسیر کامل (مطلق) است و فایل مستقیماً خوانده میشود. اگر "name_of_script" با اسلش شروع نشود، FvwmScript در چند مکان مختلف جستجو خواهد کرد. اگر فایل .fvwm2rc حاوی خط فرمان `*FvwmScript: Path path_of_the_script_directory' باشد، FvwmScript آن دایرکتوری را امتحان میکند. اگر آن هم کار نکرد، FvwmScript دایرکتوری پیکربندی سیستم و دایرکتوری پیکربندی کاربر را مطابق با توضیحات دستور "Read" در صفحه راهنمای fvwm جستجو خواهد کرد.
دستور شروع FvwmScript میتواند روی یک خط جداگانه قرار گیرد (در صورتی که قرار باشد FvwmScript هنگام مقداردهی اولیه fvwm راهاندازی شود)، یا میتوان آن را به یک منو، دکمه ماوس یا کلید میانبر متصل کرد تا بعداً فراخوانی شود.
گزینههای پیکربندی (CONFIGURATION OPTIONS)
دستورات زیر را میتوان در فایل پیکربندی استفاده کرد (برای جزئیات بیشتر به بخش MODULE COMMANDS در fvwm(1) مراجعه کنید). این دستورات فقط در صورتی اعمال میشوند که دستورات معادل آنها درون اسکریپت به کار نرفته باشند.
*FvwmScript: DefaultFont font
*FvwmScript: DefaultFore color
*FvwmScript: DefaultBack color
*FvwmScript: DefaultHilight color
*FvwmScript: DefaultShadow color
*FvwmScript: DefaultColorset colorset
*FvwmScript: DefaultCursor cursor
ساختار اسکریپت (ANATOMY OF A SCRIPT)
ماژول FvwmScript از یک زبان برنامهنویسی ویژه استفاده میکند. هر اسکریپت از پنج بخش تشکیل شده است. بخش سرآیند (Heading) ویژگیهای عمومی پنجره و مشخصات پیشفرض تمام ویجتها را شامل میشود. بخش دوم شامل دستورالعملهایی است که در هنگام راهاندازی اسکریپت اجرا میشوند. بخش سوم شامل وظایف دورهای است که هر ثانیه یکبار اجرا میشوند. بخش چهارم شامل دستورالعملهایی است که هنگام خروج اجرا میگردند. و بخش پایانی شامل توصیف ویجتها است. ویجتها شامل یازده نوع آیتم هستند: برچسبهای متنی، ورودیهای متنی تکخطی، دکمههای رادیویی، جعبههای انتخاب، دکمههای فشاری، نوارهای پیمایش افقی و عمودی، مستطیلها، منوهای بازشو، swallowexecها و نوارهای پیمایش کوچک (mini scrollbars).
سرآیند اسکریپت (HEADING OF A SCRIPT)
نحو به صورت زیر است:
WindowTitle string
WindowSize width height
WindowPosition x y
ForeColor {color}
BackColor {color}
HilightColor {color}
ShadowColor {color}
Colorset {n}
Font {font}
UseGettext [locale_path]
WindowLocaleTitle string
مقداردهی اولیه (INITIALISATION)
این بخش شامل دستورالعملهایی است که در هنگام راهاندازی اجرا خواهند شد. به عنوان مثال:
Init Begin Do "Exec cat tada.voc > /dev/dsp" WarpPointer 1 Set $ToDo=Restart End
این دستورالعملها برای پخش یک صدا، انتقال مکاننما به ویجت ۱ و مقداردهی اولیه متغیر ToDo$ به مقدار "Restart" در هر راهاندازی استفاده میشوند.
وظایف دورهای (PERIODIC TASKS)
این بخش از اسکریپت شامل دستورالعملهایی است که هر ثانیه یکبار اجرا میشوند. به عنوان مثال:
PeriodicTasks
Begin
If (RemainderOfDiv (GetTime) 10)==0 Then
Do {Exec xcalc}
End
این مثال نشان میدهد که چگونه میتوان xcalc را هر ۱۰ ثانیه یکبار اجرا کرد.
تابع خروج (THE QUIT FUNCTION)
این بخش از اسکریپت شامل دستورالعملهایی است که هنگام خروج اسکریپت اجرا میشوند (پس از دستورالعمل Quit یا در صورتی که پنجره را با دستورات Close، Delete یا Destroy در fvwm ببندید). به عنوان مثال:
QuitFunc
Begin
Do {Echo bye, bye}
End
توجه داشته باشید که اگر از دستور fvwm به نام KillModule برای بستن اسکریپت استفاده کنید، برخی دستورالعملها یا توابعی که به وجود پیوند ارتباطی میان اسکریپت و fvwm متکی هستند اجرا نخواهند شد (به عنوان مثال دستور Do). برای خاتمه دادن آرام و بینقص یک اسکریپت با دستور fvwm به بخش دستورات (COMMANDS) مراجعه کنید.
بخش اصلی اسکریپت (MAIN OF A SCRIPT)
بخش اصلی اسکریپت حاوی توصیف تکتک ویجتهای موجود در اسکریپت است. توصیف هر ویجت دو بخش دارد: بخش اول ویژگیهای اولیه را توصیف میکند و بخش دوم شامل دستورالعملهایی است که هنگام دریافت پیامها توسط ویجت اجرا میشوند. تمام ویجتها میتوانند پیام ارسال و دریافت کنند. همه پیامها با یک شماره مشخص میشوند. پیام "UserAction" هنگامی که کاربر با ویجت کار میکند برای آن ارسال میشود. نحو بخش اول به صورت زیر است:
Widget id # A number between 1 and 999 inclusive
Property
Type string
Size width height
Position x y
Title { string }
Value int
MaxValue int
MinValue int
Font string
ForeColor { color }
BackColor { color }
HilightColor { color }
ShadowColor { color }
Colorset int
Flags flagsOpt
گزینه flagsOpt برای ویژگی Flags یک فهرست با فاصله است که شامل یک یا چند کلمه کلیدی Hidden، NoReliefString، NoFocus، Left / Center / Right است. کلیدواژه Hidden برای مشخص کردن مخفی بودن ویجت در هنگام راهاندازی به کار میرود. کلیدواژه NoReliefString مشخص میکند که آیا رشتهها با برجستگی ترسیم شوند یا خیر. کلیدواژه NoFocus مشخص میکند که آیا ویجت میتواند فوکوس صفحهکلید را دریافت کند یا خیر. بهطور پیشفرض همه ویجتها فوکوس میگیرند، به جز Rectangle، HDipstick و VDipstick که نمیتوانند فوکوس دریافت کنند. به علاوه، ویجتهای دارای NoFocus هنگام پیمایش میان ویجتها با کلید میانبر (Shift-)Tab نادیده گرفته میشوند. کلیدواژههای Left / Center / Right موقعیت قرارگیری متن را مشخص میکنند. این گزینهها تنها برای ItemDraw، List، Menu، PopupMenu و PushButton کاربرد دارند. حالت پیشفرض برای ItemDraw و PushButton برابر با Center و برای سایر ویجتها برابر با Left است.
میتوان از LocaleTitle بهجای Title برای استفاده از کاتالوگ(های) بومیسازی تعریفشده با UseGettext استفاده کرد.
موقعیت هر ویجت باید مشخص شود.
نحو بخش دوم به صورت زیر است:
Main
Case message of
SingleClic:
Begin
# list of instructions which will be
# executed when widget receives
# message "SingleClic". This message is
# generated by the user.
End
1 :
Begin
# list of instructions which will be
# executed when widget receives
# message 1
End
End
فهرست ویجتها (LIST OF WIDGETS)
پانزده نوع ویجت وجود دارد.
CheckBox: نمایش جعبه علامتزدنی (چکباکس) به همراه یک رشته.
Value: اگر Value برابر با 1 باشد، جعبه علامت زده شده و در غیر این صورت علامت نخورده است.
ویژگی Size نادیده گرفته میشود.
HDipstick: نمایش یک نشانگر اندازهگیری افقی (dipstick).
Value: مشخص کردن مقدار جاری نشانگر.
MinValue: مشخص کردن مقدار کمینه نشانگر.
MaxValue: مشخص کردن مقدار بیشینه نشانگر.
حداقل اندازه 30x11 اعمال میشود.
HScrollBar: نمایش یک نوار پیمایش افقی.
MaxValue: حد بالای Value.
MinValue: حد پایین Value.
ویژگی ارتفاع نادیده گرفته میشود و حداقل عرضی اعمال میگردد. در صورتی که قرار باشد همه مقادیر قابل انتخاب باشند، عرض باید حداقل به اندازه بازه به علاوه ۳۷ باشد؛ به عنوان مثال کمینه ۰ و بیشینه ۱۰ دارای بازه ۱۱ است و بنابراین باید حداقل عرض ۴۸ داشته باشد.
ItemDraw: نمایش یک آیکون و/یا یک رشته.
Icon: آیکونی که باید نمایش داده شود.
MaxValue: مختصات x مکاننما.
MinValue: مختصات y مکاننما.
اندازه به اندازه کافی بزرگ در نظر گرفته میشود تا عنوان و/یا آیکون را در خود جای دهد.
List: نمایش یک فهرست.
Value: مشخص میکند کدام گزینه انتخاب شده است.
MinValue: اولین گزینه قابل مشاهده.
Title: عنوان حاوی گزینههای نمایش داده شده در فهرست است. نحو به صورت زیر است: {Option 1|Option 2|...|Option N}. همه منوها در بالای پنجره نمایش داده میشوند.
حداقل ارتفاع سه آیتم اعمال میشود و عرض آن حداقل ۱۰۸ در نظر گرفته میشود.
Menu: نمایش منویی که به کاربر اجازه میدهد یک گزینه را انتخاب کند.
Value: مشخص میکند کدام گزینه انتخاب شده است.
Title: عنوان شامل گزینههای نمایش داده شده در منو است. نحو به صورت زیر است: {Option 1|Option 2|...|Option N}.
MiniScroll: نمایش یک نوار پیمایش عمودی بسیار کوچک.
MaxValue: حد بالای Value.
MinValue: حد پایین Value.
اندازه بر روی 19x34 تنظیم شده است.
PopupMenu: نمایش یک منوی بازشو.
Title: عنوان دارای نحو زیر است: {Option 1|Option 2|...|Option N}. بخش "Option 1|Option 2|...|Option N" همان منوی بازشویی است که هنگام فشردن دکمه ماوس نمایش داده میشود.
ویژگی اندازه نادیده گرفته میشود.
PushButton: نمایش دکمه فشاری همراه با یک آیکون و/یا یک رشته.
Icon: آیکونی که باید نمایش داده شود.
دکمه به اندازهای بزرگ ساخته میشود که آیکون یا برچسب را در خود جای دهد.
RadioButton: نمایش دکمه رادیویی همراه با یک رشته.
Value: اگر Value برابر با 1 باشد، دکمه انتخاب شده است، در غیر این صورت انتخاب نشده است.
ویژگی اندازه نادیده گرفته میشود.
Rectangle: نمایش یک مستطیل.
SwallowExec
Title: نام پنجرهای را که باید ضبط شده و در پنجره اسکریپت نمایش داده شود مشخص میکند.
SwallowExec: خط فرمانی را که برای ایجاد پردازش باید اجرا شود مشخص میکند. ماژولها را نیز میتوان به دام انداخت.
Value: ظاهر حاشیه را مشخص میکند. مقادیر ممکن: -1، 0، 1.
اندازه حداقل به میزان 30x30 تنظیم میشود.
TextField: نمایش یک کادر ورودی متن.
Title: محتوای کادر متن.
Value: موقعیت نقطه درج (مکاننما).
MinValue: موقعیت انتهای بخش انتخابشده.
MaxValue: اولین نویسه قابل مشاهده عنوان.
ویژگی ارتفاع نادیده گرفته میشود و عرض حداقل ۴۰ پیکسل عریضتر از محتوای اولیه در نظر گرفته میشود.
VDipstick: نمایش یک نشانگر اندازهگیری عمودی (dipstick).
MinValue: مقدار کمینه نشانگر را مشخص میکند.
MaxValue: مقدار بیشینه نشانگر را مشخص میکند.
اندازه حداقل 11x30 در نظر گرفته میشود.
VScrollBar: نمایش یک نوار پیمایش عمودی.
MaxValue: حد بالای Value.
MinValue: حد پایین Value.
ویژگی عرض نادیده گرفته میشود و حداقل ارتفاعی اعمال میگردد. در صورتی که قرار باشد همه مقادیر قابل انتخاب باشند، ارتفاع باید حداقل به اندازه بازه به علاوه ۳۷ باشد؛ به عنوان مثال کمینه ۰ و بیشینه ۱۰ دارای بازه ۱۱ است و بنابراین باید حداقل ارتفاع ۴۸ داشته باشد.
دستورالعملها (INSTRUCTIONS)
در اینجا توصیف تمام دستورالعملها آورده شده است.
HideWidget id : مخفی کردن ویجت شماره id.، ShowWidget id: نمایش ویجت شماره id.، ChangeValue id1 id2
ChangeMaxValue id1 id2
ChangeMinValue id1 id2
ChangeTitle id1 id2
ChangeWindowTitle string
ChangeWindowTitleFromArg numarg
ChangeLocaleTitle id1 id2
ChangeIcon id1 id2
ChangeForeColor id1 {color}
ChangeBackColor id1 {color}
ChangeColorSet id1 id2
ChangePosition id1 x y
ChangeSize id1 width height
ChangeFont id1 newfont
WarpPointer id
WriteToFile filename {str1} {str2} etc
Do {command args}
Set $var={str1} {str2} etc
Quit: خروج از برنامه.، SendSignal id1 id2
SendToScript id_script {str11} {str2} etc
Key Keyname Modifier id sig str1 str2 etc
SendSignal id sig
و "رشته اخیر" را به حاصل الحاق str1، str2 و غیره تنظیم میکند (به تابع LastString مراجعه کنید). فیلدهای Keyname و Modifiers همانند دستور Key در fvwm تعریف میشوند.
آرگومانها (ARGUMENTS)
بیشتر دستورات از آرگومانها استفاده میکنند. دو نوع آرگومان وجود دارد: اعداد و رشتهها. یک آرگومان عددی مقداری میان ۳۲۰۰۰- تا ۳۲۰۰۰+ است. یک رشته همیشه با آکلاد محصور میشود. متغیرها همواره با نویسه "$" آغاز میشوند و میتوانند هم شامل اعداد و هم رشتهها باشند.
توابع (FUNCTIONS)
همه توابع از آرگومانها استفاده میکنند. توابع میتوانند هم رشته و هم عدد بازگردانند. نحو آنها به صورت زیر است: (function argument1 argument2 etc)
در اینجا فهرست کامل توابع آورده شده است:
(GetTitle id)
(GetValue id)
(GetMinValue id)
(GetMaxValue id)
(GetFore id)
(GetBack id)
(GetHilight id)
(GetShadow id)
(GetOutput {str} int1 int2)
(NumToHex int)
(HexToNum {str})
(Add int1 int2)
(Mult int1 int2)
(Div int1 int2)
(StrCopy {str} int1 int2)
(LaunchScript {str})
(GetScriptArgument {int})
(GetScriptFather)
(ReceivFromScript {int})
(RemainderOfDiv {int1 int2}): t
(GetTime)
(GetPid)
(Gettext {str})
(SendMsgAndGet {comId} {cmd} bool)
(Parse {str} int)
جایی که Xnها اعدادی شامل چهار رقم دهدهی هستند و Snها رشتههایی با طول دقیقاً برابر با Xn میباشند. مقدار بازگشتی رشته Sint است. اگر int خارج از محدوده باشد (مثلاً n<)، مقدار بازگشتی یک رشته خالی است. اگر str به فرمت مشخصشده نباشد، مقدار بازگشتی غیرقابل پیشبینی خواهد بود (اما معمولاً خالی است). این تابع برای پردازش رشتههای بازگرداندهشده توسط تابع SendMsgAndGet کاربرد دارد.
(LastString)
حلقههای شرطی (CONDITIONAL LOOPS)
سه نوع حلقه شرطی وجود دارد. دستورالعمل "If-Then-Else" دارای نحو زیر است:
If $ToDo=={Open xcalc} Then
Do {Exec xcalc &} # List of instructions
Else
Begin
Do {Exec killall xcalc &} # List of instructions
Do {Exec echo xcalc killed >/dev/console}
End
بخش دوم "Else-Begin-End" اختیاری است. اگر حلقه تنها شامل یک دستورالعمل باشد، میتوان Begin و End را حذف کرد. دستورالعمل "While-Do" دارای نحو زیر است:
While $i<5 Do Begin Set $i=(Add i 1) # List of instructions End
دو رشته را میتوان با "==" و دو عدد را با "<"، "⇐"، "=="، ">="، ">" مقایسه کرد. حلقه "For-Do-Begin-End" دارای نحو زیر است:
For $i=1 To 20 Do
Begin
Do {Exec xcalc &} # List of instructions
End
دستورات (COMMANDS)
دستور fvwm زیر ممکن است در هر زمانی اجرا شود:
SendToModule ScriptName SendString id sig str
این دستور رشته زیر را به هر ماژولی با نام یا نام مستعار منطبق بر ScriptName ارسال میکند:
SendString id sig str
هنگامی که یک FvwmScript چنین پیامی را دریافت میکند، سیگنالی با شماره sig را به ویجت id ارسال میکند و رشته str را میتوان با تابع LastString به دست آورد. بگذارید یک مثال بزنیم. فرض کنید اسکریپتی به نام MyScript با ویجت زیر دارید:
Widget 50
Property
Type PushButton
Title {Quit}
...
Main
Case message of
SingleClic:
Begin
Quit
End
1 :
Begin
Set $str = (LastString)
If $str == {Quit} Then
Quit
Else
ChangeTitle 33 $str
End
End
سپس دستور
SendToModule MyScript SendString 50 1 str
در صورتی که str برابر با "Quit" باشد اسکریپت MyScript را مجبور به خروج میکند و در غیر این صورت عنوان ویجت ۳۳ را به str تغییر میدهد.
این دستور میتواند برای تغییر عنوان پنجره استفاده شود:
SendToModule ScriptName ChangeWindowTitle newTitle [oldTitle]
این دستور باعث میشود که هر ماژولی با نام مستعار یا نامی منطبق بر ScriptName عنوان پنجره مرتبط با خود را به newTitle تغییر دهد. آرگومان اختیاری oldTitle زمانی کاربرد دارد که چندین نمونه از یک اسکریپت در حال اجرا باشند. این آرگومان با مشخص کردن نام پنجره مرتبط با اسکریپت هدف، مانع از تغییر نام تمام این نمونهها میشود (به مثال زیر توجه کنید).
+ I Module FvwmScript FvwmStorageSend "/dev/hda6" + I Wait FvwmStorageSend + I SendToModule FvwmStorageSend ChangeWindowTitle HDA6 + I Module FvwmScript FvwmStorageSend "/dev/hda1" + I Wait FvwmStorageSend + I SendToModule FvwmStorageSend ChangeWindowTitle HDA1 FvwmStorageSend
در آخرین مورد، بدون آرگومان FvwmStorageSend، دستور SendToModule نام هر دو نمونه FvwmStorageSend را به HDA1 تغییر میداد.
مثالها (EXAMPLES)
نمونههایی از اسکریپتها را در دایرکتوری پیکربندی fvwm خواهید یافت.
اسکریپتهای FvwmScript-BellSetup، FvwmScript-KeyboardSetup، FvwmScript-PointerSetup و FvwmScript-ScreenSetup مجموعهای از اسکریپتها هستند که تنظیمات X را تغییر میدهند. این اسکریپتها ترجیحات را در فایلی به نام ~/.xinit-fvwmrc ذخیره میکنند (اگر میخواهید از نام فایل دیگری استفاده کنید، آن را به عنوان اولین آرگومان اسکریپت بدهید). اگر میخواهید این ترجیحات در هر بار راهاندازی بارگذاری شوند، باید خط ".xinit-fvwmrc" را در فایل .xinitrc (یا .xsession) خود پیش از شروع fvwm بگنجانید.
اسکریپت FvwmScript-BaseConfig خطمشیهای ماوس برای فوکوس و صفحهبندی fvwm، جایگذاری پنجرهها، شفافیت (opacity) و سایر ویژگیهای دستورات move و resize، چسبندگی (snap attraction) و پویانمایی سایهروشن را تغییر میدهد. این اسکریپت ترجیحات را در فایلی به نام .FvwmBaseConfig در دایرکتوری دادههای کاربر (یعنی HOME/.fvwm$ یا FVWM_USERDIR$ در صورت تنظیم شدن) ذخیره میکند. اگر میخواهید این ترجیحات در هر بار راهاندازی بارگذاری شوند، باید خط "Read .FvwmBaseConfig" را به فایل پیکربندی fvwm خود اضافه کنید. اگر میخواهید از نام فایل دیگری استفاده کنید، آن را به عنوان اولین آرگومان اسکریپت وارد کنید. هنگامی که روی Ok یا Apply کلیک میکنید، یک تابع fvwm که ممکن است با نام BaseConfigOkFunc یا BaseConfigApplyFunc تعریف کرده باشید فراخوانی میشود. این امر امکان بارگذاری مجدد استایلهای خاص برنامهها را که ممکن است اسکریپت تغییر داده باشد فراهم میکند (مثلاً AddToFunc BaseConfigOkFunc I Read MyAppStyle).
اسکریپت FvwmScript-Buttons یک پنل دکمهها است که میتواند جایگزین FvwmButtons شود (این اسکریپت از منوهای بازشو پشتیبانی کرده و به xload، xclock، FvwmPager، TkDesk نیاز دارد). اسکریپت FvwmScript-Colorset به شما امکان ویرایش مجموعه رنگها را میدهد. اسکریپت FvwmScript-Date امکان تنظیم تاریخ و ساعت را فراهم میکند. اسکریپت FvwmScript-FileBrowser یک مرورگر فایل است که توسط اسکریپتهای دیگر استفاده میشود. اسکریپت FvwmScript-Find یک رابط ساده برای find است. اسکریپت FvwmScript-Quit به کاربر امکان خروج از fvwm، راهاندازی مجدد fvwm یا یک مدیر پنجره دیگر، یا خاموش کردن و راهاندازی مجدد رایانه را میدهد. اسکریپت FvwmScript-ScreenDump یک ابزار ثبت تصویر صفحه نمایش است. اسکریپت FvwmScript-WidgetDemo یک اسکریپت نمونه کامل است. برای FvwmScript-ComExample به بخش بعدی مراجعه کنید.
پروتکل ارتباطی (A COMMUNICATION PROTOCOL)
زبان FvwmScript یک زبان برنامهنویسی ساده (و با امکانات محدود) است. اگر لازم است با حجم بالایی از دادهها کار کنید یا نیاز به استفاده از الگوریتمهای پیچیده دارید، بهتر است از یک برنامه خارجی (مثلاً به زبان perl) استفاده کنید و اطلاعات مورد نیاز را به اسکریپت FvwmScript خود "ارسال" نمایید. اولین رویکرد استفاده از تابع GetOutput است. این روش ساده است اما باید هر بار که به اطلاعات نیاز دارید برنامه خارجی را دوباره اجرا کنید (که ممکن است مشکلات کارایی ایجاد کند). رویکرد دوم استفاده از تابع SendMsgAndGet است که با بهرهگیری از هر زبان برنامهنویسی که بتواند با لولههای نامگذاریشده (fifos) کار کند، FvwmScript را گسترش میدهد. ما این راهحل را در این بخش توصیف میکنیم. (رویکرد سوم استفاده از fvwm-themes-com از بسته fvwm-themes است، اما در واقع متد SendMsgAndGet پیادهسازی fvwm-themes-com درون خود FvwmScript است و کارایی بهتری ارائه میدهد).
به طور کلی، شما یک برنامه "خارجی" (به اختصار، برنامه) را از درون اسکریپت FvwmScript خود (به اختصار، اسکریپت) راهاندازی میکنید. این برنامه در پسزمینه اجرا میشود و شما از تابع SendMsgAndGet در اسکریپت خود برای پرسیدن سوال یا ارسال دستورالعمل به برنامه استفاده میکنید. برنامه باید دقیقاً یک پروتکل ارتباطی معین را رعایت کند. در وهله اول، یک شناسه comId برای ارتباط وجود دارد که برای پیادهسازی مناسب پروتکل باید حاوی شناسه پردازش اسکریپت باشد (از تابع GetPid استفاده کنید و comId را از طریق یک گزینه به برنامه پاس دهید). این پروتکل از دو fifo در دایرکتوری کاربر fvwm با نامهای .tmp-com-in-comId و .tmp-com-out-comId استفاده میکند. برنامه باید روی fifo با نام .tmp-com-in-comId گوش فرا دهد. سپس، هنگامی که FvwmScript تابعی به صورت زیر را اجرا میکند:
Set $answer = (SendMsgAndGet {comId} {cmd} bool)
ماژول FvwmScript مقدار cmd را روی این fifo مینویسد. بدین ترتیب برنامه میتواند cmd را بخواند و عملیات مناسب را اجرا کند (برنامه باید fifo ورودی را حذف کند تا از ارتباطات چندگانه پشتیبانی شود). اگر bool برابر با 0 باشد، FvwmScript منتظر پاسخی از برنامه نمیماند و در صورت موفقیت اقدامات قبلی مقدار 1 و در صورت شکست مقدار 0 را بازمیگرداند (سپس برنامه باید به fifo ورودی بازگردد). اگر bool برابر با 1 باشد، FvwmScript مدت ۲۰ ثانیه منتظر پاسخ از برنامه میماند و در عوض پاسخ را به اسکریپت بازمیگرداند (توجه داشته باشید که bool به برنامه پاس داده نمیشود زیرا خود برنامه باید بداند کدام دستورات نیاز به پاسخ دارند). برای پاسخ دادن، برنامه fifo با نام .tmp-com-out-comId را ایجاد کرده و پاسخ را روی آن مینویسد. برنامه باید منتظر بماند تا FvwmScript پاسخ را بخواند و سپس باید fifo خروجی را حذف کرده و به fifo ورودی بازگردد. پاسخ باید شامل یک خط با حداکثر ۳۲۰۰۰ نویسه باشد (برای مدیریت چندین خط به عنوان یک خط، به تابع Parse نگاه کنید).
یک راه ساده برای درک این پروتکل و نوشتن اسکریپتها و برنامههایی که از آن استفاده میکنند، نگاه کردن به نمونههای FvwmScript-ComExample و fvwm-script-ComExample.pl است (که در دایرکتوری دادههای fvwm یافت میشوند). علاوه بر این، این پیادهسازی پروتکل به پرسشهایی مانند: اگر اسکریپت به دلیل نامناسبی متوقف شود چه باید کرد؟ اگر برنامه به دلیل نامناسبی متوقف شود چه باید کرد؟ و... پاسخ میدهد.
اشکالات (BUGS)
اگر به ویجتهایی که تعریف نشدهاند دسترسی پیدا شود، FvwmScript متوقف میشود (crash میکند).
نویسنده (AUTHOR)
Frederic Cordier ( <cordie97@cui.unige.ch> or <f-cord96@univ-lyon1.fr>).
مشارکتکننده (CONTRIBUTOR)
Eddy J. Gurney ( <eddy@gizmo.aa.ans.net>).
| 2026-06-28 |