Thursday, June 23, 2011

#! Crunchbang Statler - Enable Suspend Button on Exit

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....

1 comment:

  1. 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

 
Made in Portugal