2010-04-08 3 views
7

gdk_screen_get_monitor_geometry를 사용하면 둘 이상의 화면이 단일 화면으로 사용되는 경우에도 총 영역을 픽셀 단위로 가져올 수 있으며 각 모니터의 상대 위치를 얻을 수 있습니다.Gtk : 각 모니터의 사용 가능한 영역 가져 오기 (패널 제외)

그러나 각 모니터의 영역 (즉, 패널 제외)을 사용할 수있게하려고합니다. 내가 찾은 유일한 것은 _NET_WORKAREA이지만 모든 모니터에서 스트레칭되는 거대한 영역입니다. 해상도와 배열에 따라이 영역 안에 패널이있을 수 있습니다.

각 모니터의 실제 사용 가능한 영역을 어떻게 얻을 수 있습니까? 이상적으로는 Gtk/Gdk 만 사용하고 X11에는 해당되지 않습니다.

답변

1

결국 나는 xlib를 직접 사용하여 끝 냈습니다. 위에 제안 된 것과 같은 다양한 "트릭"은 궁극적으로 이상한 구석의 경우 장기간 실패로 끝나고 KISS 원칙을 결코 따르지 않았습니다.

제가 사용한 솔루션은 X- 타일 코드 기반입니다.

+1

솔루션을 공유 하시겠습니까? –

+0

게시물을 읽으십시오. 추가 도움말은 http://bit.ly/1t8MY1H –

+1

을 참조하십시오. x-tile 소스 코드가 있는데, 나는 더미가 아닙니다. 하지만 전체 소스 코드를 검색하는 것에 비해 몇 가지 시스템 호출을 더 쉽게 볼 수 있다고 생각하지 않습니까? –

1

다음 접근법은 다소 복잡하지만, 필자가 사용하는 방법입니다. 윈도우가 매핑 될 때 윈도우 매니저와 GTK + 사이에 복잡한 상호 작용이있을 때에도 견고해야합니다 - 예를 들어 패널 중 일부가 자동으로 숨겨져있을 때.

기본적인 아이디어는 각 화면에 대해 장식이없는 최대화 된 창을 만들고, 매핑 될 때 (예 : map-event 콜백을 사용하여) 도형 (크기 및 위치)을 가져 와서 즉시 파괴하는 것입니다. 그러면 각 화면에서 사용할 수있는 영역이 생깁니다. 그런 다음 기존의 gdk_screen_get_monitor_geometry() 접근 방식을 사용하여 모니터간에 사용 가능한 영역이 분할되는 방식을 결정할 수 있습니다. 상세

:

사용 gdk_display_get_default()는 기본 디스플레이를 얻기 위해 다음 gdk_display_get_n_screens()가 얼마나 많은 화면을 찾을 수 있습니다.

gtk_window_new()을 사용하여 각 화면에 대해 새 창을 만들고 gtk_window_set_screen()을 사용하여 창을 각각의 화면으로 이동합니다. gtk_window_set_decorated(,FALSE)을 사용하여 창을 없애고 gtk_window_maximize(,TRUE)을 사용하여 창을 최대화하고 gtk_window_set_opacity(,0.0)을 사용하여 투명하게 만듭니다. map-event 신호를 콜백 핸들러에 연결하십시오 (g_signal_connect() 사용). gtk_widget_show()을 사용하여 창을 표시하십시오.

신호 처리기는 새로 매핑 된 창의 위치 및/또는 크기를 가져오고 gtk_widget_destroy()을 사용하여 창을 파괴하려면 gtk_window_get_position() 및/또는 gtk_window_get_size()을 호출해야합니다.

실제로는 하나의 창만 있으면됩니다. 나는 개인적으로 간단한 루프를 사용할 것이다. 필자는 창 관리자의 기이함/버그로 인해 화면간에 동일한 창을 이동하는 것보다 각 창마다 새 창을 만드는 것이 훨씬 더 강력하다고 생각합니다. 하나의 간단한 콜백 함수를 사용하여 각 화면에 사용할 수있는 영역을 얻을 수 있기 때문에 더 쉽습니다.

내가 말했듯이, 이것은 꽤 복잡하다. 반면에, 표준 애플리케이션은 화면 크기를 신경 쓰지 않아야합니다. 사용자 또는 창 관리자가 묻는 것을 단순히 수행해야합니다. 그렇기 때문에이 정보를 찾을 수있는 더 나은 시설이 없다면 나는 놀라지 않을 것입니다. 화면 크기는 사용자가 디스플레이를 회전하거나 디스플레이 해상도를 변경하는 경우와 같이 언제든지 변경 될 수 있습니다.

+0

이것은 매우 영리한 방법이지만 * 동 기적으로 작동하는 접근 방식이 있는지를 알고 싶습니다.이벤트 루프가 순환 할 필요가 없습니다. – zwol

+0

모든 데스크톱이 합성되는 것은 아니므로 불투명 설정을 사용할 수 있습니다. – ssokolow

+0

@Zack : _current_ 응용 프로그램의 이벤트 루프가 순환되지 않도록하려면 하위 프로세스를 포크하고 파이프를 통해 텍스트로 텍스트 영역을 반환하게하십시오. –