g-p-m → dbus → hal → pcc-acpi の関係 [Vine Linux]
普段使ってる VineSeed で気がついたら液晶の明るさが
微妙に暗くなるようになってしまい、しばらくは端末から
# echo 20 > /proc/acpi/pcc/brightness とかやってしの
いでんたんだけど、いいかげん面倒になってきたので時間
を掛けて調べてみた。
まずは取っ掛かりを探すために gnome-power-manager が
何かエラーを出していないか、調べてみることに。
で、$ ggnome-power-manager --no-daemon --verbose として
実行してやると、デバッグメッセージが標準出力に表示される
のが分かったので、つらつらメッセージを見ていると、
dbus を経由して hal を呼び出していることが分かってきた。
そうすると dbus はメッセージをやり取りするだけなので、hal が
怪しくなってくる。
ということで次は lcd とか brightness をとかのキーワードを
使って、$ rpm -ql hal | grep -i lcd のように怪しいファイルが
無いか探してみると、予想通り /usr/lib/hal/scripts/linux に、
hal-system-lcd-get-brightness-linux と hal-system-lcd-set-brightness-linux
というシェルスクリプトが見つかった。
でも、こいつらを読んでいくと単純に /proc/acpi/pcc/brightness
から値を読んだり書いたりしているだけのようで、この動作なら
特に問題無く液晶の輝度を変更できているはず。
さて、何が液晶の最大輝度を低く抑えているのかなぁと、
視点を変えて hal のパッケージを見ていたら、lshal という
コマンドがあるのに気づいた。
で、こいつを実行してその結果を見ていくと、
どうも laptop_panel.num_levels というのが怪しいので、
$ apt-get source hal してソースをごそごそ読んでみた結果、
hal-0.5.9/hald/linux/acpi.c の中で、
と、最大値を16(というか0から数えて15)に決め打ちしている
ことが分かった。
ということで、/proc/acpi/pcc/ac_brightness_max から
最大値を読み込むように簡単 patch を作ってパッケージを
更新してみたところ、微妙に暗くなることは無くなった。
あと明るさの調整アプレットでもちゃんと調整できる
ようになったので、とりあえずは OK かなと。
ただし、Fn + F1/F2 で明るさが変更できない原因までは
特定できなかった。
調べてみると ubuntu でも同じ不具合が報告されている
ので、upstream で修正されないと難しいのかも知れない。
# にしても疲れた。
微妙に暗くなるようになってしまい、しばらくは端末から
# echo 20 > /proc/acpi/pcc/brightness とかやってしの
いでんたんだけど、いいかげん面倒になってきたので時間
を掛けて調べてみた。
まずは取っ掛かりを探すために gnome-power-manager が
何かエラーを出していないか、調べてみることに。
で、$ ggnome-power-manager --no-daemon --verbose として
実行してやると、デバッグメッセージが標準出力に表示される
のが分かったので、つらつらメッセージを見ていると、
dbus を経由して hal を呼び出していることが分かってきた。
そうすると dbus はメッセージをやり取りするだけなので、hal が
怪しくなってくる。
ということで次は lcd とか brightness をとかのキーワードを
使って、$ rpm -ql hal | grep -i lcd のように怪しいファイルが
無いか探してみると、予想通り /usr/lib/hal/scripts/linux に、
hal-system-lcd-get-brightness-linux と hal-system-lcd-set-brightness-linux
というシェルスクリプトが見つかった。
でも、こいつらを読んでいくと単純に /proc/acpi/pcc/brightness
から値を読んだり書いたりしているだけのようで、この動作なら
特に問題無く液晶の輝度を変更できているはず。
さて、何が液晶の最大輝度を低く抑えているのかなぁと、
視点を変えて hal のパッケージを見ていたら、lshal という
コマンドがあるのに気づいた。
で、こいつを実行してその結果を見ていくと、
udi = '/org/freedesktop/Hal/devices/acpi_brightness' info.capabilities = {'laptop_panel'} (string list) info.category = 'laptop_panel' (string) info.interfaces = {'org.freedesktop.Hal.Device.LaptopPanel'} (string list) info.parent = '/org/freedesktop/Hal/devices/computer' (string) info.product = 'Panasonic LCD Panel' (string) info.udi = '/org/freedesktop/Hal/devices/acpi_brightness' (string) laptop_panel.access_method = 'panasonic' (string) laptop_panel.num_levels = 16 (0x10) (int) linux.acpi_path = '/proc/acpi/pcc/brightness' (string) linux.acpi_type = 7 (0x7) (int) linux.hotplug_type = 4 (0x4) (int) org.freedesktop.Hal.Device.LaptopPanel.method_argnames = {'brightness_value', ''} (string list) org.freedesktop.Hal.Device.LaptopPanel.method_execpaths = {'hal-system-lcd-set-brightness', 'hal-system-lcd-get-brightness'} (string list) org.freedesktop.Hal.Device.LaptopPanel.method_names = {'SetBrightness', 'GetBrightness'} (string list) org.freedesktop.Hal.Device.LaptopPanel.method_signatures = {'i', ''} (string list)
どうも laptop_panel.num_levels というのが怪しいので、
$ apt-get source hal してソースをごそごそ読んでみた結果、
hal-0.5.9/hald/linux/acpi.c の中で、
} else if (acpi_type == ACPI_TYPE_PANASONIC_DISPLAY) { gchar proc_path[HAL_PATH_MAX]; type = "panasonic"; desc = "Panasonic LCD Panel"; br_levels = 16;
と、最大値を16(というか0から数えて15)に決め打ちしている
ことが分かった。
ということで、/proc/acpi/pcc/ac_brightness_max から
最大値を読み込むように簡単 patch を作ってパッケージを
更新してみたところ、微妙に暗くなることは無くなった。
あと明るさの調整アプレットでもちゃんと調整できる
ようになったので、とりあえずは OK かなと。
ただし、Fn + F1/F2 で明るさが変更できない原因までは
特定できなかった。
調べてみると ubuntu でも同じ不具合が報告されている
ので、upstream で修正されないと難しいのかも知れない。
# にしても疲れた。
コメント 0