2006/01/28

Windows では、PrintScreen を押すとフルスクリーン、Alt-PrintScreen を押すと、カレントウィンドウのスクリーンショットがクリップボードに保存される。
これって、なんで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>

screenshot-command

追記:
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
Posted at 02:09 | WriteBacks () | Edit
Edit this entry...

wikieditish message: Ready to edit this entry.






















A quick preview will be rendered here when you click "Preview" button.