Example #1
0
class OpenboxLogout():

    cmd_shutdown = "shutdown -h now"
    cmd_restart = "reboot"
    cmd_suspend = "pmi action suspend"
    cmd_hibernate = "pmi action hibernate"
    cmd_safesuspend = ""
    cmd_lock = "gnome-screensaver-command -l"
    cmd_switch = "gdm-control --switch-user"
    cmd_logout = "openbox --exit"

    def __init__(self, config=None, local=None):

        if local:
            self.local_mode = True
        else:
            self.local_mode = False

        # Start logger and gettext/i18n
        self.logger = logging.getLogger(self.__class__.__name__)

        if self.local_mode:
            gettext.install('oblogout', 'mo', unicode=1)
        else:
            gettext.install('oblogout',
                            '%s/share/locale' % sys.prefix,
                            unicode=1)

        # Load configuration file
        self.load_config(config)

        # Start the window
        self.__init_window()

    def __init_window(self):
        # Start pyGTK setup
        self.window = gtk.Window()
        # self.window.set_title(_("Openbox Logout"))
        self.window.set_title(_(self.title))

        self.window.connect("destroy", self.quit)
        self.window.connect("key-press-event", self.on_keypress)
        self.window.connect("window-state-event", self.on_window_state_change)

        if not self.window.is_composited():
            self.logger.debug("No compositing, enabling rendered effects")
            # Window isn't composited, enable rendered effects
            self.rendered_effects = True
        else:
            # Link in Cairo rendering events
            self.window.connect('expose-event', self.on_expose)
            self.window.connect('screen-changed', self.on_screen_changed)
            self.on_screen_changed(self.window)
            self.rendered_effects = False

        self.window.set_size_request(620, 200)
        self.window.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("black"))

        self.window.set_decorated(False)
        self.window.set_position(gtk.WIN_POS_CENTER)

        # Create the main panel box
        self.mainpanel = gtk.HBox()

        # Create the button box
        self.buttonpanel = gtk.HButtonBox()
        self.buttonpanel.set_spacing(10)

        # Pack in the button box into the panel box, with two padder boxes
        self.mainpanel.pack_start(gtk.VBox())
        self.mainpanel.pack_start(self.buttonpanel, False, False)
        self.mainpanel.pack_start(gtk.VBox())

        # Add the main panel to the window
        self.window.add(self.mainpanel)

        for button in self.button_list:
            self.__add_button(button, self.buttonpanel)

        if self.rendered_effects == True:
            self.logger.debug("Stepping though render path")
            w = gtk.gdk.get_default_root_window()
            sz = w.get_size()
            pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, sz[0], sz[1])
            pb = pb.get_from_drawable(w, w.get_colormap(), 0, 0, 0, 0, sz[0],
                                      sz[1])

            self.logger.debug("Rendering Fade")
            # Convert Pixbuf to PIL Image
            wh = (pb.get_width(), pb.get_height())
            pilimg = Image.fromstring("RGB", wh, pb.get_pixels())

            pilimg = pilimg.point(lambda p: (p * self.opacity) / 255)

            # "Convert" the PIL to Pixbuf via PixbufLoader
            buf = StringIO.StringIO()
            pilimg.save(buf, "ppm")
            del pilimg
            loader = gtk.gdk.PixbufLoader("pnm")
            loader.write(buf.getvalue())
            pixbuf = loader.get_pixbuf()

            # Cleanup IO
            buf.close()
            loader.close()

            pixmap, mask = pixbuf.render_pixmap_and_mask()
            # width, height = pixmap.get_size()
        else:
            pixmap = None

        self.window.set_app_paintable(True)
        self.window.resize(gtk.gdk.screen_width(), gtk.gdk.screen_height())
        self.window.realize()

        if pixmap:
            self.window.window.set_back_pixmap(pixmap, False)
        self.window.move(0, 0)

    def load_config(self, config):
        """ Load the configuration file and parse entries, when encountering a issue
            change safe defaults """

        self.parser = ConfigParser.SafeConfigParser()
        self.parser.read(config)

        # Set some safe defaults
        self.opacity = 50
        self.button_theme = "default"
        self.bgcolor = gtk.gdk.color_parse("black")
        blist = ""

        # Check if we're using HAL, and init it as required.
        if self.parser.has_section("settings"):

            if self.parser.has_option("settings", "usehal"):
                self.usehal = self.parser.getboolean("settings", "usehal")
            else:
                self.usehal = True

            if self.parser.has_option("settings", "title"):
                self.title = self.parser.get("settings", "title")
            else:
                self.title = Logout

        if self.usehal:
            from dbushandler import DbusController
            self.dbus = DbusController()

        # Check the looks section and load the config as required
        if self.parser.has_section("looks"):

            if self.parser.has_option("looks", "opacity"):
                self.opacity = self.parser.getint("looks", "opacity")

            if self.parser.has_option("looks", "buttontheme"):
                self.button_theme = self.parser.get("looks", "buttontheme")

            if self.parser.has_option("looks", "bgcolor"):
                try:
                    self.bgcolor = gtk.gdk.color_parse(
                        self.parser.get("looks", "bgcolor"))
                except:
                    self.logger.warning(
                        _("Color %s is not a valid color, defaulting to black")
                        % self.parser.get("looks", "bgcolor"))
                    self.bgcolor = gtk.gdk.color_parse("black")

            if self.parser.has_option("looks", "opacity"):
                blist = self.parser.get("looks", "buttons")

        # Parse shortcuts section and load them into a array for later reference.
            if self.parser.has_section("shortcuts"):
                self.shortcut_keys = self.parser.items("shortcuts")
                self.logger.debug("Shortcut Options: %s" % self.shortcut_keys)

        # Parse in commands section of the configuration file. Check for valid keys and set the attribs on self
        if self.parser.has_section("commands"):
            for key in self.parser.items("commands"):
                if key[0] in [
                        'logout', 'restart', 'shutdown', 'suspend',
                        'hibernate', 'safesuspend', 'lock', 'switch'
                ]:
                    if key[1]:
                        self.logger.debug("Setting cmd_%s as %s" %
                                          (key[0], key[1]))
                        setattr(self, "cmd_" + key[0], key[1])

        # Load theme information from local directory if local mode is set
        if self.local_mode:
            self.theme_prefix = "./data/themes"
        else:
            self.theme_prefix = "%s/share/themes" % sys.prefix

        self.img_path = "%s/%s/oblogout" % (self.theme_prefix,
                                            self.button_theme)

        if os.path.exists("%s/.themes/%s/oblogout" %
                          (os.environ['HOME'], self.button_theme)):
            # Found a valid theme folder in the userdir, use that
            self.img_path = "%s/.themes/%s/oblogout" % (os.environ['HOME'],
                                                        self.button_theme)
            self.logger.info("Using user theme at %s" % self.img_path)
        else:
            if not os.path.exists("%s/%s/oblogout" %
                                  (self.theme_prefix, self.button_theme)):
                self.logger.warning(
                    "Button theme %s not found, reverting to default" %
                    self.button_theme)
                self.button_theme = 'foom'

        # Parse button list from config file.
        validbuttons = [
            'cancel', 'logout', 'restart', 'shutdown', 'suspend', 'hibernate',
            'safesuspend', 'lock', 'switch'
        ]
        buttonname = [
            _('cancel'),
            _('logout'),
            _('restart'),
            _('shutdown'),
            _('suspend'),
            _('hibernate'),
            _('safesuspend'),
            _('lock'),
            _('switch')
        ]

        if not blist:
            list = validbuttons
        elif blist == "default":
            list = validbuttons
        else:
            list = map(lambda button: string.strip(button), blist.split(","))

        # Validate the button list
        for button in list:
            self.logger.debug(_("Validating button: %s" % button))
            if not button in validbuttons:
                self.logger.warning(
                    _("Button %s is not a valid button name, removing") %
                    button)
                list.remove(button)
            else:
                if self.usehal and button in [
                        'restart', 'shutdown', 'suspend', 'hibernate',
                        'safesuspend'
                ]:
                    if not self.dbus.check_ability(button):
                        self.logger.warning(
                            _("Can't %s, disabling button" % button))
                        list.remove(button)
                else:
                    if button != "cancel":
                        try:
                            self.logger.debug(
                                _("Cmd Value for %s: %s" %
                                  (button, getattr(self, "cmd_" + button))))
                            if getattr(self, "cmd_" + button) == "None":
                                self.logger.warning(
                                    _("Command for button %s is undefined, removing."
                                      % button))
                                list.remove(button)
                        except:
                            self.logger.warning(
                                _("Command for button %s is undefined, removing."
                                  % button))
                            list.remove(button)

        if len(list) == 0:
            self.logger.warning(
                _("No valid buttons found, resetting to defaults"))
            self.button_list = validbuttons
        else:
            self.logger.debug("Validated Button List: %s" % list)
            self.button_list = list

    def on_expose(self, widget, event):

        cr = widget.window.cairo_create()

        if self.supports_alpha == True:
            cr.set_source_rgba(1.0, 1.0, 1.0, 0.0)  # Transparent
        else:
            cr.set_source_rgb(1.0, 1.0, 1.0)  # Opaque white

        # Draw the background
        cr.set_operator(cairo.OPERATOR_SOURCE)
        cr.paint()

        (width, height) = widget.get_size()
        cr.set_source_rgba(self.bgcolor.red, self.bgcolor.green,
                           self.bgcolor.blue,
                           float(self.opacity) / 100)

        cr.rectangle(0, 0, width, height)
        cr.fill()
        cr.stroke()
        return False

    def on_screen_changed(self, widget, old_screen=None):

        # To check if the display supports alpha channels, get the colormap
        screen = widget.get_screen()
        colormap = screen.get_rgba_colormap()
        if colormap == None:
            self.logger.debug("Screen does not support alpha channels!")
            colormap = screen.get_rgb_colormap()
            self.supports_alpha = False
        else:
            self.logger.debug("Screen supports alpha channels!")
            self.supports_alpha = True

        # Now we have a colormap appropriate for the screen, use it
        widget.set_colormap(colormap)

    def on_window_state_change(self, widget, event, *args):
        if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN:
            self.window_in_fullscreen = True
        else:
            self.window_in_fullscreen = False

    def __add_button(self, name, widget):
        """ Add a button to the panel """

        box = gtk.VBox()

        image = gtk.Image()
        if os.path.exists("%s/%s.svg" % (self.img_path, name)):
            image.set_from_file("%s/%s.svg" % (self.img_path, name))
        else:
            image.set_from_file("%s/%s.png" % (self.img_path, name))
        image.show()

        button = gtk.Button()
        button.set_relief(gtk.RELIEF_NONE)
        button.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("black"))
        button.set_focus_on_click(False)
        button.set_border_width(0)
        button.set_property('can-focus', False)
        button.add(image)
        button.show()
        box.pack_start(button, False, False)
        button.connect("clicked", self.click_button, name)

        label = gtk.Label(_(name))
        label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse("white"))
        box.pack_end(label, False, False)

        widget.pack_start(box, False, False)

    def click_button(self, widget, data=None):
        if (data == 'logout'):
            self.__exec_cmd(self.cmd_logout)

        elif (data == 'restart'):
            if self.usehal:
                self.dbus.restart()
            else:
                self.__exec_cmd(self.cmd_restart)

        elif (data == 'shutdown'):
            if self.usehal:
                self.dbus.shutdown()
            else:
                self.__exec_cmd(self.cmd_shutdown)

        elif (data == 'suspend'):
            self.window.hide()
            if self.usehal:
                self.dbus.suspend()

            else:
                self.__exec_cmd(self.cmd_suspend)

        elif (data == 'hibernate'):
            self.window.hide()
            if self.usehal:
                self.dbus.hibernate()
            else:
                self.__exec_cmd(self.cmd_hibernate)

        elif (data == 'safesuspend'):
            self.window.hide()

            if self.usehal:
                self.dbus.safesuspend()
            else:
                self.__exec_cmd(self.cmd_safesuspend)

        elif (data == 'lock'):
            self.__lock_screen()

        elif (data == 'switch'):
            self.__exec_cmd(self.cmd_switch)

        self.quit()

    def on_keypress(self, widget=None, event=None, data=None):
        self.logger.debug("Keypress: %s/%s" %
                          (event.keyval, gtk.gdk.keyval_name(event.keyval)))
        for key in self.shortcut_keys:
            if event.keyval == gtk.gdk.keyval_to_lower(
                    gtk.gdk.keyval_from_name(key[1])):
                self.logger.debug("Matched %s" % key[0])
                self.click_button(widget, key[0])

    def __lock_screen(self):
        if self.cmd_lock:
            self.__exec_cmd(self.cmd_lock)

    def __exec_cmd(self, cmdline):
        self.logger.debug("Executing command: %s", cmdline)
        os.system(cmdline)

    def quit(self, widget=None, data=None):
        gtk.main_quit()

    def run_logout(self):
        self.window.show_all()
        gtk.main()
Example #2
0
class OpenboxLogout():

    cmd_shutdown = "shutdown -h now"
    cmd_restart = "reboot"
    cmd_suspend = "pmi action suspend"
    cmd_hibernate = "pmi action hibernate"
    cmd_safesuspend = ""
    cmd_lock = "gnome-screensaver-command -l"
    cmd_switch = "gdm-control --switch-user"
    cmd_logout = "openbox --exit"

    def __init__(self, config=None, local=None):
      
        if local:
            self.local_mode = True
        else:
            self.local_mode = False
    
        # Start logger and gettext/i18n
        self.logger = logging.getLogger(self.__class__.__name__)
        
        if self.local_mode:
            gettext.install('oblogout', 'mo', unicode=1)  
        else:   
            gettext.install('oblogout', '%s/share/locale' % sys.prefix, unicode=1)      
        
        # Load configuration file
        self.load_config(config)
                                        
        # Start the window
        self.__init_window()
        
    def __init_window(self):       
        # Start pyGTK setup       
        self.window = gtk.Window()        
        self.window.set_title(_("Openbox Logout"))
        
        self.window.connect("destroy", self.quit)
        self.window.connect("key-press-event", self.on_keypress)
        self.window.connect("window-state-event", self.on_window_state_change)
        
        if not self.window.is_composited():
            self.logger.debug("No compositing, enabling rendered effects")
            # Window isn't composited, enable rendered effects
            self.rendered_effects = True
        else:
            # Link in Cairo rendering events
            self.window.connect('expose-event', self.on_expose)
            self.window.connect('screen-changed', self.on_screen_changed)
            self.on_screen_changed(self.window)
            self.rendered_effects = False
        
        self.window.set_size_request(620,200)
        self.window.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("black"))
                   
        self.window.set_decorated(False)
        self.window.set_position(gtk.WIN_POS_CENTER)
        
        # Create the main panel box
        self.mainpanel = gtk.HBox()
        
        # Create the button box
        self.buttonpanel = gtk.HButtonBox()
        self.buttonpanel.set_spacing(10)
        
        # Pack in the button box into the panel box, with two padder boxes
        self.mainpanel.pack_start(gtk.VBox())
        self.mainpanel.pack_start(self.buttonpanel, False, False)
        self.mainpanel.pack_start(gtk.VBox())
                
        # Add the main panel to the window
        self.window.add(self.mainpanel)
         
        for button in self.button_list:
            self.__add_button(button, self.buttonpanel)        
                                          
        if self.rendered_effects == True:    
            self.logger.debug("Stepping though render path")
            w = gtk.gdk.get_default_root_window()
            sz = w.get_size()
            pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB,False,8,sz[0],sz[1])
            pb = pb.get_from_drawable(w,w.get_colormap(),0,0,0,0,sz[0],sz[1])

            self.logger.debug("Rendering Fade")
            # Convert Pixbuf to PIL Image
            wh = (pb.get_width(),pb.get_height())
            pilimg = Image.fromstring("RGB", wh, pb.get_pixels())
            
            pilimg = pilimg.point(lambda p: (p * self.opacity) / 255 )

            # "Convert" the PIL to Pixbuf via PixbufLoader
            buf = StringIO.StringIO()
            pilimg.save(buf, "ppm")
            del pilimg
            loader = gtk.gdk.PixbufLoader("pnm")
            loader.write(buf.getvalue())
            pixbuf = loader.get_pixbuf()

            # Cleanup IO
            buf.close()
            loader.close()

            pixmap, mask = pixbuf.render_pixmap_and_mask()
            # width, height = pixmap.get_size()
        else:
            pixmap = None
    
        self.window.set_app_paintable(True)
        self.window.resize(gtk.gdk.screen_width(), gtk.gdk.screen_height())
        self.window.realize()
                
        if pixmap:
            self.window.window.set_back_pixmap(pixmap, False)
        self.window.move(0,0)
        

    def load_config(self, config):
        """ Load the configuration file and parse entries, when encountering a issue
            change safe defaults """
            
        self.parser = ConfigParser.SafeConfigParser()
        self.parser.read(config)
        
        # Set some safe defaults
        self.opacity = 50
        self.button_theme = "default"
        self.bgcolor = gtk.gdk.color_parse("black")
        blist = ""
        
        # Check if we're using HAL, and init it as required.
        if self.parser.has_section("settings"):
            
            if self.parser.has_option("settings","usehal"):
                self.usehal = self.parser.getboolean("settings","usehal")
            else:
                self.usehal = True
            
        if self.usehal:    
            from dbushandler import DbusController
            self.dbus = DbusController()  
        
        # Check the looks section and load the config as required
        if self.parser.has_section("looks"):
                
            if self.parser.has_option("looks", "opacity"):
                self.opacity = self.parser.getint("looks", "opacity")  
                    
            if self.parser.has_option("looks","buttontheme"):
                self.button_theme = self.parser.get("looks", "buttontheme")
                
            if self.parser.has_option("looks", "bgcolor"):  
            	try:
                	self.bgcolor = gtk.gdk.color_parse(self.parser.get("looks", "bgcolor"))
                except:
                	self.logger.warning(_("Color %s is not a valid color, defaulting to black") % self.parser.get("looks", "bgcolor"))
                	self.bgcolor = gtk.gdk.color_parse("black")
                
            if self.parser.has_option("looks", "opacity"):
                blist = self.parser.get("looks", "buttons")
	    
        # Parse shortcuts section and load them into a array for later reference.
	    if self.parser.has_section("shortcuts"):
	        self.shortcut_keys = self.parser.items("shortcuts")
	        self.logger.debug("Shortcut Options: %s" % self.shortcut_keys)

         
        # Parse in commands section of the configuration file. Check for valid keys and set the attribs on self
        if self.parser.has_section("commands"):
            for key in self.parser.items("commands"):
                if key[0] in ['logout', 'restart', 'shutdown', 'suspend', 'hibernate', 'safesuspend', 'lock', 'switch']:
                    if key[1]: 
                        self.logger.debug("Setting cmd_%s as %s" % (key[0], key[1]))
                        setattr(self, "cmd_" + key[0], key[1])

        # Load theme information from local directory if local mode is set
        if self.local_mode:
            self.theme_prefix = "./data/themes"
        else:
            self.theme_prefix = "%s/share/themes" % sys.prefix
             
        self.img_path = "%s/%s/oblogout" % (self.theme_prefix, self.button_theme)                  

        if os.path.exists("%s/.themes/%s/oblogout" % (os.environ['HOME'], self.button_theme)):
            # Found a valid theme folder in the userdir, use that
            self.img_path = "%s/.themes/%s/oblogout" % (os.environ['HOME'], self.button_theme)
            self.logger.info("Using user theme at %s" % self.img_path)
        else:
            if not os.path.exists("%s/%s/oblogout" % (self.theme_prefix, self.button_theme)):
                self.logger.warning("Button theme %s not found, reverting to default" % self.button_theme)
                self.button_theme = 'foom'
        

        # Parse button list from config file.
        validbuttons = ['cancel', 'logout', 'restart', 'shutdown', 'suspend', 'hibernate', 'safesuspend', 'lock', 'switch']  
        buttonname = [_('cancel'), _('logout'), _('restart'), _('shutdown'), _('suspend'), _('hibernate'), _('safesuspend'), _('lock'), _('switch')]       

        if not blist:
            list = validbuttons
        elif blist == "default":
            list = validbuttons
        else:
            list = map(lambda button: string.strip(button), blist.split(","))
                    
        # Validate the button list
        for button in list:
            self.logger.debug(_("Validating button: %s" % button))
            if not button in validbuttons:
                self.logger.warning(_("Button %s is not a valid button name, removing") % button)
                list.remove(button)
            else:
                if self.usehal and button in ['restart', 'shutdown', 'suspend', 'hibernate', 'safesuspend']:
                    if not self.dbus.check_ability(button):
                        self.logger.warning(_("Can't %s, disabling button" % button))
                        list.remove(button)
                else:
                    if button != "cancel":
                        try:
                            self.logger.debug(_("Cmd Value for %s: %s" % (button, getattr(self, "cmd_" + button))))
                            if getattr(self, "cmd_" + button) == "None":
                                self.logger.warning(_("Command for button %s is undefined, removing." % button))
                                list.remove(button)
                        except:
                            self.logger.warning(_("Command for button %s is undefined, removing." % button))
                            list.remove(button)      
                        
        if len(list) == 0:
            self.logger.warning(_("No valid buttons found, resetting to defaults"))
            self.button_list = validbuttons
        else:
            self.logger.debug("Validated Button List: %s" % list)
            self.button_list = list
                                     
                
    def on_expose(self, widget, event):
       
        cr = widget.window.cairo_create()
    
        if self.supports_alpha == True:
            cr.set_source_rgba(1.0, 1.0, 1.0, 0.0) # Transparent
        else:
            cr.set_source_rgb(1.0, 1.0, 1.0) # Opaque white
    
        # Draw the background
        cr.set_operator(cairo.OPERATOR_SOURCE)
        cr.paint()

        (width, height) = widget.get_size()
        cr.set_source_rgba(self.bgcolor.red, self.bgcolor.green, self.bgcolor.blue, float(self.opacity)/100)
       
        cr.rectangle(0, 0, width, height)
        cr.fill()
        cr.stroke()
        return False
        
    def on_screen_changed(self, widget, old_screen=None):
       
        # To check if the display supports alpha channels, get the colormap
        screen = widget.get_screen()
        colormap = screen.get_rgba_colormap()
        if colormap == None:
            self.logger.debug("Screen does not support alpha channels!")
            colormap = screen.get_rgb_colormap()
            self.supports_alpha = False
        else:
            self.logger.debug("Screen supports alpha channels!")
            self.supports_alpha = True
    
        # Now we have a colormap appropriate for the screen, use it
        widget.set_colormap(colormap)

    def on_window_state_change(self, widget, event, *args):
        if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN:
            self.window_in_fullscreen = True
        else:
            self.window_in_fullscreen = False

    def __add_button(self, name, widget):
        """ Add a button to the panel """
    
        box = gtk.VBox()
   
        image = gtk.Image()
        if os.path.exists("%s/%s.svg" % (self.img_path, name)):
            image.set_from_file("%s/%s.svg" % (self.img_path, name))
        else:
            image.set_from_file("%s/%s.png" % (self.img_path, name))
        image.show()
        
        button = gtk.Button()
        button.set_relief(gtk.RELIEF_NONE)
        button.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("black"))
        button.set_focus_on_click(False)
        button.set_border_width(0)
        button.set_property('can-focus', False) 
        button.add(image)
        button.show()
        box.pack_start(button, False, False)
        button.connect("clicked", self.click_button, name)
        
        label = gtk.Label(_(name))
        label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse("white"))
        box.pack_end(label, False, False)
        
        widget.pack_start(box, False, False)

    def click_button(self, widget, data=None):
        if (data == 'logout'):
            self.__exec_cmd(self.cmd_logout)
            
        elif (data == 'restart'):
            if self.usehal:
                self.dbus.restart()
            else:
                self.__exec_cmd(self.cmd_restart)
                
        elif (data == 'shutdown'):
            if self.usehal:
                self.dbus.shutdown()
            else:
                self.__exec_cmd(self.cmd_shutdown)
                
        elif (data == 'suspend'):
            self.window.hide()
            self.__lock_screen()
            if self.usehal:
                self.dbus.suspend()
            
            else:
                self.__exec_cmd(self.cmd_suspend)
                
        elif (data == 'hibernate'):
            self.window.hide()
            self.__lock_screen()
            if self.usehal:
                self.dbus.hibernate()
            else:
                self.__exec_cmd(self.cmd_hibernate) 
                    
        elif (data == 'safesuspend'):
            self.window.hide()
            
            if self.usehal:
                self.dbus.safesuspend()
            else:
                self.__exec_cmd(self.cmd_safesuspend) 
                  
        elif (data == 'lock'):
            self.__lock_screen()
            
        elif (data == 'switch'):
            self.__exec_cmd(self.cmd_switch)

        self.quit()
            
    def on_keypress(self, widget=None, event=None, data=None):
        self.logger.debug("Keypress: %s/%s" % (event.keyval, gtk.gdk.keyval_name(event.keyval)))
        for key in self.shortcut_keys:
            if event.keyval == gtk.gdk.keyval_to_lower(gtk.gdk.keyval_from_name(key[1])):
                self.logger.debug("Matched %s" % key[0])
                self.click_button(widget, key[0])
    
    def __lock_screen(self):
        if self.cmd_lock:
            self.__exec_cmd(self.cmd_lock)

    def __exec_cmd(self, cmdline):
        self.logger.debug("Executing command: %s", cmdline)
        os.system(cmdline)
           
    def quit(self, widget=None, data=None):
        gtk.main_quit()

    def run_logout(self):
        self.window.show_all()
        gtk.main()
Example #3
0
    def load_config(self, config):
        """ Load the configuration file and parse entries, when encountering a issue
            change safe defaults """

        self.parser = ConfigParser.SafeConfigParser()
        self.parser.read(config)

        # Set some safe defaults
        self.opacity = 50
        self.button_theme = "default"
        self.bgcolor = gtk.gdk.color_parse("black")
        blist = ""

        # Check if we're using HAL, and init it as required.
        if self.parser.has_section("settings"):

            if self.parser.has_option("settings", "usehal"):
                self.usehal = self.parser.getboolean("settings", "usehal")
            else:
                self.usehal = True

            if self.parser.has_option("settings", "title"):
                self.title = self.parser.get("settings", "title")
            else:
                self.title = Logout

        if self.usehal:
            from dbushandler import DbusController
            self.dbus = DbusController()

        # Check the looks section and load the config as required
        if self.parser.has_section("looks"):

            if self.parser.has_option("looks", "opacity"):
                self.opacity = self.parser.getint("looks", "opacity")

            if self.parser.has_option("looks", "buttontheme"):
                self.button_theme = self.parser.get("looks", "buttontheme")

            if self.parser.has_option("looks", "bgcolor"):
                try:
                    self.bgcolor = gtk.gdk.color_parse(
                        self.parser.get("looks", "bgcolor"))
                except:
                    self.logger.warning(
                        _("Color %s is not a valid color, defaulting to black")
                        % self.parser.get("looks", "bgcolor"))
                    self.bgcolor = gtk.gdk.color_parse("black")

            if self.parser.has_option("looks", "opacity"):
                blist = self.parser.get("looks", "buttons")

        # Parse shortcuts section and load them into a array for later reference.
            if self.parser.has_section("shortcuts"):
                self.shortcut_keys = self.parser.items("shortcuts")
                self.logger.debug("Shortcut Options: %s" % self.shortcut_keys)

        # Parse in commands section of the configuration file. Check for valid keys and set the attribs on self
        if self.parser.has_section("commands"):
            for key in self.parser.items("commands"):
                if key[0] in [
                        'logout', 'restart', 'shutdown', 'suspend',
                        'hibernate', 'safesuspend', 'lock', 'switch'
                ]:
                    if key[1]:
                        self.logger.debug("Setting cmd_%s as %s" %
                                          (key[0], key[1]))
                        setattr(self, "cmd_" + key[0], key[1])

        # Load theme information from local directory if local mode is set
        if self.local_mode:
            self.theme_prefix = "./data/themes"
        else:
            self.theme_prefix = "%s/share/themes" % sys.prefix

        self.img_path = "%s/%s/oblogout" % (self.theme_prefix,
                                            self.button_theme)

        if os.path.exists("%s/.themes/%s/oblogout" %
                          (os.environ['HOME'], self.button_theme)):
            # Found a valid theme folder in the userdir, use that
            self.img_path = "%s/.themes/%s/oblogout" % (os.environ['HOME'],
                                                        self.button_theme)
            self.logger.info("Using user theme at %s" % self.img_path)
        else:
            if not os.path.exists("%s/%s/oblogout" %
                                  (self.theme_prefix, self.button_theme)):
                self.logger.warning(
                    "Button theme %s not found, reverting to default" %
                    self.button_theme)
                self.button_theme = 'foom'

        # Parse button list from config file.
        validbuttons = [
            'cancel', 'logout', 'restart', 'shutdown', 'suspend', 'hibernate',
            'safesuspend', 'lock', 'switch'
        ]
        buttonname = [
            _('cancel'),
            _('logout'),
            _('restart'),
            _('shutdown'),
            _('suspend'),
            _('hibernate'),
            _('safesuspend'),
            _('lock'),
            _('switch')
        ]

        if not blist:
            list = validbuttons
        elif blist == "default":
            list = validbuttons
        else:
            list = map(lambda button: string.strip(button), blist.split(","))

        # Validate the button list
        for button in list:
            self.logger.debug(_("Validating button: %s" % button))
            if not button in validbuttons:
                self.logger.warning(
                    _("Button %s is not a valid button name, removing") %
                    button)
                list.remove(button)
            else:
                if self.usehal and button in [
                        'restart', 'shutdown', 'suspend', 'hibernate',
                        'safesuspend'
                ]:
                    if not self.dbus.check_ability(button):
                        self.logger.warning(
                            _("Can't %s, disabling button" % button))
                        list.remove(button)
                else:
                    if button != "cancel":
                        try:
                            self.logger.debug(
                                _("Cmd Value for %s: %s" %
                                  (button, getattr(self, "cmd_" + button))))
                            if getattr(self, "cmd_" + button) == "None":
                                self.logger.warning(
                                    _("Command for button %s is undefined, removing."
                                      % button))
                                list.remove(button)
                        except:
                            self.logger.warning(
                                _("Command for button %s is undefined, removing."
                                  % button))
                            list.remove(button)

        if len(list) == 0:
            self.logger.warning(
                _("No valid buttons found, resetting to defaults"))
            self.button_list = validbuttons
        else:
            self.logger.debug("Validated Button List: %s" % list)
            self.button_list = list
Example #4
0
    def load_config(self, config):
        """ Load the configuration file and parse entries, when encountering a issue
            change safe defaults """
            
        self.parser = ConfigParser.SafeConfigParser()
        self.parser.read(config)
        
        # Set some safe defaults
        self.opacity = 50
        self.button_theme = "default"
        self.bgcolor = gtk.gdk.color_parse("black")
        blist = ""
        
        # Check if we're using HAL, and init it as required.
        if self.parser.has_section("settings"):
            
            if self.parser.has_option("settings","usehal"):
                self.usehal = self.parser.getboolean("settings","usehal")
            else:
                self.usehal = True
            
        if self.usehal:    
            from dbushandler import DbusController
            self.dbus = DbusController()  
        
        # Check the looks section and load the config as required
        if self.parser.has_section("looks"):
                
            if self.parser.has_option("looks", "opacity"):
                self.opacity = self.parser.getint("looks", "opacity")  
                    
            if self.parser.has_option("looks","buttontheme"):
                self.button_theme = self.parser.get("looks", "buttontheme")
                
            if self.parser.has_option("looks", "bgcolor"):  
            	try:
                	self.bgcolor = gtk.gdk.color_parse(self.parser.get("looks", "bgcolor"))
                except:
                	self.logger.warning(_("Color %s is not a valid color, defaulting to black") % self.parser.get("looks", "bgcolor"))
                	self.bgcolor = gtk.gdk.color_parse("black")
                
            if self.parser.has_option("looks", "opacity"):
                blist = self.parser.get("looks", "buttons")
	    
        # Parse shortcuts section and load them into a array for later reference.
	    if self.parser.has_section("shortcuts"):
	        self.shortcut_keys = self.parser.items("shortcuts")
	        self.logger.debug("Shortcut Options: %s" % self.shortcut_keys)

         
        # Parse in commands section of the configuration file. Check for valid keys and set the attribs on self
        if self.parser.has_section("commands"):
            for key in self.parser.items("commands"):
                if key[0] in ['logout', 'restart', 'shutdown', 'suspend', 'hibernate', 'safesuspend', 'lock', 'switch']:
                    if key[1]: 
                        self.logger.debug("Setting cmd_%s as %s" % (key[0], key[1]))
                        setattr(self, "cmd_" + key[0], key[1])

        # Load theme information from local directory if local mode is set
        if self.local_mode:
            self.theme_prefix = "./data/themes"
        else:
            self.theme_prefix = "%s/share/themes" % sys.prefix
             
        self.img_path = "%s/%s/oblogout" % (self.theme_prefix, self.button_theme)                  

        if os.path.exists("%s/.themes/%s/oblogout" % (os.environ['HOME'], self.button_theme)):
            # Found a valid theme folder in the userdir, use that
            self.img_path = "%s/.themes/%s/oblogout" % (os.environ['HOME'], self.button_theme)
            self.logger.info("Using user theme at %s" % self.img_path)
        else:
            if not os.path.exists("%s/%s/oblogout" % (self.theme_prefix, self.button_theme)):
                self.logger.warning("Button theme %s not found, reverting to default" % self.button_theme)
                self.button_theme = 'foom'
        

        # Parse button list from config file.
        validbuttons = ['cancel', 'logout', 'restart', 'shutdown', 'suspend', 'hibernate', 'safesuspend', 'lock', 'switch']  
        buttonname = [_('cancel'), _('logout'), _('restart'), _('shutdown'), _('suspend'), _('hibernate'), _('safesuspend'), _('lock'), _('switch')]       

        if not blist:
            list = validbuttons
        elif blist == "default":
            list = validbuttons
        else:
            list = map(lambda button: string.strip(button), blist.split(","))
                    
        # Validate the button list
        for button in list:
            self.logger.debug(_("Validating button: %s" % button))
            if not button in validbuttons:
                self.logger.warning(_("Button %s is not a valid button name, removing") % button)
                list.remove(button)
            else:
                if self.usehal and button in ['restart', 'shutdown', 'suspend', 'hibernate', 'safesuspend']:
                    if not self.dbus.check_ability(button):
                        self.logger.warning(_("Can't %s, disabling button" % button))
                        list.remove(button)
                else:
                    if button != "cancel":
                        try:
                            self.logger.debug(_("Cmd Value for %s: %s" % (button, getattr(self, "cmd_" + button))))
                            if getattr(self, "cmd_" + button) == "None":
                                self.logger.warning(_("Command for button %s is undefined, removing." % button))
                                list.remove(button)
                        except:
                            self.logger.warning(_("Command for button %s is undefined, removing." % button))
                            list.remove(button)      
                        
        if len(list) == 0:
            self.logger.warning(_("No valid buttons found, resetting to defaults"))
            self.button_list = validbuttons
        else:
            self.logger.debug("Validated Button List: %s" % list)
            self.button_list = list