You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
5.8 KiB
148 lines
5.8 KiB
#!/usr/bin/python
|
|
# -*- coding: UTF-8 -*-
|
|
"""
|
|
Copyright 2008 Sebastian Kügler, Canonical Ltd, Luka Renko
|
|
|
|
Authors:
|
|
Andreas Wenning <awen@awen.dk>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
"""
|
|
|
|
"""
|
|
A frontend to HAL's power features for KDE - Helper application
|
|
This application listens for HAL signals and issues dcop-calls to the
|
|
kde-power-manager that originally started it. To avoid the need for
|
|
kde-power-manager to shut it's helper down, this application
|
|
will automatically shut down if it's kde-power-manager isn't running.
|
|
"""
|
|
|
|
import dbus, sys, time
|
|
from dbus.mainloop.glib import DBusGMainLoop
|
|
import gobject
|
|
from dcopext import DCOPClient, DCOPObj, DCOPApp
|
|
|
|
class GPMHelper():
|
|
def mother_alive(self):
|
|
"""Check that our mother is still alive"""
|
|
found = False
|
|
for name in self.dcop.registeredApplications():
|
|
name = str(name)
|
|
if name == self.motherName:
|
|
found = True
|
|
if not found:
|
|
"""No mother; commit suicide"""
|
|
print "guidance-power-manager not alive; exiting"
|
|
loop.quit()
|
|
|
|
"""Called when signal is received"""
|
|
def signal_recv(self, *args):
|
|
if args[0] == "ButtonPressed":
|
|
if args[1] == "brightness-up":
|
|
if time.time()-0.02 <= self.last_brightness_up <= time.time():
|
|
"""Most likely an extra brightness-up call, discarding"""
|
|
print "Extra brightness-up call discarded"
|
|
return
|
|
try:
|
|
ok, foo = self.mother.brightnessUp()
|
|
if not ok:
|
|
print "brightnessUp-call failed"
|
|
return self.mother_alive()
|
|
self.last_brightness_up = time.time()
|
|
except:
|
|
print "brightnessUp-call failed"
|
|
return self.mother_alive()
|
|
elif args[1] == "brightness-down":
|
|
if time.time()-0.02 <= self.last_brightness_down <= time.time():
|
|
"""Most likely an extra brightness-down call, discarding"""
|
|
print "Extra brightness-down call discarded"
|
|
return
|
|
try:
|
|
ok, foo = self.mother.brightnessDown()
|
|
if not ok:
|
|
print "brightnessDown-call failed"
|
|
return self.mother_alive()
|
|
self.last_brightness_down = time.time()
|
|
except:
|
|
print "brightnessDown-call failed"
|
|
return self.mother_alive()
|
|
elif args[1] == "sleep":
|
|
if time.time()-1 <= self.last_sleep <= time.time():
|
|
"""Most likely an extra sleep-call, discarding"""
|
|
print "Extra sleep-call discarded"
|
|
return
|
|
try:
|
|
ok, foo = self.mother.suspend()
|
|
if not ok:
|
|
print "suspend-call failed"
|
|
return self.mother_alive()
|
|
self.last_sleep = time.time()
|
|
except:
|
|
print "suspend-call failed"
|
|
return self.mother_alive()
|
|
elif args[1] == "hibernate":
|
|
if time.time()-1 <= self.last_hibernate <= time.time():
|
|
"""Most likely an extra hibernate-call, discarding"""
|
|
print "Extra hibernate-call discarded"
|
|
return
|
|
try:
|
|
ok, foo = self.mother.hibernate()
|
|
if not ok:
|
|
print "hibernate-call failed"
|
|
return self.mother_alive()
|
|
self.last_hibernate = time.time()
|
|
except:
|
|
print "hibernate failed"
|
|
return self.mother_alive()
|
|
|
|
def __init__(self):
|
|
"""Connect to HAL"""
|
|
self.dbus_loop = DBusGMainLoop(set_as_default=True)
|
|
self.bus = dbus.SystemBus(mainloop=self.dbus_loop)
|
|
hal_manager_obj = self.bus.get_object("org.freedesktop.Hal",u'/org/freedesktop/Hal/Manager')
|
|
self.hal_manager = dbus.Interface(hal_manager_obj, "org.freedesktop.Hal.Manager")
|
|
|
|
"""Find button-devices and to connect to"""
|
|
button_devices = self.hal_manager.FindDeviceByCapability("button")
|
|
for device in button_devices:
|
|
self.bus.add_signal_receiver(self.signal_recv,
|
|
"Condition",
|
|
"org.freedesktop.Hal.Device",
|
|
"org.freedesktop.Hal",
|
|
device)
|
|
"""Let's find our mother"""
|
|
self.dcop = DCOPClient()
|
|
self.dcop.attach()
|
|
found = False
|
|
for name in self.dcop.registeredApplications():
|
|
name = str(name)
|
|
if name.startswith('guidance-'):
|
|
self.motherName = name
|
|
try:
|
|
self.mother = DCOPObj(name, self.dcop, 'power-manager')
|
|
found = True
|
|
except:
|
|
"""Do nothing, catched by found=False"""
|
|
break
|
|
if not found:
|
|
"""No mother; commit suicide"""
|
|
print "No guidance-power-manager is running"
|
|
sys.exit()
|
|
|
|
"""Some laptops issue double sleep/hibernate-calls, we need to discard one in that case"""
|
|
self.last_sleep = 0
|
|
self.last_hibernate = 0
|
|
|
|
"""And multiple brightness calls is also possible"""
|
|
self.last_brightness_up = 0
|
|
self.last_brightness_down = 0
|
|
|
|
if __name__ == "__main__":
|
|
gpmh = GPMHelper()
|
|
loop = gobject.MainLoop()
|
|
loop.run()
|