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 + Downneighbor_desktop.sh 스크립트는 다음과 같다.#!/bin/bash# array referened using ${name[index]}declare -a LAYOUT# direction (horizon 0, vertical 1)# columns and rows, respectively# starting corner, optionalLAYOUT=(`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 -lCURRENT=`xprop -root _NET_CURRENT_DESKTOP | awk -F '=' '{print $2}' | xargs expr 1 +`# vertical or horizontalif [ ${LAYOUT[2]} -eq 0 ]; then HSTEP=`expr $NUMBER / ${LAYOUT[1]}` VSTEP=1 if expr \( $NUMBER / ${LAYOUT[1]} \) \> 0; then HSTEP=`expr $HSTEP + 1` fielse HSTEP=1 VSTEP=`expr $NUMBER / ${LAYOUT[2]}` if expr \( $NUMBER / ${LAYOUT[2]} \) \> 0; then VSTEP=`expr $VSTEP + 1` fificase "${LAYOUT[4]}" in # TODO # starting corner 0-3 as {topleft|topright|bottomright|bottomleft} *) ;;esaccase "$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 ;;esacTO=`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 0fiif [ $TO -lt 1 -o $TO -gt $NUMBER ]; then # do nothing exit 0fiwmctrl -s `expr $TO - 1` |