2017-02-23 14 views
1

현재 창 관리자를 작성 중이며 다른 모든 창 위에 겹쳐서 창을 만들 수 있는지 궁금합니다. 그러나 입력 포커스를 전혀 취하지 않습니다. 다른 말로하면, 나는 입력을하지 않고이 창을 그릴 수있는 것이 이상적입니다.입력 이벤트를 받아들이지 않거나 포커스를 잡을 xlib로 투명 창을 만듭니다.

한 가지 방법은 창 관리자가 XQueryTree를 호출 한 다음 입력 (마우스 클릭, 키보드 입력 등)을 해당 창에 전달하는 것입니다. 그러나이 오버레이 창이 입력 이벤트를 전혀받지 못하게하는 방법이 있는지 궁금합니다.

또한 루트 창에 직접 그릴 필요가 없습니다. 그러면 합성 관리자가 손상 될 수 있습니다.

답변

1

복합 확장은 당신이 원하는 것을 정확하게 제공 : 프로토콜의

https://www.x.org/releases/X11R7.7/doc/compositeproto/compositeproto.txt

3.2 복합 오버레이 창

버전 0.3을 는 표면과 합성 관리자를 제공하는 복합 오버레이 창을 추가하는에 간섭없이 그릴 수 있습니다. 이 창은 항상 일반 창 위에 있으며 화면 보호기 창 아래에는 항상 입니다. InputChanged 윈도우는 폭이 이고 높이가 화면 크기입니다. 시각은 루트 시각 이고 경계 폭은 0입니다. 복합 확장자 을 사용하여 리디렉션을 시도하면 무시됩니다. 이 창은 QueryTree 요청에 대한 답장에 나타나지 않습니다. 재정의 리디렉션 창이기도합니다. 이 마지막 두 기능을 사용하면 창 관리자 및 기타 X11 클라이언트에 표시되지 않습니다. 이 윈도우의 XID에 액세스하는 유일한 방법은 CompositeGetOverlayWindow 요청을 사용하는 것입니다. 처음에는 복합 오버레이 창이 매핑 해제되었습니다.

CompositeGetOverlayWindow는 복합 오버레이 창의 XID를 반환합니다. 윈도우가 아직 매핑되지 않았다면이 주소는 요청으로 매핑됩니다. 이 요청을 호출 한 모든 클라이언트가 X11 연결을 종료하면 창이 매핑 해제됩니다.

복합 관리자는 복합 오버레이 창으로 직접 렌더링하거나 다른 창을이 창의 하위로 다시 작성하여 렌더링 할 수 있습니다. 여러 클라이언트가 복합 오버레이 창을 렌더링하고 자식 창을 만들고 모양을 바꾼 다음 입력 영역을 다시 정의 할 수 있지만이 클라이언트가 에 따라 지정한 중재 규칙은이 사양에서 정의하지 않습니다. 이러한 정책 은 클라이언트 자체에서 정의해야합니다. 여기

참조 C API를 우리가이 합성 오버레이 창 상단에 뭔가를 그릴 경우, 도면이에 https://linux.die.net/man/3/xcompositegetoverlaywindow

+0

이 흥미로운 솔루션이며 나는 카이로와 함께 사용하려고 문제가 사라질 것 몇 miliseconds (유니온과 아치와 계피로 우분투에서 시도). 다시 말하자면, 수면 시간을 지속적으로 (또는 거의 일정하게, 수면 시간과 함께) 반복해서 그리지 않으면 안되지만,이 경우 성능에 영향을 미칠뿐만 아니라 눈에 보이는 깜박임/깜박임 ... 지금까지는 해결 방법을 찾을 수 없었습니다. – ScienceSE

+0

이것은 다른 컴포 지터가 실행 중일 때 (Ubuntu의 경우 Compiz) 때문일 수 있습니다.비 합성 wm 또는 독립형 컴포지션 프로그램을 사용하여 간단한 x 세션을 시작해보십시오. –

+0

그래,이 오버레이 창의 맨 위에 무언가가 그려지는 것 같아서 깜박임을 관찰하는 것입니다. 아마도이 경우의 "휴대용"솔루션은 복합 오버레이 창의 하위 창을 만들고 투명한 색으로 채운 다음 상단에 그릴 것입니다. – ScienceSE