これって、なんでlinuxでは一般的じゃないの?と思っていました。
たとえば ImageMagick 附属の import コマンドでは、キャプチャ対象のウィンドウをグラブポインタで撰択しなければなりません。
で、いろいろ調べてるうちに、どうやらウィンドウマネージャが制御するカレントウィンドウを取得する部分に問題があり、現存の X11 の機構では、ちゃんと取得できないということみたいです。
最近は NETWM と呼ばれる Window Manager の統一的なルールのもと開発されているウィンドウマネージャが主流で、gnome や KDE はもちろん BlackBox 系のウィンドウマネージャもこのspecをサポートしているものがあります。
で、x11pref という xorg 附属のコマンドを実行し、そのプロパティからアクティブなウィンドウIDを取得することができます。
xprop -root | grep ^_NET_ACTIVE_WINDOW | awk '{ print $5 }'
これを使って、import コマンドの -window オプションに渡すと、希望のスクリーンショットコマンドを作ることができます。短めだったので、そのまま掲載します。
~/bin/screenshot
#!/bin/sh
OUT=~/screenshot.jpg
WID=root
rm -f $OUT
if [ "x$1" != "x-root" ]; then
WID=`xprop -root | grep ^_NET_ACTIVE_WINDOW | awk '{ print $5 }'`
[ "x$WID" == "x0x0" ] && WID=root
fi
import -frame -window $WID $OUT
あとは、OpenBox のキーバインドに追加して完成。
~/.conifg/openbox/rc.xml
<keybind key="Print">
<action name="Execute"><execute>screenshot -root</execute></action>
</keybind>
<keybind key="A-Print">
<action name="Execute"><execute>screenshot</execute></action>
</keybind>
追記:
importコマンドは起動までに時間がかかり、取りたいと思った時には既に遅くなってしまったりします。でもって現在では以下のようにxwdで取り込み、convertで変換しています。
#!/bin/sh
OUT=~/screenshot.jpg
TMP=`mktemp /tmp/$$.XXXXXX`
WID=root
rm -f $OUT
if [ "x$1" != "x-root" ]; then
WID=`xprop -root | grep ^_NET_ACTIVE_WINDOW | awk '{ print $5 }'`
[ "x$WID" == "x0x0" ] && WID=root
fi
if [ "x$WID" == "xroot" ]; then
nice xwd -root -frame > $TMP
else
nice xwd -frame -id $WID > $TMP
fi
convert -quality 100 $TMP $OUT
rm $TMP