원문 캡처 · onewireout.com
원문 캡처 · onewireout.com

Resonance는 창을 겹쳐 놓거나 화면을 격자처럼 재배치하는 대신, 층별로 배치하고 위치를 기억하는 리눅스 컴포지터다. 제작자는 자신의 컴퓨터 한 대에서 매일 사용하며 기능을 만들었고, 코드 공개는 추후 GitHub에 업로드할 예정이라고 밝혔다.

새 창은 기본적으로 지상층에 열린다. 이미 창이 있는 자리라면 위층으로 이동하고, 아래층에 빈 공간이 생기면 다시 내려온다. 창을 드래그해 다른 창과 겹치게 놓으면 놓는 순간 한 층 위로 밀려나며, 겹치지 않는 곳에 놓으면 지상층 쪽으로 돌아온다. 층 사이에는 시각적 간격을 두고, 각 앱의 창이 어느 층의 어느 위치에 있었는지도 기억한다.

이 시스템은 한 사용자와 한 컴퓨터에 맞춰 만들어져 출력 배치와 층별 여백 등 여러 설정이 하드코딩돼 있다. 제작자는 약 2주 동안 일상적으로 사용하면서 한 차례 충돌을 겪었고, 원인은 Godot의 창 연결·해제 과정이었다고 설명했다. 알려진 잠재적 문제로는 IPC 쓰기 차단과 일부 프로토콜 처리의 생략이 있지만, 이 기간에는 실제 문제가 되지 않았다고 덧붙였다.

Resonance의 컴포지터는 창을 배치하는 방법만 처리하고, 배치 결정을 내리지는 않는다. 정책은 Python 프로세스가 맡으며, 두 부분은 /tmp/resonance.sock의 줄 단위 텍스트 프로토콜로 통신한다. 컴포지터가 뇌에 보내는 이벤트는 창의 열림·이동·닫힘, 드래그 종료, 키 바인딩과 제스처, 커서 위치 등이다. 뇌가 컴포지터에 보낼 수 있는 명령은 창 위치와 크기, 층을 지정하는 place:와 전체 화면 상태를 지정하는 fullscreen: 두 가지다. 제작자는 Python 쪽을 창을 닫지 않고 재시작할 수 있도록 분리했다고 설명한다.

기반은 wlroots의 교육용 예제인 TinyWL이다. 제작자는 약 500줄이던 예제를 확장해 현재 tinywl.c가 약 4,700줄이 됐다고 밝혔다. 구현에는 다중 모니터 배치, XWayland 창 지원, 레이어 셸, 서버 측 창 장식, 화면 캡처, 포인터 제약과 상대 포인터 이동, 드래그 앤 드롭 등이 포함된다. XWayland 창 관리는 네이티브 창과 API가 거의 공유되지 않아 두 방식에 각각 구현해야 했다고 설명했다.

창 위치 기억 기능은 앱 ID와 층별로 창의 자리를 저장하며, 동시에 열린 같은 앱의 창마다 별도 위치를 둔다. 위치는 창 이동이 끝난 직후나 앱이 창을 옮춘 뒤 3초 동안 변화가 없을 때 기록한다. 저장된 위치는 기록 당시의 모니터에서만 복원하며, 여러 모니터 경계에 걸친 창은 저장하지 않는다. Discord, Steam, Audacity, OrcaSlicer, Kdenlive처럼 실제 창 전에 시작 화면을 띄우는 앱은 첫 창 이벤트를 배치 대상에서 제외하고, 두 번째 창 이벤트를 실제 창으로 간주한다.

같은 층의 창은 서로 겹치지 않도록 밀어내며, 이웃 창은 최대 7픽셀 간격을 유지한다. 밀려난 창이 층의 안쪽 경계에 닿으면 최소 100픽셀까지 줄어든다. 제작자는 현재 시스템이 토대에 해당하며, 이후 입력 속도와 사용 맥락을 바탕으로 앱을 배치하는 학습 기능을 같은 두 IPC 명령을 통해 추가할 계획이라고 밝혔다.