RaspbianでHDMI出力をしていると操作をしないとモニタがスリープ状態(真っ黒画面)になる。
そこまでは良いのだがモニタのバックライトは点灯しっぱなしだ。
PiTFTというモニタを手に入れたのでこのスリープ時にバックライトを何とか消したいと思った。
しかし、どういうわけかモニタのスリープ状態を読み込むための参考資料が見当たらなかった。
ということでまずモニタのスリープ状態を/dev/shm/sleep_displayにスリープなら1、アクティブなら0と書き出すコードを書いた。
参考にさせてもらったのはこちら
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11157837996
C++のコードだ。
僕はC++はわからないが見た限りXorgのライブラリを読んで300000us(300ms)ごとにXorgの状態を取得し、スリープになれば「/usr/local/bin/blankevent」が存在すれば実行し、モニターが復帰すればループを抜けるというコードだと見える。
なのでこれを改造してファイルを書き出すようにした。
-- /usr/local/lib/dodpsm.cpp --
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <unistd.h>extern "C" {
#include <X11/Xlib.h>
#include <X11/Xproto.h>
#include <X11/extensions/dpms.h>
}Display *dpy = NULL;
CARD16 standby, suspend, off;int main(int argc, const char **argv)
{
dpy = XOpenDisplay(NULL);
if (! dpy) {
fprintf(stderr, "XOpenDisplay failed.\n");
exit(1);
}CARD16 state;
BOOL onoff = False;
for(;;){
usleep(300000);
DPMSInfo(dpy, &state, &onoff);
if(state != 0 && access("/dev/shm",0)==0){
system("echo 1 > /dev/shm/sleep_display");
for(;;){
usleep(300000);
DPMSInfo(dpy, &state, &onoff);
if(state == 0) break;
}
system("echo 0 > /dev/shm/sleep_display");
}
}
}
モニタスリープ時に/dev/shmディレクトリがあれば
"echo 1 > /dev/shm/sleep_display"
が実行され、
アクティブになれば
"echo 0 > /dev/shm/sleep_display"
が実行される。
これをコンパイルして実行ファイルを/usr/local/binに保存する
sudo gcc -o dodpms dodpms.cpp -lXext -lX11
sudo cp dodpms /usr/local/bin
実行権限の忘れずに付ける
sudo chmod 755 /usr/local/bin/dodpms
X起動時にこのプログラムが実行されるように
/etc/lightdm/lightdm.conf
の内容を変更する。
#session-setup-script=
を
session-setup-script=/usr/bin/startscript
と設定して、
ーーー!注ーーーー
[LightDM]以下の
Seat defaults内にある
# session-setup-script =
ではなく、
[SeatDefaults]以下の
session-setup-script=
ーーーーーーーーー
/usr/bin/startscriptを作成する
--- /usr/bin/startscript ---
#!/bin/sh
/usr/local/bin/dodpms &
exit 0
実行権限も忘れないように付ける。
これで再起動でX起動時にstartscriptの内容が実行される。
ファイルにスリープで1、アクティブで0が保存されてたら成功だ。
X起動ににユーザー、パスワードが問われたら今まで作ったファイルの所有者情報が間違っているかもしれないので要確認。