]> code.delx.au - bg-scripts/blobdiff - bin/randombg.py
RandomBG: Added oneshot option.
[bg-scripts] / bin / randombg.py
index f31cbb64ee2bef20c09e1e17a2e781bc6818264a..99933fea4fd9879b1c532b98181a413a0b79606e 100755 (executable)
@@ -17,7 +17,7 @@ except ImportError:
 try:
        # Required libraries
        import asyncsched
-       import WallChanger
+       import wallchanger
 except ImportError, e:
        critical("Missing libraries! Exiting...")
        sys.exit(1)
@@ -162,13 +162,16 @@ class FolderRandomFileList(BaseFileList):
        def __init__(self):
                self.directories = {}
        
+       def scan_paths(self):
+               pass
+       
        def add_path(self, path):
                debug('Added path "%s" to the list' % path)
                for dirpath, dirs, filenames in os.walk(path):
                        debug('Scanning "%s" for images' % dirpath)
                        if self.directories.has_key(dirpath):
                                continue
-                       filenames = filter_images(filenames)
+                       filenames = list(filter_images(filenames))
                        if len(filenames):
                                self.directories[dirpath] = filenames
                                debug('Adding "%s" to "%s"' % (filenames, dirpath))
@@ -187,14 +190,14 @@ class FolderRandomFileList(BaseFileList):
 
 
 class Cycler(object):
-       def __init__(self, options, paths):
+       def init(self, options, paths):
                self.filelist = self.find_files(options, paths)
                if not self.filelist.is_empty():
                        error("No images were found. Exiting...")
                        sys.exit(1)
        
-               debug("Initialising RandomBG")
-               self.randombg = WallChanger.RandomBG(options.background_colour, options.permanent)
+               debug("Initialising wallchanger")
+               wallchanger.init(options.background_colour, options.permanent)
                self.cycle_time = options.cycle_time
 
                self.task = None
@@ -221,7 +224,7 @@ class Cycler(object):
        def cmd_reset(self):
                def next():
                        image = self.filelist.get_next_image()
-                       self.randombg.setImage(image)
+                       wallchanger.set_image(image)
                        self.task = None
                        self.cmd_reset()
 
@@ -232,17 +235,17 @@ class Cycler(object):
        
        def cmd_reload(self):
                image = self.filelist.get_current_image()
-               self.randombg.setImage(image)
+               wallchanger.set_image(image)
                self.cmd_reset()
 
        def cmd_next(self):
                image = self.filelist.get_next_image()
-               self.randombg.setImage(image)
+               wallchanger.set_image(image)
                self.cmd_reset()
        
        def cmd_prev(self):
                image = self.filelist.get_prev_image()
-               self.randombg.setImage(image)
+               wallchanger.set_image(image)
                self.cmd_reset()
        
        def cmd_rescan(self):
@@ -280,23 +283,25 @@ class Server(asynchat.async_chat):
 
 
 class Listener(asyncore.dispatcher):
-       def __init__(self, socket_filename, randombg):
+       def __init__(self, socket_filename, cycler):
                asyncore.dispatcher.__init__(self)
-               self.randombg = randombg
+               self.cycler = cycler
                self.create_socket(socket.AF_UNIX, socket.SOCK_STREAM)
                self.bind(socket_filename)
                self.listen(2) # Backlog = 2
        
        def handle_accept(self):
                conn, addr = self.accept()
-               Server(self.randombg, conn, addr)
+               Server(self.cycler, conn, addr)
                
 
 def do_server(options, paths):
        try:
                try:
-                       cycler = Cycler(options, paths)
+                       cycler = Cycler()
                        listener = Listener(options.socket_filename, cycler)
+                       # Initialisation of Cycler delayed so we grab the socket quickly
+                       cycler.init(options, paths)
                        asyncsched.loop()
                except KeyboardInterrupt:
                        print
@@ -319,6 +324,9 @@ def do_client(options, args):
                        time.sleep(options.cycle_time)
        sock.close()
 
+def do_oneshot(options, paths):
+       cycler = Cycler()
+       cycler.init(options, paths)
 
 def build_parser():
        parser = OptionParser(version="%prog " + VERSION, 
@@ -340,6 +348,9 @@ def build_parser():
        parser.add_option("--all-random",
                action="store_true", dest="all_random", default=False,
                help="Make sure that all images have been displayed before repeating an image")
+       parser.add_option("-1", "--oneshot",
+               action="store_true", dest="oneshot", default=False,
+               help="Set one random image and terminate immediately.")
        parser.add_option("--folder-random",
                action="store_true", dest="folder_random", default=False,
                help="Give each folder an equal chance of having an image selected from it")
@@ -358,7 +369,13 @@ def main():
        parser = build_parser()
        options, args = parser.parse_args(sys.argv[1:])
 
-       logging.basicConfig(level=10*options.verbose)
+       if options.verbose == 1:
+               logging.getLogger().setLevel(logging.INFO)
+       elif options.verbose >= 2:
+               logging.getLogger().setLevel(logging.DEBUG)
+       
+       if options.oneshot:
+               do_oneshot(options, args)
 
        if os.path.exists(options.socket_filename):
                do_client(options, args)