X 윈도우‎ > ‎

wmctrl

http://tripie.sweb.cz/utils/wmctrl/

EWMH 규약을 준수하는 창 관리자 환경 하에서, 지정된 창에 대해 어떤 동작을 수행하는 프로그램.
XID나 :SELECT:, :ACTIVE:라는 특별한 값을 받아서 처리한다. :SELECT:는 마우스로 선택하게 하고 :ACTIVE:는 현재 활성창을 대상으로 한다.

비슷한 것으로는 netwmctrl이 있다.

xbindkeys에서 요긴하게 쓰인다. .xbindkeysrc에 아래와 같이 추가한 뒤 다음 스크립트를 만들면 상하좌우 데스크탑으로 이동할 수 있다.
"neighbor_desktop.sh left"
mod5 + Left
"neighbor_desktop.sh right"
mod5 + Right
"neighbor_desktop.sh up"
mod5 + Up
"neighbor_desktop.sh down"
mod5 + Down

neighbor_desktop.sh 스크립트는 다음과 같다.
#!/bin/bash

# array referened using ${name[index]}
declare -a LAYOUT

# direction (horizon 0, vertical 1)
# columns and rows, respectively
# starting corner, optional
LAYOUT=(`xprop -root _NET_DESKTOP_LAYOUT | awk -F '=' '{print $2}' | sed 's/,//g'`)
NUMBER=`xprop -root _NET_NUMBER_OF_DESKTOPS | awk -F '=' '{print $2}'`
    # is equal to wmctrl -d | wc -l
CURRENT=`xprop -root _NET_CURRENT_DESKTOP | awk -F '=' '{print $2}' | xargs expr 1 +`

# vertical or horizontal
if [ ${LAYOUT[2]} -eq 0 ]; then
    HSTEP=`expr $NUMBER / ${LAYOUT[1]}`
    VSTEP=1
    if expr \( $NUMBER / ${LAYOUT[1]} \) \> 0; then
        HSTEP=`expr $HSTEP + 1`
    fi
else
    HSTEP=1
    VSTEP=`expr $NUMBER / ${LAYOUT[2]}`
    if expr \( $NUMBER / ${LAYOUT[2]} \) \> 0; then
        VSTEP=`expr $VSTEP + 1`
    fi
fi

case "${LAYOUT[4]}" in
    # TODO
    # starting corner 0-3 as {topleft|topright|bottomright|bottomleft}
    *)
    ;;
esac

case "$1" in
    left)
        STEP=-$HSTEP
        LEN=$VSTEP
    ;;
    right)
        STEP=$HSTEP
        LEN=$VSTEP
    ;;
    up)
        STEP=-$VSTEP
        LEN=$HSTEP
    ;;
    down)
        STEP=$VSTEP
        LEN=$HSTEP
    ;;
    *)
        echo "Usage: $0 {left|right|up|down}" >&2
        exit 1
    ;;
esac

TO=`expr $CURRENT + $STEP`
COL_CHANGE=`expr \( $CURRENT - 1 \) / $LEN != \( $TO - 1 \) / $LEN`
SINGLE_STEP=`expr \( $TO - $CURRENT \) \* \( $TO - $CURRENT \)`
if [ $COL_CHANGE -eq 1 -a $SINGLE_STEP -eq 1 ]; then
    # do not go from A:4 to B:1 or vice versa
    exit 0
fi

if [ $TO -lt 1 -o $TO -gt $NUMBER ]; then
    # do nothing
    exit 0
fi

wmctrl -s `expr $TO - 1`

Comments