Arcan เป็นเฟรมเวิร์กการพัฒนาที่ทรงพลังสำหรับการสร้างแทบทุกอย่างตั้งแต่อินเทอร์เฟซผู้ใช้สำหรับแอปพลิเคชันแบบฝังตัวเฉพาะทางไปจนถึงสภาพแวดล้อมเดสก์ท็อปแบบสแตนด์อโลนเต็มรูปแบบ
หัวใจสำคัญของมันคือเอ็นจิ้นมัลติมีเดียที่แข็งแกร่งและพกพาได้ พร้อมด้วยอินเทอร์เฟซการเขียนสคริปต์ Lua ที่ได้รับการทดสอบอย่างดีและมีเอกสารประกอบอย่างดี การพัฒนาเน้นความปลอดภัย ความสามารถในการแก้ไขจุดบกพร่อง และประสิทธิภาพ โดยยึดหลักการที่สร้างความประหลาดใจน้อยที่สุดในแง่ของการออกแบบ API
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับความสามารถ การออกแบบ เป้าหมาย การพัฒนาในปัจจุบัน แผนงาน บันทึกการเปลี่ยนแปลง หมายเหตุเกี่ยวกับการมีส่วนร่วม และอื่นๆ โปรดดูที่ arcan-wiki
นอกจากนี้ยังมีเว็บไซต์ที่รวบรวมลิงค์ ประกาศ ข่าวประชาสัมพันธ์ วีดีโอ/การนำเสนอ และอื่นๆ อีกมากมาย
สำหรับการติดต่อกับชุมชน โปรดดูช่อง IRC #arcan บน irc.libera.chat และ/หรือ Discord (ลิงก์เชิญ)
สำหรับข้อมูลนักพัฒนา โปรดดูที่ HACKING.md
พื้นที่เก็บข้อมูล GitHub กำลังจะยุติลงเนื่องจากการกระทำที่ไม่เหมาะสมของ Microsoft และด้วยเหตุนี้เราจึงย้ายไปยัง Fossil ที่โฮสต์เอง พื้นที่เก็บข้อมูลจะซิงค์กับ GitHub ในขณะนี้ แต่ไม่มีกิจกรรมการพัฒนาที่ใช้งานอยู่ ดูฟอสซิล.arcan-fe.com
การกระจายบางอย่าง เช่น voidlinux มี arcan ส่วนใหญ่เป็นส่วนหนึ่งของแพ็คเกจ ดังนั้นคุณจึงสามารถช่วยตัวเองให้ทำงานบางอย่างกับหนึ่งในนั้นได้ ส่วนอื่นๆ ที่มีชุมชนที่กระตือรือร้นก็จะผ่าน Nix (เช่น: nix-shell -p arcan.all-wrapped)
คุณสามารถดูเทมเพลตคอนเทนเนอร์ Docker (ส่วนใหญ่ใช้สำหรับการพัฒนาและการทดสอบแบบไม่มีส่วนหัว) ได้ที่นี่ คุณภาพจะแตกต่างกันไปอย่างมากจากแย่ไปจนถึงแย่ (เช่นเดียวกับ Docker): dockerfiles
มีหลายวิธีในการปรับแต่งขั้นตอนการสร้างเพื่อลดการขึ้นต่อกัน มีวิธีอีกมากมายในการกำหนดค่าและรวมส่วนประกอบต่างๆ ขึ้นอยู่กับสิ่งที่คุณต้องการ ทำงานเป็นเดสก์ท็อปดั้งเดิมหรือเป็นรันไทม์ของแอปพลิเคชันภายในเดสก์ท็อปอื่นหรือไม่
ตัวเลือกส่วนใหญ่เปิดเผยผ่านเอาต์พุตของ build จากการรัน cmake บนไดเร็กทอรี src
เพื่อความเรียบง่ายเกินขนาด จึงได้มีการสร้างพรีเซ็ต 'ทุกอย่าง' ซึ่งเป็นสิ่งที่เราจะใช้ที่นี่
ชื่อแพ็คเกจเฉพาะขึ้นอยู่กับการแจกจ่ายของคุณ แต่ชื่อทั่วไปคือ:
sqlite3, openal-soft, sdl2, opengl, luajit, gbm, kms, freetype, harfbuzz
libxkbcommon
สำหรับตัวเลือกการเข้ารหัสและถอดรหัสเพิ่มเติม คุณอาจต้องการ:
libvlc-core (videolan), the ffmpeg suite, leptonica + tesseract (ocr)
libvncserver libusb1, v4l2-loopback, mupdf
ก่อนอื่น เราต้องการการขึ้นต่อกันในแหล่งที่มาซึ่งถูกโคลนด้วยตนเองในตอนนี้:
git clone https://github.com/letoram/arcan.git
cd arcan/external/git
./clone.sh
cd ../../
โดยทั่วไปสิ่งเหล่านี้ไม่จำเป็น การใช้งานหลักคือเพื่อให้แน่ใจว่าตัวเลือกการสร้างบางอย่างอาจแตกต่างกันระหว่างการแจกแจง (luajit) และเพื่อให้แน่ใจว่าเดสก์ท็อปที่กู้คืนได้สามารถเชื่อมโยงและดำเนินการแบบคงที่ในพื้นที่ผู้ใช้ที่ใช้งานไม่ได้ (เช่น การนำการฝังตัวมา) ข้อยกเว้นประการหนึ่งคือ OpenAL ซึ่งได้รับการแพตช์เพื่อใช้โดยบิลด์พิเศษ (arcan-lwa) สิ่งนี้ถูกกำหนดไว้สำหรับการปรับโครงสร้างใหม่เพื่อลบการพึ่งพานั้นออก แต่ก็มีลำดับความสำคัญอื่น ๆ ขวางอยู่
ตอนนี้เราสามารถกำหนดค่าและสร้างเอ็นจิ้นหลักได้แล้ว:
mkdir build
cd build
cmake -DBUILD_PRESET="everything" ../src
เช่นเดียวกับโปรเจ็กต์ที่ใช้ CMake อื่นๆ คุณสามารถเพิ่ม:
-DCMAKE_BUILD_TYPE=Debug
เพื่อเปลี่ยนจากรุ่น release ไปเป็นรุ่น debug
เมื่อตรวจสอบการขึ้นต่อกันเสร็จแล้ว คุณจะได้รับรายงานว่าพบการขึ้นต่อกันใดบ้างและฟีเจอร์ใดที่ถูกเปิด/ปิด หรือแจ้งเตือนคุณหากไม่พบการขึ้นต่อกันที่จำเป็นบางรายการ
สร้างและติดตั้งเหมือนปกติ (เช่น make, sudo make install) มีการสร้างไบนารีขึ้นมาจำนวนหนึ่ง โดยที่ 'หลัก' ที่ถูกเรียกว่าอาร์คาน หากต้องการทดสอบ 'ในแหล่งที่มา' (โดยไม่ต้องติดตั้ง) คุณควรจะสามารถเรียกใช้:
./arcan -T ../data/scripts -p ../data/resources ../data/appl/welcome
อาร์กิวเมนต์ -T ตั้งค่าชุดสคริปต์ในตัว/ที่ใช้ร่วมกันของเรา -p ซึ่งสามารถพบได้ทรัพยากรที่ใช้ร่วมกัน เช่น แบบอักษรและอื่นๆ และอาร์กิวเมนต์สุดท้ายคือ 'สคริปต์' จริงที่จะเรียกใช้
เมื่อติดตั้งแล้ว สิ่งนี้ควรลดลงเป็น:
arcan welcome
ระบบจะพยายามคิดโดยอัตโนมัติว่าควรเป็นเซิร์ฟเวอร์แสดงผลแบบเนทิฟหรือทำงานซ้อนกันภายในเซิร์ฟเวอร์อื่นหรือแม้แต่ตัวมันเองโดยขึ้นอยู่กับการมีอยู่ของตัวแปรสภาพแวดล้อมต่างๆ (DISPLAY, WAYLAND_DISPLAY, ARCAN_CONNPATH)
'ยินดีต้อนรับ' เป็นชื่อของหน้าจอต้อนรับในตัวที่เรียบง่าย ซึ่งจะปิดตัวลงโดยอัตโนมัติหลังจากผ่านไปไม่กี่วินาที
สำหรับสิ่งที่มีประโยชน์โดยตรงมากกว่านั้น คุณสามารถลองใช้ 'console' ของ appl ในตัว:
arcan console
ซึ่งควรทำงานเหมือนกับบรรทัดคำสั่งคอนโซลปกติของคุณ แต่เพิ่มความสามารถในการเรียกใช้แอปพลิเคชันกราฟิก (เข้ากันได้กับ arcan) เช่นกัน สำหรับโครงการอื่นๆ โปรดดู 'โครงการที่เกี่ยวข้อง' เพิ่มเติมด้านล่าง
หากอุปกรณ์อินพุตทำงานผิดปกติ 'การทดสอบเหตุการณ์' ที่รวดเร็วและสกปรกใน:
arcan /path/to/arcan/tests/interactive/eventtest
อาจจะมีประโยชน์ในการหาว่าใครจะตำหนิ
ไบนารี 'arcan' ของแพลตฟอร์ม egl-dri ที่สร้างขึ้นจะติดตั้ง suid ตามค่าเริ่มต้น สิ่งนี้ไม่จำเป็นอย่างเคร่งครัด เว้นแต่ต้องการคุณสมบัติเฉพาะบางอย่าง เช่น การควบคุมแบ็คไลท์ของแล็ปท็อปบน Linux เนื่องจากจำเป็นต้องเข้าถึง sysfs และเพื่อนๆ
หากไม่เกี่ยวข้อง คุณสามารถตัดคุณสมบัติ suid บนไบนารี่ได้ แต่โปรดทราบว่าผู้ใช้ปัจจุบันของคุณยังคงต้องการการเข้าถึงไฟล์ /dev/input/event และ /dev/dri/cardN และ /dev/dri/renderN ที่เกี่ยวข้อง ทำงานอย่างถูกต้อง -- ไม่เช่นนั้นอุปกรณ์อินพุตและ/หรือกราฟิกอาจตรวจไม่พบหรือใช้งานได้
ไบนารี่จะแยกออกเป็นส่วนที่ไม่เป็นอันตรายซึ่งเอ็นจิ้นหลักหมด โปรดดูที่ posix/psep_open.c สำหรับการตรวจสอบสิ่งที่กำลังรันด้วยสิทธิ์ที่สูงกว่า รวมถึงโค้ดสำหรับการลดสิทธิ์ กระบวนการที่ได้รับสิทธิพิเศษมีหน้าที่รับผิดชอบในการเจรจาต่อรองการเข้าถึงอุปกรณ์ การใช้สวิตช์เทอร์มินัลเสมือน และเป็นตัวเฝ้าระวังในการกู้คืนกระบวนการหลักจากการล็อกแบบสดหรือความล้มเหลวของ GPU บางอย่าง
อีกวิธีหนึ่งในการขยายพฤติกรรมของเครื่องยนต์โดยไม่คำนึงถึงแอปพลิเคชันที่ใช้งานอยู่เรียกว่า hook-scripts สิ่งเหล่านี้อยู่ภายใน 'เส้นทางสคริปต์ระบบ' ที่ครอบคลุมโดยอาร์กิวเมนต์บรรทัดคำสั่ง -T หรือค่าเริ่มต้นของ shared/arcan/scripts
แนวคิดก็คือสิ่งเหล่านี้ควรจะสามารถให้คุณสมบัติ 'สลับเปิด' ที่ต้องการความร่วมมือจากภายในกลไก เพื่อทำการแก้ไขแบบกำหนดเองอย่างรวดเร็วหรือช่วยเชื่อมเครื่องมืออื่นๆ
ตัวอย่างที่ดีคือ 'external_input':
arcan -H hooks/external_input.lua -H hooks/external_input.lua myappl
สิ่งนี้จะเปิดจุดเชื่อมต่อสองจุด 'extio_1', 'extio_2' ซึ่งจะอนุญาตให้ไคลเอนต์หนึ่งเชื่อมต่อและให้อินพุตที่จะปรากฏต่อ appl 'myappl' ว่ามาจากเอ็นจิ้น
สิ่งเหล่านี้จะกล่าวถึงในรายละเอียดเพิ่มเติมใน manpage
Arcan-net เป็นไบนารี่ที่ให้คุณส่งต่อไคลเอนต์ arcan หนึ่งหรือหลายตัวผ่านเครือข่าย สร้างขึ้นโดยค่าเริ่มต้น และสามารถทริกเกอร์ได้ทั้งในฐานะเครื่องมือเครือข่ายแยกต่างหากและเปิดใช้งานทางอ้อมจาก shmif โดยการตั้งค่า ARCAN_CONNPATH=a12://id@host:port หรือเมื่อออกคำขอย้ายโดยตัวจัดการหน้าต่าง
ดูเพิ่มเติมที่: src/a12/net/README.md และ src/a12/net/HACKING.md
'arcan-wayland' หรือ 'waybridge' ตามที่อ้างถึงในบางสถานที่นั้นเป็นไบนารีเพิ่มการรองรับสำหรับไคลเอ็นต์ wayland และ X (ผ่าน Xwayland) สามารถเรียกใช้เป็นบริการระบบส่วนกลางได้เช่น
arcan-wayland -xwl
หรือเป็นรายกรณีไป เช่น
arcan-wayland -exec weston-terminal
สำหรับไคลเอ็นต์ wayland ที่เป็นไปตามข้อกำหนด และ:
arcan-wayland -exec-x11 xterm
สำหรับลูกค้า X แนะนำให้ใช้พื้นฐาน 'ต่อกรณี' เนื่องจากปลอดภัยกว่าและดีกว่าการปล่อยให้ลูกค้าหลายรายใช้กระบวนการบริดจ์เดียวกันโดยมีค่าใช้จ่ายเพียงเล็กน้อย ข้อเสียคือไคลเอนต์ที่ซับซ้อนบางตัวที่ต้องอาศัยการเชื่อมต่อเวย์แลนด์ที่แตกต่างกันหลายตัวอาจทำงานไม่ถูกต้อง Firefox เป็นผู้กระทำผิดที่รู้จัก
มีตัวเลือกการปรับแต่งและการแก้ไขปัญหามากมายเนื่องจากความซับซ้อนของการใช้เวย์แลนด์ โปรดดูที่ manpage และปุ่มสลับ --help
การกำหนดค่ารันไทม์ทั้งหมดจะถูกรวมไว้ในฐานข้อมูล ไม่ว่าจะเป็นค่าดีฟอลต์ 'arcan.sqlite' หรือค่าที่ตั้งไว้อย่างชัดเจน (arcan -d mydb.sqlite)
สิ่งนี้ใช้สำหรับตัวเลือกเฉพาะแพลตฟอร์ม ตัวเลือกเฉพาะของเครื่องยนต์ และสำหรับไคลเอนต์ที่เชื่อถือได้ซึ่งสคริปต์ที่รันอยู่ได้รับอนุญาตให้เริ่มทำงาน นอกจากนี้ยังใช้เป็นที่เก็บคีย์-ค่าการกำหนดค่าสำหรับแอปพลิเคชัน arcan ใดๆ ที่กำลังทำงานอยู่
เพื่อเป็นตัวอย่างสั้นๆ นี่คือวิธีการตรวจสอบและแก้ไขคีย์ที่ 'Durden' ใช้อยู่ในปัจจุบัน:
arcan_db show_appl durden
arcan_db add_appl_kv durden shadow_on true
การกำหนดค่าขั้นสูงสำหรับแพลตฟอร์มวิดีโอบางประเภทสามารถตั้งค่าได้ผ่านชื่อแอป arcan ที่สงวนไว้ ตัวอย่างเช่น จะตั้งชื่ออุปกรณ์กราฟิกการ์ดหลักสำหรับเวอร์ชันแพลตฟอร์ม 'egl-dri':
arcan_db add_appl_kv arcan video_device=/dev/dri/card2
หากต้องการเพิ่ม 'เป้าหมายการเปิดตัว' คุณสามารถใช้สิ่งที่ต้องการ:
arcan_db add_target net BIN /usr/bin/arcan-net -l netfwd
arcan_db add_config arcan-net default 10.0.0.10 6666
arcan_db add_target xterm BIN /usr/bin/arcan-wayland -exec-x11
ซึ่งช่วยให้แอปพลิเคชันสามารถเริ่มโปรแกรมในฐานะลูกที่เชื่อถือได้ (ซึ่งสืบทอดการเชื่อมต่อแบบดั้งเดิม แทนที่จะพยายามค้นหาโดยใช้เนมสเปซที่ขึ้นอยู่กับระบบปฏิบัติการบางตัว) ตัวอย่างข้างต้นน่าจะเกิด arcan-net ในโหมดโลคัล ซึ่งไคลเอ็นต์ที่เชื่อมต่อกับ connpath 'netfwd' จะถูกเปลี่ยนเส้นทางไปยังเซิร์ฟเวอร์ที่กำลังฟังอยู่ที่ 10.0.0.10:6666
มีการควบคุมและตัวเลือกมากมายสำหรับเครื่องมือนี้ ดังนั้นจึงขอแนะนำให้คุณดูที่ manpage ของมันเพื่อดูรายละเอียดและคำแนะนำเพิ่มเติม
ตัวเลือกการสร้าง 'ทุกอย่าง' ควรสร้างไบนารีที่เรียกว่า 'arcan_headless' อย่างน้อยก็บน BSD และ Linux ไบนารี่นี้สามารถใช้เพื่อรัน arcan ได้โดยไม่รบกวนกราฟิกและระบบการแสดงผลอื่นๆ ของคุณ ให้การเข้าถึง 'โหนดการเรนเดอร์' (/dev/dri/renderD128 และอื่นๆ) และควรทำงานได้ดีภายในคอนเทนเนอร์และโซลูชันแซนด์บ็อกซ์ที่เข้มงวดอื่นๆ
เพื่อให้มีประโยชน์สามารถบันทึก/สตรีมไปยังหน้าจอเสมือนได้ ตัวอย่างของการตั้งค่าดังกล่าวตามตัวอย่างด้านบนคือ:
ARCAN_VIDEO_ENCODE=protocol=vnc arcan_headless console
สมมติว่าระบบบิลด์พบการพึ่งพา libvncserver สิ่งนี้จะทำให้คุณได้รับเซิร์ฟเวอร์ vnc ที่เปิดเผย (ไม่ปลอดภัย ไม่มีการป้องกัน ...) ที่ localhost+5900 ดู afsrv_encode สำหรับรายการอาร์กิวเมนต์ที่สามารถเพิ่มลงในสภาพแวดล้อมการเข้ารหัสเพื่อควบคุมสิ่งที่เกิดขึ้น
โครงการนี้ได้รับทุนผ่าน NGI0 Entrust ซึ่งเป็นกองทุนที่ก่อตั้งโดย NLnet โดยได้รับการสนับสนุนทางการเงินจากโครงการอินเทอร์เน็ต Next Generation ของคณะกรรมาธิการยุโรป เรียนรู้เพิ่มเติมที่หน้าโครงการ NLnet
หากคุณไม่สนใจที่จะพัฒนาบางสิ่งของคุณเอง คุณอาจพบว่าส่วนต่างๆ ของโปรเจ็กต์นี้มีประโยชน์เพียงเล็กน้อยเท่านั้น นี่คือบางโครงการที่คุณอาจต้องการพิจารณา:
Durden เป็นสภาพแวดล้อมเดสก์ท็อปหลักที่ใช้โปรเจ็กต์นี้เป็นเซิร์ฟเวอร์แสดงผล
Safespaces คือสภาพแวดล้อมเดสก์ท็อป VR/3D รุ่นทดลอง
Pipeworld คือสภาพแวดล้อมการเขียนโปรแกรมกระแสข้อมูล (คิดว่าเป็น Excel)
Arcan-Devices สะสมไดรเวอร์เพิ่มเติม
หากต้องการรับการสนับสนุนสำหรับลูกค้าประเภทต่างๆ มากขึ้น ยังมี:
การสนับสนุน Wayland (ดูหัวข้อ Wayland ด้านบนและ src/wayland/README.md)
QEmu เป็นเวอร์ชัน QEmu ที่ได้รับการแก้ไขแล้วซึ่งเพิ่มตัวเลือก -ui arcan
Xarcan เป็น Xorg ที่ได้รับการแพตช์ซึ่งช่วยให้คุณสามารถเรียกใช้เซสชัน X 'เป็นหน้าต่าง'
nvim-arcan เป็นส่วนหน้าของ neovim ที่ทำหน้าที่เป็นไคลเอนต์ arcan ดั้งเดิม
นอกจากนี้ยังมีเครื่องมือช่วยเหลือจำนวนหนึ่งที่สามารถใช้เพื่อเพิ่มคุณสมบัติบางอย่าง เช่น การรองรับอุปกรณ์ VR และไอคอนถาด สิ่งเหล่านี้สร้างขึ้นแยกกันและสามารถพบได้ใน tools/ ไดเร็กทอรีย่อย พวกเขามีระบบบิลด์แยกต่างหากและไฟล์ README.md ที่เกี่ยวข้อง
พวกเขาทำงานบนสมมติฐานที่ว่า arcan และไลบรารีที่เกี่ยวข้องได้ถูกสร้างขึ้นและติดตั้งแล้ว พวกมันถูกล็อคไว้และมีการกำหนดเวอร์ชันให้กับเครื่องยนต์ ดังนั้นหากคุณอัพเกรดมัน อย่าลืมสร้างเครื่องมือขึ้นมาใหม่ด้วย
เครื่องมือหลักที่น่าสนใจคือ:
Acfgfs เป็นเครื่องมือที่ให้คุณเมานต์แอปพลิเคชั่น arcan บางตัวเป็นระบบไฟล์ FUSE แอปพลิเคชันจะต้องสนับสนุนอย่างชัดเจน สำหรับสภาพแวดล้อมเดสก์ท็อป Durden คุณสามารถใช้ global/settings/system/control=somename จากนั้น:
arcan_cfgfs --control=/path/to/durden/ipc/somename /mnt/desktop
และการควบคุม / การกำหนดค่าเดสก์ท็อปควรเปิดเผยในจุดเมานท์ที่ระบุ
Aclip เป็นตัวจัดการคลิปบอร์ดที่คล้ายกับ Xclip ช่วยให้สามารถเชื่อมโยงคลิปบอร์ดระหว่างสภาพแวดล้อมเดสก์ท็อปเช่น Durden และของเซิร์ฟเวอร์ X
สิ่งนี้กำหนดให้ต้องอนุญาตการเชื่อมต่อคลิปบอร์ด (ปิดใช้งานโดยค่าเริ่มต้นด้วยเหตุผลด้านความปลอดภัย) ใน Durden สิ่งนี้จะเปิดใช้งานผ่าน global/settings/system/clipboard ซึ่งคุณสามารถควบคุมจำนวนการเข้าถึงคลิปบอร์ดที่เครื่องมือจะได้รับ
Aloadimage เป็นตัวโหลดรูปภาพแบบแซนด์บ็อกซ์ที่เรียบง่าย คล้ายกับ xloadimage มันมีประโยชน์ทั้งสำหรับการทดสอบพฤติกรรมไคลเอนต์เมื่อพัฒนาแอปพลิเคชันโดยใช้ arcan แต่ยังเป็นโปรแกรมดูรูปภาพด้วยตัวมันเอง ด้วยการโหลดรูปภาพที่รวดเร็วพอสมควร การควบคุมเพลย์ลิสต์พื้นฐาน และอื่นๆ
บริดจ์ VR เป็นไดรเวอร์อินพุตเสริมที่ให้ไบนารี arcan_vr ซึ่งเพิ่มการรองรับสำหรับจอแสดงผลแบบสวมศีรษะต่างๆ คำแนะนำโดยละเอียดเพิ่มเติมเกี่ยวกับการตั้งค่าและการใช้งานสามารถพบได้โดยเป็นส่วนหนึ่งของโครงการ Safespaces ที่กล่าวถึงในส่วน 'โครงการที่เกี่ยวข้อง'
Arcan-trayicon เป็นเครื่องมือที่โหลดลูกโซ่ arcan ไคลเอนต์อื่นพร้อมกับรูปภาพอ้างอิงสองรูป (ใช้งานอยู่และไม่ได้ใช้งาน) มันพยายามลงทะเบียนตัวเองในถาดไอคอนของแอปพลิเคชัน arcan ที่ทำงานอยู่ แม้ว่าจะต้องเปิดใช้งานการสนับสนุนอย่างชัดเจนก็ตาม ใน Durden ทำได้โดยใช้เส้นทาง:
global/settings/statusbar/buttons/right/add_external=tray
จากนั้นคุณสามารถใช้:
ARCAN_CONNPATH=tray arcan-trayicon active.svg inactive.svg afsrv_terminal
หรือไคลเอนต์ arcan อื่น ๆ ที่จะถูกโหลดเมื่อคลิกปุ่มถาด จำกัด ไว้ในป๊อปอัปแล้วปิดลงเมื่อป๊อปอัปถูกทำลาย นี่เป็นวิธีที่รวดเร็วและสะดวกในการสรุปบริการระบบต่างๆ และสคริปต์คำสั่งภายนอก