1 คะแนน โดย GN⁺ 2024-10-15 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • clipscreen เป็นแอปพลิเคชัน X11 แบบเรียบง่ายที่สร้าง จอภาพเสมือน เพื่อมิเรอร์พื้นที่เฉพาะของหน้าจอ และแสดงพื้นที่นั้นด้วยกรอบสี่เหลี่ยมสีเขียว
  • ในเครื่องมือแชร์หน้าจออย่าง Google Meet, Microsoft Teams และ Jitsi Meet สามารถแชร์ จอภาพเสมือน นี้แทนการแชร์ทั้งหน้าจอหรือแชร์ทีละหน้าต่างได้
  • เพียงย้ายหน้าต่างที่ต้องการแชร์เข้าไปในกรอบสีเขียว จึงช่วยลดความจำเป็นในการแชร์หลายหน้าต่างแยกกันหรือสลับเป้าหมายการแชร์ไปมา
  • การรันใช้รูปแบบ ./clipscreen <width>x<height>+<x>+<y> และหากใช้ร่วมกับ hacksaw หรือ slop ก็สามารถ เลือกพื้นที่แบบโต้ตอบ ได้
  • ทดสอบแล้วเฉพาะบน Linux และ xorg เท่านั้น และไม่รับประกันว่าจะทำงานได้บนระบบอื่น

clipscreen ทำอะไร

  • clipscreen เป็นแอปพลิเคชันที่สร้างจอภาพเสมือนเพื่อทำสำเนาบางส่วนของหน้าจอ
  • พื้นที่หน้าจอที่กำหนดจะถูกเน้นด้วย กรอบสี่เหลี่ยมสีเขียว
  • ผู้ใช้สามารถแชร์จอภาพเสมือนนี้ผ่านเครื่องมือแชร์หน้าจอในการประชุมวิดีโอตามปกติได้
    • ตัวอย่าง: Google Meet
    • Microsoft Teams
    • Jitsi Meet

วิธีการแชร์หน้าจอ

  • แทนที่จะแชร์ทั้งหน้าจอหรือแชร์ทีละหน้าต่าง ให้แชร์ จอภาพเสมือน ที่ clipscreen สร้างขึ้น
  • หน้าต่างที่ต้องการแชร์เพียงย้ายเข้าไปในกรอบสีเขียว
  • เป็นวิธีที่ช่วยให้ไม่ต้องคอยสลับหน้าต่างที่แชร์อยู่ตลอดเวลาเมื่อทำงานกับหลายหน้าต่าง

ข้อกำหนดในการบิลด์

  • ระบบต้องมีสิ่งต่อไปนี้
    • ไลบรารีพัฒนา X11

      • ไลบรารีกราฟิก Cairo
      • คอมไพเลอร์ภาษา C เช่น gcc
      • บน Ubuntu 24.04 สามารถติดตั้งไลบรารีที่จำเป็นได้ด้วยคำสั่งต่อไปนี้
apt-get install libx11-dev xserver-xorg-dev xorg-dev libcairo2-dev gcc
- รันการบิลด์ด้วยคำสั่งต่อไปนี้
make
- แอปพลิเคชันทดสอบแล้วเฉพาะบน **Linux และ xorg** เท่านั้น และยังไม่แน่ชัดว่าจะทำงานได้บนระบบอื่นหรือไม่

วิธีใช้งาน

  • เรียกใช้ไฟล์ปฏิบัติการที่คอมไพล์แล้วด้วยรูปแบบต่อไปนี้
./clipscreen <width>x<height>+<x>+<y>
  • อาร์กิวเมนต์จะกำหนดตำแหน่งและขนาดของโอเวอร์เลย์กับจอภาพเสมือน
    • <width>: ความกว้างของโอเวอร์เลย์และจอภาพเสมือน
    • <height>: ความสูงของโอเวอร์เลย์และจอภาพเสมือน
    • <x>: พิกัด x ของมุมซ้ายบนของโอเวอร์เลย์และจอภาพเสมือน
    • <y>: พิกัด y ของมุมซ้ายบนของโอเวอร์เลย์และจอภาพเสมือน
  • ตัวอย่างมีดังนี้
./clipscreen 800x600+100+100
  • คำสั่งนี้จะสร้างหน้าต่างโอเวอร์เลย์ขนาด 800x600 โดยเริ่มที่ตำแหน่ง (100, 100) ของหน้าจอ

การเลือกพื้นที่แบบโต้ตอบและการปิดโปรแกรม

  • หากต้องการเลือกพื้นที่แบบโต้ตอบ สามารถรันร่วมกับ hacksaw หรือ slop ได้
./clipscreen $(hacksaw)
./clipscreen $(slop)
  • เครื่องมือที่เกี่ยวข้อง
  • หากต้องการออก ให้กด Ctrl+C ในเทอร์มินัลที่แอปพลิเคชันกำลังรันอยู่

1 ความคิดเห็น

 
GN⁺ 2024-10-15
ความคิดเห็นบน Hacker News
  • การแชร์หน้าจอ Google Meet บนจออัลตร้าไวด์ 49 นิ้วค่อนข้างไม่สะดวก เพราะแชร์ได้แค่หน้าต่างเดียวหรือทั้งหน้าจอ แต่แชร์ บางพื้นที่ของหน้าจอ ไม่ได้
    เลยใช้ส่วนขยาย xrandr เพื่อมิเรอร์พื้นที่เฉพาะเป็น จอเสมือน แล้วสร้างเครื่องมือเล็ก ๆ ที่แชร์จอเสมือนนั้นได้
    รายละเอียดอยู่ในบล็อกโพสต์: https://www.splitbrain.org/blog/2024-10/11-introducing_clips...
    • ดูมีประโยชน์มากเวลามีจอใหญ่ให้ใช้ หน้าจอ 27 นิ้วไม่ได้มีพื้นที่ทำงานกว้างเท่า 49 นิ้ว เลยใช้สคริปต์ที่เปิด หน้าต่าง Xephyr แยกบน DISPLAY 9 แล้ววางหลายหน้าต่างไว้บนหน้าจอนั้น
      ใช้แบบนี้เป็นสภาพแวดล้อมสำหรับเดโม: https://gist.github.com/radupotop/d77a47767e2e65a7e7d40d1ea8...
  • ชอบที่มันเรียบง่ายมาก ถ้าตัดคอมเมนต์ออกก็มีแค่ C++ ราว ๆ 100 บรรทัด เลยทำให้ชอบ X11 มากกว่า Wayland ด้วยเหตุผลแบบนี้
    • โค้ดดูแปลกนิดหน่อย ไม่มี XLib event loop และในลูปก็เรียก sleep(100) จนกว่าจะได้รับ SIGINT
      ด้วยเหตุนี้อาจทำให้ใช้ CPU สูงโดยไม่มีเหตุผลนัก
    • บน Wayland ถ้าเริ่มจับภาพด้วย xdg-desktop-portal API ระบบจะแจ้งผู้ใช้และให้เลือกพื้นที่ที่จะจับภาพ
    • การสร้าง จอ Xrandr เสมือน ที่ซ้อนทับกับจอจริงเดิม แทบจะเป็นโชว์ความสามารถระยะยาวอันสง่างามของ X.org ซึ่งทำได้ไม่ง่ายนักในระบบหน้าต่างอื่น ๆ
      ถ้าจบการทำงานด้วยวิธีที่ไม่ใช่ SIGINT อาจเหลือ output เสมือนไว้และหน้าต่าง overlay หายไป ซึ่งดูแปลกนิดหน่อย แต่ไม่ใช่ปัญหาใหญ่ อย่างไรก็ตาม ไม่ควรมองจำนวนบรรทัดของโค้ดเป็นตัวชี้วัดคุณภาพหรือความสง่างามมากเกินไป
      วิธีนี้ทำบน Wayland แบบตรง ๆ ไม่ได้ แต่บน Wayland อาจไม่จำเป็นต้องใช้เครื่องมือนี้ตั้งแต่แรกด้วยซ้ำ วิธีมาตรฐานสำหรับโปรเซสที่ไม่มีสิทธิ์ในการจับภาพหน้าจอคือ desktop portal และอย่างน้อย KDE ก็รองรับตัวเลือกการจับภาพหลากหลาย รวมถึงการจับภาพสี่เหลี่ยมบนหน้าจอ แม้กำลังรันแอป X.org อยู่ก็น่าจะทำได้ด้วย XWaylandVideoBridge
      การที่ D-Bus ถูกใช้ไปทั่วไม่ค่อยน่ายินดีนัก แต่ข้อดีคือถ้าเปลี่ยน implementation ของ org.freedesktop.impl.portal.ScreenCast ก็แทบจะแทนพฤติกรรมการจับภาพหน้าจอที่ต้องการได้ เห็นว่าเป็นแนวทางที่ดีกว่าการให้แต่ละแอปไป implement ฟังก์ชันเลือกเป้าหมายการจับภาพกันเอง
    • ที่โค้ดน้อยมากเป็นเพราะแทบไม่มี การจัดการข้อผิดพลาดและการตรวจสอบความถูกต้อง
      ไม่ได้หมายความว่า X11 ไม่ดีหรือไม่เท่สำหรับการแฮ็ก แต่ถ้าไม่อยากสมมติว่าผู้ใช้จะใช้อย่างสมบูรณ์แบบ โค้ดก็จะบวมและซับซ้อนขึ้น และจะแข็งแรงขึ้นตามนั้น
      ตัวอย่างเช่น ลองรัน ./clipscreen 1 2 3 4 ดูก็ได้
    • ไม่ได้พยายามปฏิเสธข้อถกเถียงยาวนานหลายสิบปีว่ามันมีข้อเสียเยอะ แต่ก็น่าทึ่งที่ตอนนี้ X11 กลับดูเหมือนเป็นสภาพแวดล้อมกราฟิกเดสก์ท็อปที่ใช้งานได้ซึ่ง เรียบง่ายและแฮ็กง่ายที่สุด
      ถ้าอยากลองเล่นอะไรสักอย่างก็ทำได้ทันที ICCCM เคยโดนด่าอย่างหนักช่วงต้นยุค 90 แต่ฝั่งอื่นไม่มีสิ่งที่เทียบเท่ากัน และทุกวันนี้ในพื้นที่ window manager ก็ยังมีการทดลองใหม่ ๆ ออกมาเรื่อย ๆ
  • เท่าที่จำได้ Zoom แชร์ได้ หลายหน้าจอ/หลายหน้าต่าง ไม่ใช่แค่อันเดียว กดปุ่ม SHFT ตอนคลิกหน้าต่างที่ต้องการแชร์ก็ได้
    • ฟีเจอร์แบบนี้คนเขาไปค้นพบกันได้ยังไงนะ?
  • เรื่องนี้ทำได้ด้วย xrandr เพียงอย่างเดียว จริง ๆ
    xrandr --setmonitor screenshare 2560/1x1440/1+0+0 none
    • ถ้าอยากให้เลือกแบบโต้ตอบได้ก็ทำแบบนี้
      geo=$(slop -f '%w/1x%h/1+%x+%y') && xrandr --setmonitor screenshare "$geo" none
    • ถ้าพูดอย่างเป็นธรรม เครื่องมือนี้ก็แค่ทำงานนั้นกับ overlay ให้ด้วย C++ ในท้ายที่สุด
      แต่ก็เป็นคำสั่งบรรทัดเดียวที่เจ๋งดี
  • ใช้ OBS ทำแบบนี้บนแพลตฟอร์มไหนก็ได้ รวมถึง Wayland ไม่ได้หรือ? อ่านหลายคอมเมนต์แล้วเหมือนหลายคนไม่รู้จัก OBS หรือไม่ก็ผมประเมินความสามารถของ OBS สูงไปเอง
    • น่าจะทำได้ ผมไม่เคยใช้ OBS แต่คงใหญ่กว่า ไบนารี 20KB อยู่หน่อย
    • ทำได้ แต่ต้องลงมือมากขึ้น ต้องผ่านหลายขั้นตอนใน GUI และถ้าต้องปรับทุกครั้งก่อนประชุมก็ค่อนข้างยุ่งยาก
    • OBS ให้แชร์ได้แค่หน้าต่างเดียวหรือ client area ของแอป
  • บนจอ 49 นิ้ว ผมใช้ OBS ร่วมกับสคริปต์ตามเมาส์ และหน้าต่างพรีวิว OBS บนหน้าจอโน้ตบุ๊ก แล้วแชร์ทั้งหน้าจอโน้ตบุ๊ก
    แบบนั้นจะรู้ได้ว่าขนาดหน้าต่างเหมาะให้คนอื่นดูบนโน้ตบุ๊กหรือไม่ และพรีวิวจะตามเมาส์ไปพร้อมปรับระดับการซูมกับขอบเขตของเมาส์ได้ทันที
    หน้าต่างพรีวิว OBS เปิดได้ตอนเริ่มโดยไม่ต้องมีหน้าต่าง OBS หลัก ดังนั้นหลังจากนั้นก็ไม่ต้องดูหรือควบคุมหน้าต่าง OBS หลักหรือแอปอีกเลย ทำให้รู้สึกเหมือนเป็นเครื่องมือ standalone ดี
    https://github.com/BlankSourceCode/obs-zoom-to-mouse
  • บน KDE 6.1, Wayland, Chromium ถ้ากดปุ่มแชร์ของบริการอย่าง Jitsi จะมีตัวเลือกแชร์ Entire Screen ขึ้นมาก่อน แล้วตามด้วยกล่องโต้ตอบที่มี Full Workspace, New Virtual Output, Rectangular Region และรายชื่อจอแสดงผล
    Rectangular Region แชร์บางส่วนของหน้าจอที่เลือกได้ ส่วน New Virtual Output จะสร้างหน้าจอเสมือนที่มองเห็นได้ใน KDE Display Configuration ทันที หน้าจอเสมือนนี้อาจถูกวางซ้อนบนจอจริงเดิมหรือไม่ก็ได้
  • ยอดเยี่ยมจริง ๆ บริษัทของเราเลือกใช้ Zoom แทน Meet บน Linux ก็เพราะกรณีใช้งานนี้แหละ
    • หลังจากบิลด์เองแล้ว ผมถ่ายสกรีนช็อตเต็มหน้าจอด้วย GIMP เพื่อดูความกว้าง ความสูง และพิกัด x/y ที่ต้องการ แล้วทดสอบกับ Google Meet ดู ทำงานได้สมบูรณ์แบบ
  • ใช้ xzoom ทำแบบนี้ได้เหมือนกัน และยังซูมได้มากกว่า 1 เท่าด้วย มีข้อดีอะไรที่ผมพลาดไปหรือเปล่า?
  • สงสัยว่าทำไมแพลตฟอร์มประชุมวิดีโอปัจจุบันยังไม่ตอบโจทย์นี้ จอมอนิเตอร์ขนาดใหญ่มากเริ่มพบได้ทั่วไปขึ้นเรื่อย ๆ โดยเฉพาะในหมู่นักพัฒนาที่น่าจะเป็นคนสร้างเครื่องมือแบบนี้
    • อาจเป็นเพราะวิธีเลี่ยงด้วย OBS ไม่ได้ยากมากนัก