当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 屏幕亮度调节保存/恢复 [Dirty Way]
帖子发表于 : 2008-09-17 21:21 

注册: 2008-09-06 2:00
帖子: 418
送出感谢: 0 次
接收感谢: 0 次
因我search不到,可能在放水。可能官方已经或快要解决
我觉得gnome的亮度调节可以做到,我也想去hack它。但是能力有限
想出以下方法(前提是已经能调节亮度)。

以下内容没经过严密测试,还望有人能补充。主要是作亮度恢复的

概要:
通过rc.local 启动 brightness_store

通过 brightness_store 连接 /var/run/acpid.socket,监听“亮度调节”事件
如有亮度调节事件,就把亮度的大小记录到 /opt/brightness_store

在进入 runlevel 5 (rc.local)时把 /opt/brightness_store写回到亮度界面

/usr/local/bin/brightness_store
以下三项每台机不一定相同,需要修改
ACPID_SOCKET = '/var/run/acpid.socket' #acpid的消息接口
BRIGHTNESS_FILE = '/sys/class/backlight/acpi_video0/brightness' #“亮度调节”的驱动接口
BRIGHTNESS_EVENT = 'video C163' #“亮度调节”事件,可以在/var/run/acpid.socket查询得到
代码:
#!/usr/bin/python
import sys,os,time
import socket

TEST = False

CHUNK_SIZE = 100
ACPID_SOCKET = '/var/run/acpid.socket'
BRIGHTNESS_FILE = '/sys/class/backlight/acpi_video0/brightness'
BRIGHTNESS_EVENT = 'video C163'
DELAY_WRITE_SECONDS = 2
if TEST == True:
   BRIGHTNESS_STORE = '  '  #some path path base on /
else:
   BRIGHTNESS_STORE = '/opt/brightness'

def save_brightness(brightness,path=BRIGHTNESS_STORE):
   try:
      f = open(path,'w')
   except IOError, (errno, strerror):
      print "I/O error(%s): %s" % (errno, strerror)
      return
   f.write(brightness)
   f.flush()

def read_brightness(path=BRIGHTNESS_FILE):
   f = open(path,'r')
   f.seek(0)
   brightness = f.read(2)
   return brightness

def event_filter(sock_msg,event):
   if sock_msg[0:len(event)] == event:
      return True
   else:
      return False

def daemonize (stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
   # Double fork thick magic
   # Do first fork.
    try:
        pid = os.fork()
        if pid > 0:
            sys.exit(0) # Exit first parent.
    except OSError, e:
        sys.stderr.write ("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror)   )
        sys.exit(1)
       
    # Decouple from parent environment.
    os.chdir("/")
    os.umask(0)
    os.setsid()
   
    # Do second fork.
    try:
        pid = os.fork()
        if pid > 0:
            sys.exit(0) # Exit second parent.
    except OSError, e:
        sys.stderr.write ("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror)   )
        sys.exit(1)    
       
    # Now I am a daemon!
   
    # Redirect standard file descriptors.
    si = file(stdin, 'r')
    so = file(stdout, 'a+')
    se = file(stderr, 'a+', 0)
    os.dup2(si.fileno(), sys.stdin.fileno())
    os.dup2(so.fileno(), sys.stdout.fileno())
    os.dup2(se.fileno(), sys.stderr.fileno())


def brightness_daemon(sock=ACPID_SOCKET):
   daemonize()
   acpid_sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
   acpid_sock.connect(sock)
   try:
      while True:
         sock_msg = acpid_sock.recv(CHUNK_SIZE)
         if event_filter(sock_msg,BRIGHTNESS_EVENT):
            time.sleep(DELAY_WRITE_SECONDS)
            save_brightness(read_brightness())
         else:
            pass
   except:
      sys.exit()
      
if __name__== '__main__':
   brightness_daemon()



/etc/rc.local
代码:

/usr/local/bin/brightness_store
cat /opt/brightness > /sys/class/backlight/acpi_video0/brightness

exit 0


rc.local 在 laptop-mode-tools 后运行,所以可以与laptop-mode-tools 的亮度控制共存

没经过严密测试,可能存在内存泄露,安全漏洞等问题
还望有人能补充

Ubuntu 8.04 LTS x86_64 AMD Turion X 2


最后由 soiamso 编辑于 2008-11-19 12:33,总共编辑了 4 次

页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-09-17 22:28 
头像

注册: 2008-07-14 22:42
帖子: 8078
地址: Beijing
送出感谢: 0 次
接收感谢: 0 次
我的笔记本好像一直能够正常调节阿? :cry:


_________________
Ubuntu User


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-09-18 0:37 

注册: 2008-09-06 2:00
帖子: 418
送出感谢: 0 次
接收感谢: 0 次
添加了代码改进brightness_store为一个 daemon 守护进程,
可以用但仍然是 dirty way。

原来用crontab的方法是有问题的。

想入非非 写道:
我的笔记本好像一直能够正常调节阿? :cry:


是默认设置吗/KDE/32bit? 我真是不幸运,不能体验ubuntu的畅快。

我是有人问,而且我也是这种情况才想出这种方法的。

能直接改gnome那样更好啦,我到现在都弄不清楚这个是gnome哪个

部分的问题。


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-09-18 13:37 
头像

注册: 2008-07-14 22:42
帖子: 8078
地址: Beijing
送出感谢: 0 次
接收感谢: 0 次
我的是gnome 32位。。。 :lol:


_________________
Ubuntu User


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译