ㅈㅅㄹ

랩탑에서 타이핑을 하다보면 무심결에 터치패드를 건드려서 엉뚱한 데다 키 입력을 해 댄다든가 하는 짜증나는 경우가 있는데, 이 것 때문에 원래 다 지워주는게 인지상정인 랩탑 제조사 번들 프로그램 중 FN키 활성화 하는 프로그램은 꼭 지우지 않고 남겨 두게 된다. 윈도우야 제조사에서 프로그램을 챙겨 주니 그걸 깔면 되긴 하는 데, 리눅스를 오히려 메인으로 쓰는 내 입장에서는 어쨌든 자구책을 강구할 수 밖에 없다. 그것도 가급적이면 최대한 간단하게...


다행스럽게도 xinput이란 놈이 있어서 간편하게 입력 장치를 컨트롤 할 수 있다. 우선 그냥 쉘에서 xinput을 입력해보자. 아래와 같이 현재 연결되어 있는 입력 장치의 목록을 출력해 줄 것이다.

$ xinput
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ ETPS/2 Elantech Touchpad                  id=12   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ LG HD WebCam                              id=10   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=11   [slave  keyboard (3)]

여기서 ETPS/2 Elantech Touchpad가 내 랩탑에 설치되어 있는 터치패드 입력 장치이다. 물론 이건 노트북 제조사나 모델에 따라 상이할 수 있으니 무엇이 실제 터치패드인 지는 실제로 보고 직접 판단하는 수 밖에 없다. 어쨌건 터치패드 장치의 이름과 id를 알아 냈으니 xinput list-props <device_id>를 입력하여 어떤 property가 있는 지 살펴 보자.

$ xinput list-props 12
Device 'ETPS/2 Elantech Touchpad':
        Device Enabled (139):   1
        Coordinate Transformation Matrix (141): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
        Device Accel Profile (262):     1
        Device Accel Constant Deceleration (263):       2.500000
        Device Accel Adaptive Deceleration (264):       1.000000
        Device Accel Velocity Scaling (265):    12.500000
        Synaptics Edges (266):  110, 2662, 71, 1249
        Synaptics Finger (267): 1, 1, 0
        Synaptics Tap Time (268):       180
        Synaptics Tap Move (269):       135
        Synaptics Tap Durations (270):  180, 100, 100
        Synaptics ClickPad (271):       0
        Synaptics Middle Button Timeout (272):  75
        Synaptics Two-Finger Pressure (273):    282
        Synaptics Two-Finger Width (274):       7
        Synaptics Scrolling Distance (275):     61, 61
        Synaptics Edge Scrolling (276): 1, 1, 0
        Synaptics Two-Finger Scrolling (277):   0, 0
        Synaptics Move Speed (278):     1.000000, 1.750000, 0.065147, 0.000000
        Synaptics Off (279):    2
        Synaptics Locked Drags (280):   0
        Synaptics Locked Drags Timeout (281):   5000
        Synaptics Tap Action (282):     2, 3, 0, 0, 1, 3, 0
        Synaptics Click Action (283):   1, 1, 0
        Synaptics Circular Scrolling (284):     0
        Synaptics Circular Scrolling Distance (285):    0.100000
        Synaptics Circular Scrolling Trigger (286):     0
        Synaptics Circular Pad (287):   0
        Synaptics Palm Detection (288): 0
        Synaptics Palm Dimensions (289):        10, 200
        Synaptics Coasting Speed (290): 20.000000, 50.000000
        Synaptics Pressure Motion (291):        30, 160
        Synaptics Pressure Motion Factor (292): 1.000000, 1.000000
        Synaptics Resolution Detect (293):      1
        Synaptics Grab Event Device (294):      0
        Synaptics Gestures (295):       1
        Synaptics Capabilities (296):   1, 0, 1, 1, 1, 1, 1
        Synaptics Pad Resolution (297): 31, 31
        Synaptics Area (298):   0, 0, 0, 0
        Synaptics Noise Cancellation (299):     15, 15
        Device Product ID (257):        2, 14
        Device Node (258):      "/dev/input/event6"

뭐 여러가지 설정 값들이 쭉 출력 되지만 사실 우리에게 중요 한 것은 장치의 활성화 정보일 뿐이다. 위 리스트의 Device Enabled (139): 1에서 확인 할 수 있듯 현재 내 터치패드 입력은 활성화 되어 있는 상태이다. 이제 이 터치패드를 끄려면? 간단하게 xinput disable <device_id> 명령을 실행하면 되고, 다시 활성화를 시키려면 xinput enable <device_id>를 하면 된다. 비활성화를 시켰다면 터치 패드는 더 이상 동작을 하지 않을 것이고 xinput list-props 명령어로 확인 해도 비 활성화가 되어 있음을 확인할 수 있다.

$ xinput list-props 12
Device 'ETPS/2 Elantech Touchpad':
        Device Enabled (139):   0
        Coordinate Transformation Matrix (141): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
        Device Accel Profile (262):     1
        Device Accel Constant Deceleration (263):       2.500000
        ...

매번 이 짓을 할 수는 없으니, 이제 이걸 이용해서 간단한 스크립트를 만들어 보자. 커맨드 라인에서도 사용할 수 있어야 하겠지만 최종적으로는 단축키에 넣고 쓰게 될 거니 토글을 지원하도록 작성해 보자. 이왕이면 하는 김에 desktop notification까지 띄워서 변경 사항을 표시하도록 해주면 더 좋지 않을까.

#!/bin/sh

XINPUT="xinput"
TP_KEYWORD="Touchpad"
TP_CMD=
TP_ID=`$XINPUT | grep $TP_KEYWORD | awk -F '=' '{ print $2; }' | awk '{ print $1; }'`

if [ -z "$TP_ID" ]; then
    echo "Unable to find touchpad" 1>&2
    exit 1
fi

if [ -n "$1" ]; then
    case $1 in
        on)
            TP_CMD="enable"
            ;;
        off)
            TP_CMD="disable"
            ;;
        *)
            echo "Usage: $0 [on|off]" 1>&2
            echo "\ton  : Turn on touchpad" 1>&2
            echo "\toff : Turn off touchpad" 1>&2
            echo "\tWith no argument, it toggles its state" 1>&2
            exit 1
            ;;
    esac
else
    # toggle
    TP_STATE=`$XINPUT list-props $TP_ID | grep "Device Enabled" | awk -F ':' '{ print $2; }'`
    if [ -n "$TP_STATE" ]; then
        if [ $TP_STATE -eq 0 ]; then
            TP_CMD="enable"
        else
            TP_CMD="disable"
        fi
    else
        echo "Something goes wrong..." 1>&2
        exit 1
    fi
fi

if $XINPUT $TP_CMD $TP_ID; then
    notify-send -i "touchpad_$TP_CMD" -u low "Touchpad "$TP_CMD"d"
fi

위의 쉘 스크립트를 적당한 이름, 가령 touchpad 같은 걸로 저장하고, 이왕 하는 김에 이쁘게 나오도록 아래의 아이콘 이미지들을 /usr/local/share/icons 혹은 ~/.local/share/icons같은 곳에 넣어서 desktop notification을 표시할 때 현재 터치패드 상태 아이콘도 나오도록 하자.



스크립트 자체는 간단하게 on이나 off를 인자로 주면 터치패드를 켜거나 끌 수 있고, 인자 없이 실행하면 현재 상태를 토글한다. 이 스크립트를 Win-F5같은 데다가 글로벌 단축키로 설정해 주면 간편하게 터치패드를 끄거나 켤 수 있다. 주의할 점은 $TP_KEYWORD에 지정되어 있는 문자열인데, 만약 xinput을 실행해서 나오는 터치패드의 장치명이 Touchpad라는 문구를 포함하지 않고 있다면 적당한 다른 키워드로 바꿔줘야 정상적으로 동작할 것이다.



물론 Win-F5같은 키 조합 대신 원래 윈도우에서 쓰는 FN키 조합의 키 바인딩을 사용할 수 있으면 좋겠으나, 내 경우 해당 키를 입력했을 때 acpi_listen으로 살펴보니 적절한 값이 나오지 않아서 포기했다. 관심이 있는 사람들은 Ubuntu 도움말의 LaptopSpecialKeys 항목을 참고해서 시도해 보기 바란다.