1 điểm bởi GN⁺ 2024-10-15 | 1 bình luận | Chia sẻ qua WhatsApp
  • clipscreen là một ứng dụng X11 đơn giản tạo ra một màn hình ảo phản chiếu một vùng cụ thể của màn hình và đánh dấu vùng đó bằng hình chữ nhật màu xanh lá
  • Trong các công cụ chia sẻ màn hình như Google Meet, Microsoft Teams, Jitsi Meet, bạn có thể chia sẻ màn hình ảo thay vì toàn bộ màn hình hoặc từng cửa sổ riêng lẻ
  • Chỉ cần di chuyển cửa sổ muốn chia sẻ vào trong viền xanh lá, nhờ đó giảm nhu cầu chia sẻ nhiều cửa sổ riêng lẻ hoặc chuyển đổi đối tượng chia sẻ
  • Chạy theo dạng ./clipscreen <width>x<height>+<x>+<y>; khi dùng cùng hacksaw hoặc slop cũng có thể chọn vùng tương tác
  • Chỉ mới được kiểm thử trên Linux và xorg, không bảo đảm hoạt động trên các hệ thống khác

clipscreen làm gì

  • clipscreen là một ứng dụng tạo màn hình ảo sao chép một phần màn hình
  • Vùng màn hình được chỉ định sẽ được làm nổi bật bằng hình chữ nhật màu xanh lá
  • Người dùng có thể chia sẻ màn hình ảo này trong các công cụ chia sẻ màn hình thông thường của hội nghị video
    • Ví dụ: Google Meet
    • Microsoft Teams
    • Jitsi Meet

Cách chia sẻ màn hình

  • Thay vì chia sẻ toàn bộ màn hình hoặc từng cửa sổ riêng lẻ, hãy chia sẻ màn hình ảo do clipscreen tạo ra
  • Chỉ cần di chuyển cửa sổ muốn chia sẻ vào trong viền xanh lá
  • Đây là cách giúp không phải liên tục chuyển đổi cửa sổ chia sẻ khi làm việc với nhiều cửa sổ

Yêu cầu build

  • Hệ thống cần các thành phần sau
    • Thư viện phát triển X11

      • Thư viện đồ họa Cairo
      • Trình biên dịch C, ví dụ: gcc
      • Trên Ubuntu 24.04, có thể cài đặt các thư viện cần thiết bằng lệnh sau
apt-get install libx11-dev xserver-xorg-dev xorg-dev libcairo2-dev gcc
- Build bằng lệnh sau
make
- Ứng dụng chỉ mới được kiểm thử trên **Linux và xorg**, chưa chắc hoạt động trên các hệ thống khác

Cách sử dụng

  • Chạy tệp thực thi đã biên dịch theo định dạng sau
./clipscreen <width>x<height>+<x>+<y>
  • Các đối số chỉ định vị trí và kích thước của overlay và màn hình ảo
    • <width>: chiều rộng của overlay và màn hình ảo
    • <height>: chiều cao của overlay và màn hình ảo
    • <x>: tọa độ x góc trên bên trái của overlay và màn hình ảo
    • <y>: tọa độ y góc trên bên trái của overlay và màn hình ảo
  • Ví dụ như sau
./clipscreen 800x600+100+100
  • Lệnh này tạo một cửa sổ overlay 800x600 bắt đầu tại vị trí (100, 100) trên màn hình

Chọn vùng tương tác và thoát

  • Để chọn vùng theo cách tương tác, có thể chạy cùng hacksaw hoặc slop
./clipscreen $(hacksaw)
./clipscreen $(slop)
  • Công cụ liên quan
  • Để thoát, nhấn Ctrl+C trong terminal đang chạy ứng dụng

1 bình luận

 
GN⁺ 2024-10-15
Các ý kiến trên Hacker News
  • Việc chia sẻ màn hình Google Meet trên màn hình ultrawide 49 inch khá bất tiện. Vì chỉ có thể chia sẻ một cửa sổ hoặc toàn màn hình, chứ không chia sẻ được một vùng của màn hình
    Vì vậy, tôi đã dùng phần mở rộng xrandr để mirror một vùng cụ thể thành màn hình ảo, rồi tạo một công cụ nhỏ cho phép chia sẻ màn hình ảo đó
    Chi tiết có trong bài blog: https://www.splitbrain.org/blog/2024-10/11-introducing_clips...
    • Trông thực sự hữu ích khi có thể dùng màn hình lớn. Màn hình 27 inch không có không gian làm việc rộng như 49 inch, nên tôi đang dùng một script mở riêng một cửa sổ Xephyr trên DISPLAY 9 rồi đặt nhiều cửa sổ lên màn hình đó
      Tôi dùng như vậy cho môi trường demo: https://gist.github.com/radupotop/d77a47767e2e65a7e7d40d1ea8...
  • Tôi thích việc thứ này đơn giản đến mức nào. Bỏ chú thích ra thì chỉ khoảng hơn 100 dòng C++, và chính những điểm như thế khiến tôi thích X11 hơn Wayland
    • Code hơi lạ. Không có vòng lặp sự kiện XLib, và nó gọi sleep(100) trong vòng lặp cho đến khi nhận SIGINT
      Vì thế CPU usage có thể tăng cao mà chẳng có lý do gì đặc biệt
    • Trên Wayland, khi bắt đầu capture bằng API xdg-desktop-portal, hệ thống sẽ hiện thông báo cho người dùng và cho phép chọn vùng cần capture
    • Việc tạo một màn hình Xrandr ảo chồng lên màn hình vật lý hiện có gần như là một màn trình diễn kỹ thuật thanh lịch kiểu X.org mà các hệ thống cửa sổ khác khó làm dễ dàng được
      Nếu thoát theo cách không phải SIGINT, chỉ output ảo có thể còn lại còn cửa sổ overlay biến mất, nên hơi gượng một chút, nhưng không phải vấn đề lớn. Tuy nhiên, tốt nhất đừng xem số dòng code là thước đo quá quan trọng cho chất lượng hay sự thanh lịch
      Cách này không thể áp dụng y nguyên trên Wayland. Thay vào đó, trên Wayland có thể ngay từ đầu đã không cần công cụ này. Cách chuẩn để một tiến trình không có quyền capture màn hình là desktop portal, và ít nhất KDE hỗ trợ nhiều tùy chọn capture, bao gồm capture một hình chữ nhật trên màn hình. Ngay cả khi đang chạy ứng dụng X.org thì có vẻ vẫn làm được nhờ XWaylandVideoBridge
      Việc D-Bus được dùng khắp nơi thì không đáng mừng lắm, nhưng điểm hay là nếu thay đổi implementation của org.freedesktop.impl.portal.ScreenCast, ta gần như có thể thay thế hành vi capture màn hình theo ý muốn. Tôi cho rằng đó là hướng tốt hơn so với việc mỗi ứng dụng tự triển khai chức năng chọn đối tượng capture theo cách riêng
    • Lý do code rất ít là vì gần như không có xử lý lỗi và kiểm tra tính hợp lệ
      Điều đó không có nghĩa X11 không hay và không phù hợp để hack, nhưng nếu không chỉ giả định trường hợp sử dụng hoàn hảo, code sẽ phình to và phức tạp hơn, đổi lại cũng vững chắc hơn
      Ví dụ, cứ thử chạy ./clipscreen 1 2 3 4 là biết
    • Tôi không định phủ nhận hàng thập kỷ tranh luận rằng nó có nhiều khiếm khuyết, nhưng thật đáng ngạc nhiên là đến nay X11 lại trông như môi trường đồ họa desktop đơn giản và dễ hack nhất trong số các môi trường còn dùng được
      Muốn nghịch gì đó thì có thể làm ngay. ICCCM từng bị chửi rất nhiều vào đầu thập niên 90, nhưng phía khác lại không có thứ tương đương, và đến giờ trong mảng window manager vẫn liên tục có các thử nghiệm mới
  • Tôi nhớ là trong Zoom có thể chia sẻ nhiều màn hình hoặc cửa sổ, chứ không chỉ một. Chỉ cần giữ phím SHFT khi bấm vào các cửa sổ muốn chia sẻ
    • Rốt cuộc làm sao người ta phát hiện ra những tính năng như vậy nhỉ?
  • Việc này đúng nghĩa là có thể làm chỉ bằng xrandr
    xrandr --setmonitor screenshare 2560/1x1440/1+0+0 none
    • Nếu muốn chọn theo kiểu tương tác thì làm như sau
      geo=$(slop -f '%w/1x%h/1+%x+%y') && xrandr --setmonitor screenshare "$geo" none
    • Công bằng mà nói thì công cụ này rốt cuộc cũng làm việc đó và overlay bằng C++
      Dù vậy vẫn là một câu lệnh một dòng rất hay
  • Không phải OBS cũng làm được việc này trên bất kỳ nền tảng nào, kể cả Wayland, sao? Đọc nhiều bình luận thì có vẻ nhiều người không biết OBS, hoặc là tôi đang đánh giá quá cao tính năng của OBS
    • Có lẽ là được. Tôi chưa từng dùng OBS, nhưng chắc nó sẽ lớn hơn binary 20KB một chút
    • Làm được, nhưng mất công hơn. Phải qua nhiều bước trong GUI, và nếu trước mỗi cuộc họp đều phải chỉnh lại thì khá phiền
    • OBS chỉ cho phép chia sẻ một cửa sổ hoặc vùng client của ứng dụng
  • Trên màn hình 49 inch, tôi kết hợp OBS, script theo dõi chuột, cửa sổ preview OBS trên màn hình laptop, rồi chia sẻ toàn bộ màn hình laptop
    Như vậy có thể biết cửa sổ có kích thước phù hợp để người khác xem trên laptop hay không, và phần preview đi theo chuột, cho phép chỉnh mức zoom và ranh giới chuột ngay tại chỗ
    Cửa sổ preview của OBS mở khi chạy mà không có cửa sổ OBS chính, nên sau đó không cần nhìn hay thao tác với cửa sổ OBS chính hoặc ứng dụng nữa, cảm giác như một công cụ chạy độc lập, điểm này rất hay
    https://github.com/BlankSourceCode/obs-zoom-to-mouse
  • Trên KDE 6.1, Wayland, Chromium, khi bấm nút chia sẻ của các dịch vụ như Jitsi, trước tiên tùy chọn chia sẻ Entire Screen xuất hiện, rồi sau đó hiện hộp thoại có Full Workspace, New Virtual Output, Rectangular Region và danh sách màn hình
    Rectangular Region cho phép chia sẻ một phần màn hình đã chọn, còn New Virtual Output lập tức tạo một màn hình ảo hiển thị trong KDE Display Configuration. Màn hình ảo này có thể được đặt chồng lên màn hình vật lý hiện có hoặc không
  • Thật sự tuyệt vời. Chính vì use case này trên Linux mà công ty chúng tôi đã chọn Zoom thay vì Meet
    • Sau khi tự build, tôi chụp screenshot toàn màn hình bằng GIMP để xác định chiều rộng, chiều cao, tọa độ x/y mong muốn rồi thử trên Google Meet. Hoạt động hoàn hảo
  • xzoom cũng làm được việc này, thậm chí còn có thể phóng to hơn 1x; liệu có ưu điểm nào tôi đang bỏ lỡ không?
  • Tôi thắc mắc vì sao các nền tảng họp video hiện nay vẫn chưa đáp ứng nhu cầu này. Màn hình khổng lồ ngày càng phổ biến, nhất là với những developer có thể tạo ra các công cụ kiểu này
    • Có thể là vì cách workaround bằng OBS không quá khó