HN 공개: 모든 화상 회의에서 화면 영역을 공유하는 X11 도구
(github.com/splitbrain)- 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
- 이 명령은 화면의
(100, 100)위치에서 시작하는 800x600 오버레이 창을 생성함
대화형 영역 선택과 종료
- 영역을 대화형으로 선택하려면
hacksaw또는slop과 함께 실행할 수 있음
./clipscreen $(hacksaw)
./clipscreen $(slop)
댓글과 토론
Hacker News 의견들
- 49인치 울트라와이드 모니터에서 Google Meet 화면 공유가 불편했음. 창 하나나 전체 화면만 공유할 수 있고 화면 일부 영역은 안 되기 때문임
그래서 xrandr 확장을 써서 특정 영역을 가상 모니터로 미러링하고, 그 가상 모니터를 공유할 수 있는 작은 도구를 만들었음
자세한 내용은 블로그 글에 있음: https://www.splitbrain.org/blog/2024-10/11-introducing_clips...- 큰 화면을 쓸 수 있을 때 정말 유용해 보임. 27인치 화면은 49인치만큼 작업 공간이 넓지는 않아서, 별도의 Xephyr 창을 DISPLAY 9로 띄우고 그 화면에 여러 창을 올리는 스크립트를 쓰고 있음
데모 환경으로 이렇게 사용함: https://gist.github.com/radupotop/d77a47767e2e65a7e7d40d1ea8...
- 큰 화면을 쓸 수 있을 때 정말 유용해 보임. 27인치 화면은 49인치만큼 작업 공간이 넓지는 않아서, 별도의 Xephyr 창을 DISPLAY 9로 띄우고 그 화면에 여러 창을 올리는 스크립트를 쓰고 있음
- 이게 얼마나 단순한지 마음에 듦. 주석을 빼면 C++ 100줄 남짓이라서, 이런 점 때문에 Wayland보다 X11을 더 선호하게 됨
- 코드가 조금 이상함. XLib 이벤트 루프가 없고, SIGINT를 받을 때까지 루프에서
sleep(100)을 호출함
그 때문에 별 이유 없이 CPU 사용량이 높아질 수 있음 - Wayland에서는 xdg-desktop-portal API로 캡처를 시작하면 사용자에게 알림을 띄우고, 캡처할 영역을 선택하게 해줌
- 기존 물리 디스플레이와 겹치는 가상 Xrandr 디스플레이를 만드는 건 거의 다른 윈도 시스템에서는 쉽게 못 하는 우아한 X.org 장기자랑에 가까움
SIGINT가 아닌 방식으로 종료되면 가상 출력만 남고 오버레이 창은 사라질 수 있어 약간 어색하지만, 큰 문제는 아님. 다만 코드 줄 수를 품질이나 우아함의 척도로 과하게 보지는 않는 편이 좋음
이 방식은 Wayland에서는 그대로는 불가능함. 대신 Wayland에서는 애초에 이 도구가 필요 없을 수도 있음. 권한 없는 프로세스가 화면을 캡처하는 표준 방식은 데스크톱 포털이고, 적어도 KDE는 화면 사각형 캡처를 포함해 다양한 캡처 옵션을 지원함. X.org 앱을 실행 중이어도 XWaylandVideoBridge 덕분에 가능할 것으로 보임
D-Bus가 여기저기 쓰이는 건 그다지 반갑지 않지만,org.freedesktop.impl.portal.ScreenCast구현을 바꾸면 원하는 화면 캡처 동작을 거의 대체할 수 있다는 점은 좋음. 각 앱이 캡처 대상 선택 기능을 제각각 구현하는 것보다 나은 방향이라고 봄 - 코드가 아주 적은 건 오류 처리와 정상성 검사가 거의 없기 때문임
X11이 해킹하기 좋고 멋지지 않다는 뜻은 아니지만, 완벽한 사용만 가정하지 않으려면 코드가 비대하고 복잡해지며 그만큼 견고해짐
예를 들어./clipscreen 1 2 3 4를 실행해 보면 됨 - 흠이 많다는 수십 년간의 논쟁을 부정하려는 건 아니지만, X11이 지금 와서는 사용 가능한 데스크톱 그래픽 환경 중 가장 단순하고 해킹하기 쉬운 환경처럼 보이게 된 정도가 놀라움
뭔가 장난을 치고 싶으면 바로 가능함. ICCCM은 90년대 초에 엄청 욕을 먹었지만, 다른 쪽에는 그에 해당하는 것이 없고 지금도 창 관리자 영역에서는 계속 새 시도가 나옴
- 코드가 조금 이상함. XLib 이벤트 루프가 없고, SIGINT를 받을 때까지 루프에서
- 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 - 공평하게 말하면 이 도구도 결국 그 작업과 오버레이를 C++로 해주는 것임
그래도 멋진 한 줄 명령임
- 선택을 대화형으로 만들려면 이렇게 하면 됨
- OBS로도 Wayland를 포함한 어떤 플랫폼에서든 이걸 할 수 있는 것 아닌가? 여러 댓글을 읽다 보니 많은 사람이 OBS를 모르거나, 아니면 내가 OBS 기능을 과대평가하는 것 같음
- 아마 가능할 것임. OBS를 써본 적은 없지만, 아마 20KB 바이너리보다는 좀 더 클 것임
- 가능은 하지만 손이 좀 더 감. GUI에서 여러 단계를 거쳐야 하고, 회의 전마다 매번 조정해야 한다면 꽤 번거로워짐
- OBS는 창 하나나 앱의 클라이언트 영역만 공유할 수 있게 해줌
- 49인치 모니터에서는 OBS, 마우스 따라가기 스크립트, 노트북 화면의 OBS 미리보기 창을 조합하고 노트북 화면 전체를 공유함
그러면 다른 사람이 노트북에서 보기 적당한 창 크기인지 알 수 있고, 미리보기가 마우스를 따라가며 확대 수준과 마우스 경계를 즉석에서 조정할 수 있음
OBS 미리보기 창은 실행 시 메인 OBS 창 없이 열리므로, 이후에는 메인 OBS 창이나 앱을 볼 필요도 조작할 필요도 없어 독립 실행형처럼 느껴지는 점이 좋음
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에 보이는 가상 화면을 즉시 생성함. 이 가상 화면은 기존 물리 디스플레이 위에 겹쳐 배치될 수도 있고 아닐 수도 있음 - 정말 훌륭함. Linux에서 바로 이 사용 사례 때문에 우리 회사는 Meet 대신 Zoom을 선택했음
- 직접 빌드한 뒤 GIMP로 전체 화면 스크린샷을 찍어서 원하는 너비, 높이, x/y 좌표를 알아내고 Google Meet에서 테스트해 봤음. 완벽하게 작동함
- xzoom으로도 이걸 할 수 있고, 1배 이상 확대도 가능한데, 혹시 내가 놓친 장점이 있나?
- 왜 현재 화상회의 플랫폼들에서 아직도 이 요구가 충족되지 않는지 궁금함. 거대 모니터는 점점 흔해졌고, 특히 이런 도구를 만들 개발자들에게는 더 그럴 텐데
- OBS로 우회하는 방법이 그리 어렵지 않아서일 수도 있음