A few moons ago, I posted how to create a button for #! for suspend the computer on exit, but in those days, Crunchbang was based on Ubuntu, and the software worked diferent.
In the present time, Crunchbang is debian based, so things change a little
The "Exit" command on the openbox main menu opens several buttons so one can choose, those command are:
Cancel, Logout, Reboot and Shutdown
So suspend is out of the list.... those commands are all commands for gdm-control, but gdm-control for suspend is only possible after doing logout, but I wanted to suspend inside the session, so we have to do the trick in other way...
After taking a look at xfce-power-manager, it has suspend function, and after a litle dbus introspection, I found the correct message (http://ubuntuforums.org/archive/index.php/t-410570.html) for dbus that does the trick once xfce-power-manager api supports freedesktop directives (I'm not an expert on any of these things, I just catched some lines here and there)
dbus-send \
--session \
--dest=org.freedesktop.PowerManagement \
--type=method_call \
--print-reply \
--reply-timeout=2000 \
/org/freedesktop/PowerManagement \
org.freedesktop.PowerManagement.Suspend
So, for our How-to....
1 - on a command line sudo gedit /usr/bin/openbox-logout
2 - Change the file where bold text is the new text to add
-----------------------------------
#!/usr/bin/env python
import pygtk
pygtk.require('2.0')
import gtk
import os
class DoTheLogOut:
# Cancel/exit
def delete_event(self, widget, event, data=None):
gtk.main_quit()
return False
# Logout
def logout(self, widget):
os.system("openbox --exit")
# Reboot
def reboot(self, widget):
os.system("gdm-control --reboot && openbox --exit")
# Shutdown
def shutdown(self, widget):
os.system("gdm-control --shutdown && openbox --exit")
# Suspend
def suspend(self, widget):
os.system("dbus-send --session --dest=org.freedesktop.PowerManagement --type=method_call --print-reply --reply-timeout=2000 /org/freedesktop/PowerManagement org.freedesktop.PowerManagement.Suspend")
def __init__(self):
# Create a new window
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_title("Exit? Choose an option:")
self.window.set_resizable(False)
self.window.set_position(1)
self.window.connect("delete_event", self.delete_event)
self.window.set_border_width(20)
# Create a box to pack widgets into
self.box1 = gtk.HBox(False, 0)
self.window.add(self.box1)
# Create cancel button
self.button1 = gtk.Button("_Cancel")
self.button1.set_border_width(10)
self.button1.connect("clicked", self.delete_event, "Changed me mind :)")
self.box1.pack_start(self.button1, True, True, 0)
self.button1.show()
# Create logout button
self.button2 = gtk.Button("_Log out")
self.button2.set_border_width(10)
self.button2.connect("clicked", self.logout)
self.box1.pack_start(self.button2, True, True, 0)
self.button2.show()
# Create reboot button
self.button3 = gtk.Button("_Reboot")
self.button3.set_border_width(10)
self.button3.connect("clicked", self.reboot)
self.box1.pack_start(self.button3, True, True, 0)
self.button3.show()
# Create shutdown button
self.button4 = gtk.Button("_Shutdown")
self.button4.set_border_width(10)
self.button4.connect("clicked", self.shutdown)
self.box1.pack_start(self.button4, True, True, 0)
self.button4.show()
# Create suspend button
self.button5 = gtk.Button("Sus_pend")
self.button5.set_border_width(10)
self.button5.connect("clicked", self.suspend)
self.box1.pack_start(self.button5, True, True, 0)
self.button5.show()
self.box1.show()
self.window.show()
def main():
gtk.main()
if __name__ == "__main__":
gogogo = DoTheLogOut()
main()
3 - Save the file, and there you go
--------------------
Hope this is any good for anyone, as it is for me... You can always configure xfce-power-manager to suspend when you do some action, as "close lid" "press power button" etc, etc....
Thanks for the patch! I noticed that the exit box was still open upon resuming from suspend, so I added another gtk.main_quit() at the end of the suspend function to close the window.
ReplyDelete