屏幕亮度调节保存/恢复 [Dirty Way]

笔记本/超便携移动PC软硬件相关支持,包括硬件、安装和驱动等
回复
soiamso
帖子: 418
注册时间: 2008-09-06 2:00
送出感谢: 0
接收感谢: 0

屏幕亮度调节保存/恢复 [Dirty Way]

#1

帖子 soiamso » 2008-09-17 21:21

因我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 次。
头像
想入非非
论坛版主
帖子: 8078
注册时间: 2008-07-14 22:42
来自: Beijing
送出感谢: 0
接收感谢: 0
联系:

#2

帖子 想入非非 » 2008-09-17 22:28

我的笔记本好像一直能够正常调节阿? :cry:
Ubuntu User
soiamso
帖子: 418
注册时间: 2008-09-06 2:00
送出感谢: 0
接收感谢: 0

#3

帖子 soiamso » 2008-09-18 0:37

添加了代码改进brightness_store为一个 daemon 守护进程,
可以用但仍然是 dirty way。

原来用crontab的方法是有问题的。
想入非非 写了:我的笔记本好像一直能够正常调节阿? :cry:
是默认设置吗/KDE/32bit? 我真是不幸运,不能体验ubuntu的畅快。

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

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

部分的问题。
头像
想入非非
论坛版主
帖子: 8078
注册时间: 2008-07-14 22:42
来自: Beijing
送出感谢: 0
接收感谢: 0
联系:

#4

帖子 想入非非 » 2008-09-18 13:37

我的是gnome 32位。。。 :lol:
Ubuntu User
回复

回到 “笔记本、UMPC支持”