- เป็นโปรแกรม CLI สำหรับ Linux ที่ทำให้สามารถ รันแอปพลิเคชัน GUI ได้โดยตรงจากเทอร์มินัล
- ใช้วิธีส่งเอาต์พุต GUI ไปยังเทอร์มินัลแทนจอภาพ ด้วย Wayland compositor ที่พัฒนาขึ้นเอง
- สามารถใช้งานในสภาพแวดล้อม ssh ได้ และ รันเว็บเบราว์เซอร์, ตัวจัดการไฟล์, แม้กระทั่งเกม Doom ได้ภายในเทอร์มินัล
- คุณภาพของเอาต์พุตจะแตกต่างตามความละเอียดของเทอร์มินัล (จำนวนแถว·คอลัมน์) และบนเทอร์มินัลที่รองรับภาพอย่าง iTerm2·kitty ก็รองรับ การเรนเดอร์แบบความละเอียดเต็ม ด้วย
- พัฒนาด้วย Typescript และ bun พร้อมมีโค้ด C++ บางส่วน ปัจจุบันยังรองรับเฉพาะบางแอป แต่กำลังขยายต่อโดยมีเป้าหมาย “Term everything❗”
ความสำคัญของโปรเจกต์และจุดเด่นเมื่อเทียบกับทางเลือกอื่น
- Term.everything แตกต่างจาก ตัวดูไฟล์ในเทอร์มินัล หรือเครื่องมือแสดงภาพแบบง่าย ๆ เดิม ๆ เพราะสามารถรันแอปพลิเคชัน GUI “ทุกอย่าง” ได้ภายในเทอร์มินัล
- สามารถใช้อินเทอร์เฟซ GUI ได้แม้ในสภาพแวดล้อมเครือข่ายรวมถึง SSH จึงเด่นในด้าน การดูแลเซิร์ฟเวอร์และการพัฒนาระยะไกล
- ใช้ประโยชน์จาก ความสามารถด้านภาพ ของเทอร์มินัลสมัยใหม่อย่าง kitty, iTerm2 ได้อย่างเต็มที่ พร้อมมีตัวเลือกเพิ่มความละเอียดและเฟรมเรต
ภาพรวม
- Term.everything เป็นโปรแกรม Linux CLI ที่มีจุดเด่นคือทำให้สามารถรันหน้าต่าง GUI ได้โดยตรงในเทอร์มินัล
- แกนหลักคือ Wayland compositor ที่พัฒนาขึ้นเอง ซึ่งเรนเดอร์ GUI ไปยังเทอร์มินัลแทนจอภาพทั่วไป
- รองรับทั้ง x11 และ Wayland และยังใช้งานจากระยะไกลผ่าน ssh ได้
- จำนวนแถว/คอลัมน์ที่จำกัดของเทอร์มินัลมีผลต่อคุณภาพของหน้าต่าง และสามารถเพิ่มคุณภาพได้ด้วยการเพิ่มความละเอียดของเทอร์มินัล (แต่อาจทำให้ประสิทธิภาพลดลง)
ตัวอย่างการใช้งานหลัก
- รันเกม: สามารถรันเกมอย่าง Fontemon หรือ Doom (ตอน shareware) ภายในเทอร์มินัลได้
- เล่นวิดีโอ: เล่นภาพยนตร์ Wing It! พร้อมปรับสมดุลระหว่างเฟรมเรตและคุณภาพภาพผ่านการตั้งค่าความละเอียด
- รันเบราว์เซอร์: ใช้ Firefox ได้โดยเชื่อมต่อเข้า Ubuntu ผ่าน iTerm2 + ssh
- ใช้แทนตัวดูไฟล์: ไม่จำเป็นต้องสร้างตัวดูไฟล์เฉพาะสำหรับเทอร์มินัล แต่ใช้ GUI file manager เดิมได้โดยตรงจากเทอร์มินัล
- รันแบบซ้อน: รันเทอร์มินัลอีกตัวภายในเทอร์มินัล หรือ "terminal in a terminal"
หลักการทำงานและข้อมูลการพัฒนา
-
แนวคิดพื้นฐาน
- ในอดีต หากโปรแกรมต้องการวาดบางอย่างบนหน้าจอ ก็สามารถ เขียนลงไปยังพื้นที่เฉพาะใน RAM โดยตรง ได้
- ในระบบสมัยใหม่ Display Server จะเป็นผู้จัดการ I/O โดยประสานอินพุตอย่างเมาส์/คีย์บอร์ดกับเอาต์พุตกราฟิก/ภาพ
- ในสภาพแวดล้อมลินุกซ์มักใช้ โปรโตคอล Wayland หรือ X11 และ Term.everything ทำงานบนพื้นฐานของ Wayland
-
โปรโตคอล Wayland
- Wayland ไม่ใช่ตัว Display Server เอง แต่เป็นโปรโตคอลที่กำหนดการสื่อสารระหว่างเซิร์ฟเวอร์กับโปรแกรม
- โปรแกรมจะส่งผลลัพธ์ที่เรนเดอร์เองไปยัง Display Server และเซิร์ฟเวอร์จะนำไปแสดงบนหน้าจอ
- จุดสำคัญคือ ไม่ได้บังคับโมเดลการเรนเดอร์ → โปรแกรมจึงวาดภาพได้ในวิธีที่ต้องการ
- ด้วยเหตุนี้ จึงสามารถส่งผลลัพธ์ไปยังที่อื่นแทนหน้าจอได้ (เช่น เทอร์มินัล)
-
การประมวลผลเอาต์พุตของ Term.everything
- รับภาพที่ Wayland client (แอป GUI ที่รันอยู่) วาดขึ้นมา แล้ว แปลงเป็นเอาต์พุตตัวอักษรของเทอร์มินัล
- ขั้นตอนการแปลง:
- 1. รับข้อมูลภาพที่ client ส่งมา
- 2. แปลงเป็น อักขระ UTF-8 + ANSI escape code
- 3. ใช้ ไลบรารี chafa ในการแมปพิกเซลให้เป็นตัวอักษรในเทอร์มินัล
- อินพุตจะถูกส่งผ่าน stdin และส่งต่อเหตุการณ์คีย์บอร์ดกับเมาส์ไปยัง Wayland client
-
การติดตั้งใช้งานจริง
- ไอเดียหลักนั้นเรียบง่าย แต่การทำให้ใช้งานได้จริงต้องใช้โค้ดราว หนึ่งหมื่นบรรทัด
- เขียนด้วย Typescript (บน bun) และ C++ บางส่วน โดยทำหน้าที่เป็น Wayland display server แบบคัสตอม
- สามารถดูซอร์สโค้ดได้ที่ src/ directory
-
ความเป็นไปได้ในการขยายต่อ
- Term.everything ไม่ได้มุ่งเพียงแค่การรัน GUI บนเทอร์มินัลเท่านั้น
- ด้วย Wayland display server แบบคัสตอม จึงมีความเป็นไปได้ที่จะนำไปใช้ทำ ไอเดียเชิงทดลองอื่น ๆ ได้อีก
- เช่น เชื่อมอุปกรณ์แสดงผลไปยังสื่อที่ไม่ใช่เทอร์มินัลโดยสิ้นเชิง (เช่น เครื่องพิมพ์, งานศิลปะเชิงกายภาพ เป็นต้น)
ยังไม่มีความคิดเห็น