• เป็นโปรแกรม 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 แบบคัสตอม จึงมีความเป็นไปได้ที่จะนำไปใช้ทำ ไอเดียเชิงทดลองอื่น ๆ ได้อีก
    • เช่น เชื่อมอุปกรณ์แสดงผลไปยังสื่อที่ไม่ใช่เทอร์มินัลโดยสิ้นเชิง (เช่น เครื่องพิมพ์, งานศิลปะเชิงกายภาพ เป็นต้น)

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น