화면 출력 전환 에 해당하는 글 : 1 개
이것 저것 찾아보았지만 dualhead를 사용하기 위해서는 xrandr(Xorg RandR)을 통해서 하는 것이 현재로서는 가장 수월한 것 같다. (실제로는 옛날 방법들은 잘 먹질 않는다 -.-;)

Virtual screen 설정
일단 xrandr로 dualhead를 사용하기 위해서는 내부화면이든 외부 화면이든 이것들을 합한 것은 하나의 virtual screen에 들어가야 한다. 그런데 intel 945GM chipset의 경우 virtual screen의 크기가 2048x2048을 넘으면 그래픽 가속 기능이 지원되지 않는다고 한다. 그렇게 되면 화면이 진짜 답답하게 움직인다. 그건 용납할 수가 없으니 어쩔 수 없이 virtual screen의 크기는 일단 최대로 잡아서 2048x2048로 설정한다. 이것은 /etc/X11/xorg.conf 에서

Section "Screen"
   Identifier "Default Screen"
   Monitor "Configured Monitor"
   Device "Configured Video Device"
   SubSection "Display"
     Virtual 2048 2048
   EndSubSection
EndSection

와 같이 수정하여 설정할 수 있다.

외부 monitor 활성화 방법
터미널에서 xrandr 명령어를 통해서 활성화할 수 있다. intel 945GM 칩셋의 문제로 virtual screen이 2048x2048을 넘을 수 없기 때문에 외부 화면은 내부 화면의 아래쪽에 붙도록 설정한다. (오른쪽이나 왼쪽에 붙게 하면 가로 길이가 2048을 넘는다. ex, 1366 + 1024 = 2390. 위, 아래로는 여유가 있다. ex, 768 + 1200 = 1968. 그런데 오른쪽이 아니라 아래에 붙게 하면 간혹 좀 헷갈린다. 뭐, 그래도 어쩔 수 없다.)
$ xrandr --output VGA --auto --below LVDS
위 명령에서 VGA는 외부 output이고 LVDS는 내부 output이다. 끌 때는
$ xrandr --output VGA --off
라고 한다.

내부/외부 monitor의 우선순위
xrandr이 훌륭히 일을 처리해 주긴 하지만 중요한 문제가 하나 있다. xrandr로 외부 모니터를 활성화시키면 이것이 주화면이 된다는 것이다. 이것은 VAIO의 내부 LCD가 두번째 CRTC에서만 구동되기 때문이고, 외부 VGA output은 첫번째와 두번째 CRTC 중 어느쪽이라도 사용할 수 있기 때문이다. 그리고 모니터 두개가 다 활성화되면 첫번째 CRTC에서 구동되는 외부 모니터가 목록상 첫번째 녀석이기 때문에 이것이 주화면이 된다. 이걸 제대로 바로잡는 것은 내 힘으로 해결할 수 있는 건 아닌 듯하다.

어쨌거나 이것이 일으키는 가장 큰 문제는 dualhead 상황에서 gnome-panel이 외부 화면으로 옮겨 붙어 버린다는 것이다. 보통의 경우라면 그다지 큰 문제는 아니겠지만 presentation을 하는 경우라면 외부 모니터가 활성화되자마자 사람들은 내 gnome-panel을 보게 될 것이다. 뭔가 찜찜해지게 된다. 다음 글에서 이것을 해결하기 위한 트릭을 찾았다. (아래 URL 참조) 모든 것이 자동으로 후다닥 일어나게 하려면 Fn+F7 펑션키로 구동되는 스크립트에 위 글에서 찾은 꽁수도 포함시켜야 할 듯 하다. 어쨌든 다음의 간단한 명령어를 사용한다.
$ gconftool-2 --type int --set /apps/panel/toplevels/top_panel_screen0/monitor 1
위의 명령어는 외부 모니터가 활성화될 때마다 항상 실행해야 한다. 내부 모니터 하나만 활성화되어 있을 때에는 gnome이 이것을 monitor 0로 인식한다. 실제로 CRTC 1에서 돌고 있더라도 순서만 인식한다. 여기에 외부 모니터가 활성화되면 CRTC 0에서 구동되는 외부 모니터가 순서상 앞이기 때문에 monitor 0가 되고 내부 모니터는 밀려서 monitor 1이 된다. 외부 모니터를 끄면 다시 내부 모니터가 monitor 0가 되는 식이다.

Function key (Fn+F7) 동작 설정
이를 위해서는 두가지 일을 해야 한다.
  • Function key (Fn+F7)를 누르는 acpi event가 발생했을 때 어떤 스크립트가 실행될 것인지를 정한다.
  • 실제 실행될 스크립트를 작성한다.

첫번째 것은 /etc/acpi/events/ 에 acpi가 구동될 때 읽어들일 file을 만들어서 스크립트를 등록하는 작업이다.


곁다리 열기



VAIO TZ27LN 모델의 경우에 등록해야 하는 키 입력 event는 acpi_listen 명령으로 알 수가 있다. terminal에서 다음과 같이 명령하고
$ acpi_listen -t 10
10초 안에 Fn+F7 (LCD와 모니터 그림이 있음) 키를 두세번 천천히 누른다. (-t 10은 10초 동안 acpi event를 잘 듣고 화면에 출력해 준다는 뜻. 그런데 man page를 다 읽어보진 않았지만 acpid에 의해 잡히지 않는, 그러니까 이미 등록돼 있지 않은 event만 여기에 잡히는 것 같음.)
yhyang@beren:~$ acpi_listen -t 5
sony/hotkey SPIC 00000001 00000012
sony/hotkey SPIC 00000001 0000003b
sony/hotkey SPIC 00000001 00000012
sony/hotkey SPIC 00000001 0000003b
sony/hotkey SPIC 00000001 00000012
sony/hotkey SPIC 00000001 0000003b
대충 위와 같은 결과를 보여준다. 0012로 끝나는 것은 키가 눌렸을 때, 003b로 끝나는 것은 키가 release됐을 때의 event이다. (위의 예에서는 Fn+F7 키를 5초 안에 세번 눌렀음.) http://ubuntuforums.org/showthread.php?p=3986738&highlight=VGA#post3986738 에 있는 것과는 약간 다른데 HKEY가 아니고 SPIC가 붙어 있다. 무슨 차이가 있는지는 잘 모르겠지만 일단은 실제 acpi_listen으로 알아낸 것을 쓰기로 한다.

앞에서 알아낸 event를 등록하기 위해서는 /etc/acpi/events/ 에 설정 file을 만들어 넣어야 한다. 이름은 아무거나 해도 되는데 http://ubuntuforums.org/showthread.php?p=3986738&highlight=VGA#post3986738 에 있는 것을 따라서 sony-lcd-mode로 한다. 내용도 거의 그대로 하는데 screen_VGAon() 함수에서 외부 모니터를 켜는 방법을 그냥 --auto가 아니고 --below LVDS가 되게 한다.

function screen_VGAon(){
$SU "export DISPLAY=$DISPLAY; xrandr --output $EXTERNAL_OUTPUT --auto --below $INTERNAL_OUTPUT"
}


패널 위치 조정

그리고 앞에서 panel의 위치를 재조정해주는 것을 추가한다. (이게 잘 안되네)


잘 안되는 이유를 찾아봤는데 다음 글에서와 같이 dbus session id와 관련이 있는 듯하다.
http://ubuntuforums.org/archive/index.php/t-961726.html

일단 DBUS_SESSION_BUS_ADDRESS를 읽어들이는 부분을 추가한다.
# Figure out DBUS session id
source /home/$ON_USER/.dbus/session-bus/`cat /var/lib/dbus/machine-id`-0
export DBUS_SESSION_BUS_ADDRESS

그리고 screen_VGAon() 함수에 panel 위치를 재조정해주는 것을 추가한다.
function screen_VGAon(){
$SU "DISPLAY=$DISPLAY xrandr --output $EXTERNAL_OUTPUT --auto --below $INTERNAL_OUTPUT"
sleep 2
$SU "DISPLAY=$DISPLAY DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS gconftool-2 --type int --set /apps/panel/toplevels/top_panel_screen0/monitor 1"
}

여기에서 중간에 sleep 2가 들어간 것은 외부 모니터를 켠 후에 2초간 기다렸다가 panel 위치를 재조정하라는 것인데, 외부 모니터를 켜고 바로 gconftool을 실행하면 panel이 먹통이 돼 버린다. 이유는 아직 못 찾았다. 최소 2초 기다려서 panel이 외부 모니터로 넘어가면 gconftool을 실행한다. sleep 2 정도면 외부 모니터가 켜지고 약간의 지연 시간이 있는 것을 감안하면 외부 모니터에 실제 보이는 시간은 정말 순간이다. 외부 모니터가 반응이 너무 좋다면 낭패 -.-;;



TODO
  • 화면을 두개를 쓰면 배경화면이 두 화면에 늘어져서 보인다. 한 화면에 하나씩 보이도록 설정 할 것. 이것은 nautilus와 compiz의 충돌 때문이다.
    그런데, 다음 글에 보면 Ubuntu 9.04에 가서나 해결될 것이라고 한다. -.-;;
    http://brainstorm.ubuntu.com/idea/93/


참조 URL들

ps. Tomboy에 적어 놓았던 것을 그냥 긁어 붙이니 영 이상하다. html로 export해서 그것을 그냥 긁어 붙여도 이상하고 html 모드에서 소스를 긁어 붙여도 역시 이상하다. 깔끔하게 옮겨지질 않네.


 이전  1   다음 

fotowall :: ncloud RSS Feeds today : 1   yesterday : 3
total : 177,043