- Bearbeitet
Obwohl es das wahrscheinlich schon gibt (ich meine CrunchBang hätte sowas) hab ich ein kleines Programm geschrieben, das per GUI die Möglichkeit gibt den Bildschirm zu sperren (xscreensaver), die Openbox-Session zu beenden, den Rechner neuzustarten und selbigen herunterzufahren.
Edit: Mit dem neuen Update kommen (Dank an Army) Suspend und Hibernate dazu, es wird ConsoleKit statt HAL verwendet (dafür muss der WM in einer ck-session laufen) und die Befehle für Logout und Lock Screen sind einfacher anzupassen.
Edit2: Die neue Version erleichtert das Anpassen der Sprache, zusätzlich gibt es eine Möglichkeit das Fenster in den Tray zu minimieren bzw. direkt im Tray zu starten. Dafür wird das Programm mit "-background" , "-bg", "-back" oder "BG" als Parameter aufgerufen.
Aussehen tut das Ganze dann so:
Edit: Mit dem neuen Update kommen (Dank an Army) Suspend und Hibernate dazu, es wird ConsoleKit statt HAL verwendet (dafür muss der WM in einer ck-session laufen) und die Befehle für Logout und Lock Screen sind einfacher anzupassen.
Edit2: Die neue Version erleichtert das Anpassen der Sprache, zusätzlich gibt es eine Möglichkeit das Fenster in den Tray zu minimieren bzw. direkt im Tray zu starten. Dafür wird das Programm mit "-background" , "-bg", "-back" oder "BG" als Parameter aufgerufen.
#!/usr/bin/env python
"""
This programm offers a GUI for several power-management options
such as shutdown, reboot, hibernate and suspend
as well as customizable lock-screen and logout commands
"""
import pygtk
pygtk.require( '2.0' )
import gtk
from os import system
from sys import argv
# Put your custom lock-screen command here
LOCK = "xscreensaver-command -lock"
# Put your WM's logout command here
LOGOUT = "openbox --exit"
# Language - In order to edit the langugage you can modify the second element of each sub-list. You can also edit the order but please keep shutdown the last (otherwise you will have to modify the code that highlights and focuses the shutdown button)
lang = [
[ 'lock', 'Lock Screen' ],
[ 'logout', 'Logout' ],
[ 'suspend', 'Suspend' ],
[ 'hibernate', 'Hibernate' ],
[ 'reboot', 'Reboot' ],
[ 'shutdown', 'Shutdown' ]
]
"""
# German
lang = [
[ 'lock', 'Bildschirm sperren' ],
[ 'logout', 'Logout' ],
[ 'suspend', 'Ruhezustand (RAM)' ],
[ 'hibernate', 'Ruhezustand (Disk)' ],
[ 'reboot', 'Neustart' ],
[ 'shutdown', 'Herunterfahren' ]
]
"""
# Functions that implement the basic functionality
def lock():
system( LOCK )
def logout():
system( LOGOUT )
def suspend():
system( 'dbus-send --system --dest="org.freedesktop.DeviceKit.Power" /org/freedesktop/DeviceKit/Power org.freedesktop.DeviceKit.Power.Suspend' )
def hibernate():
system( 'dbus-send --system --dest="org.freedesktop.DeviceKit.Power" /org/freedesktop/DeviceKit/Power org.freedesktop.DeviceKit.Power.Hibernate' )
def reboot():
system( 'dbus-send --system --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Restart' )
def shutdown():
system( 'dbus-send --system --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop' )
class ExitMenu:
def delete_event( self, widget, event, data=None ):
gtk.main_quit()
return False
def state_event( self, widget, event, data=None ):
if event.changed_mask & gtk.gdk.WINDOW_STATE_ICONIFIED and event.new_window_state & gtk.gdk.WINDOW_STATE_ICONIFIED:
self.window.hide()
self.status.set_visible( True )
def status_clicked( self, widget, data=None ):
self.window.deiconify()
self.window.show()
self.status.set_visible( False )
def action( self, widget, data=None ):
if data == 'lock':
lock()
elif data == 'logout':
logout()
elif data == 'suspend':
suspend()
elif data == 'hibernate':
hibernate()
elif data == 'reboot':
reboot()
elif data == 'shutdown':
shutdown()
gtk.main_quit()
def popup_menu( self, widget, button, time, data=None ):
if data:
data.show_all()
data.popup( None, None, None, 3, time )
def __init__( self ):
self.window = gtk.Window( gtk.WINDOW_TOPLEVEL )
self.window.set_title( "Exit" )
self.window.connect( "delete_event", self.delete_event )
self.window.connect( "window-state-event", self.state_event )
self.window.set_border_width( 20 )
self.window.set_decorated( False )
self.window.set_icon_name( 'exit' )
self.window.set_keep_above( True )
self.window.set_position( gtk.WIN_POS_CENTER )
self.box = gtk.HButtonBox()
self.box.set_spacing( 10 )
self.window.add( self.box )
self.menu = gtk.Menu()
buttons = []
for l in lang:
# Button
b = gtk.Button( l[1] )
b.connect( 'clicked', self.action, l[0] )
b.set_relief( gtk.RELIEF_NONE )
b.show()
self.box.pack_start( b, True, True, 0 )
buttons.append( b )
# MenuItem
m = gtk.MenuItem( l[1] )
m.connect( 'activate', self.action, l[0] )
self.menu.append( m )
# Modify shutdown-button
buttons[-1].modify_bg( gtk.STATE_NORMAL, gtk.gdk.Color( '#FCC' ) )
buttons[-1].set_relief( gtk.RELIEF_NORMAL )
# Status Icon
self.status = gtk.status_icon_new_from_stock( gtk.STOCK_QUIT )
self.status.connect( 'activate', self.status_clicked )
self.status.connect( 'popup_menu', self.popup_menu, self.menu )
self.box.show()
# Focus shutdown-button
buttons[-1].grab_focus()
def main():
gtk.main()
if __name__ == "__main__":
em = ExitMenu()
if len( argv ) > 1 and argv[1] in [ "-background" , "-bg", "-back", "BG"]:
em.window.hide()
em.status.set_visible( True )
else:
em.window.show()
em.status.set_visible( False )
main()
Den Code könnt ihr verwenden, wie ihr lustig seid 😉Aussehen tut das Ganze dann so: