Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python2
- ##
- # Image 'desklet' .. Show random image on desktop
- # ADcomp <david.madbox@gmail.com>
- #
- ## Thanks to : Lucas Rocha - http://blogs.gnome.org/lucasr/
- # -- Config
- ## Images directory
- DIR = ( '/home/paul/Afbeeldingen/systemart',
- '/usr/share/backgrounds/',
- # '',
- )
- ## Time between change ( in sec )
- TIMER = 10
- ## Background color : HTML Color or None
- BG_COLOR = "#000000"
- ## Gtk config
- IS_DESKTOP_WIDGET = False
- IS_DECORATED = False
- IS_STICK = True
- SHOW_BORDER = True
- ## Transparent background if composite
- USE_COMPOSITE = True
- ## Fullscreen mode ( like screensaver )
- FULLSCREEN = False
- ## Password
- NEED_PWD = False
- ENC_PWD = 'zlcnffjbeq'
- ## Position on desktop
- POS_X = 900
- POS_Y = 450
- ## Image size
- WIDTH = 900
- HEIGHT = 600
- ###### -- End config
- import gtk
- import cairo
- import os
- import random
- import mimetypes
- import gobject
- class App():
- def __init__(self):
- self.items_list = []
- for dir in DIR:
- dir_items = os.listdir(dir)
- for item in dir_items:
- mimetype = mimetypes.guess_type(item)[0]
- if mimetype and mimetype.split('/')[0] == 'image':
- self.items_list.append(os.path.join(dir, item))
- self.items = list(self.items_list)
- self.create_frame()
- ## go ..
- self.is_playing = True
- self.set_image()
- self.timer = gobject.timeout_add(TIMER*1000, self.set_image)
- def create_frame(self):
- self.window = gtk.Window()
- self.window.add_events(gtk.gdk.BUTTON_PRESS_MASK|gtk.gdk.ENTER_NOTIFY|gtk.gdk.LEAVE_NOTIFY)
- self.window.connect("destroy", gtk.main_quit)
- self.window.connect("button_press_event", self.onClick)
- self.window.connect("key-press-event", self.onKeypress)
- self.window.connect('expose-event', self.expose)
- self.window.move(POS_X, POS_Y)
- self.window.set_app_paintable(True)
- self.check_screen(self.window)
- if IS_STICK:
- self.window.stick()
- self.window.set_decorated(IS_DECORATED)
- if IS_DESKTOP_WIDGET and not FULLSCREEN:
- self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DESKTOP)
- else:
- self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_NORMAL)
- self.window.set_skip_taskbar_hint(True)
- if SHOW_BORDER:
- self.window.set_border_width(1)
- else:
- self.window.set_border_width(0)
- if BG_COLOR:
- self.window.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(BG_COLOR))
- ## menu
- self.popupMenu = gtk.Menu()
- menuPopup = gtk.ImageMenuItem (gtk.STOCK_QUIT)
- menuPopup.connect("activate", gtk.main_quit)
- self.popupMenu.add(menuPopup)
- self.popupMenu.show_all()
- if FULLSCREEN:
- global WIDTH, HEIGHT
- WIDTH, HEIGHT = gtk.gdk.screen_width(), gtk.gdk.screen_height()
- self.window.fullscreen()
- self.img = gtk.Image()
- self.img.set_size_request(WIDTH,HEIGHT)
- self.img.show()
- self.window.add(self.img)
- self.window.show_all()
- if FULLSCREEN:
- self.window.present()
- def next_image(self):
- if not self.timer == None:
- gobject.source_remove(self.timer)
- self.timer = None
- if self.is_playing:
- self.set_image()
- self.timer = gobject.timeout_add(TIMER*1000, self.set_image)
- def set_image(self, widget=None, event=None):
- if not self.is_playing:
- return False
- if len(self.items) == 1:
- #~ print 'last in list ..'
- img_path = self.items[0]
- self.items = list(self.items_list)
- else:
- #~ print 'random :',
- rnd = random.randint(0, len(self.items)-1)
- #~ print rnd , '[' , len(self.items)-1, ']'
- img_path = self.items[rnd]
- self.items.pop(rnd)
- try:
- pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(img_path, WIDTH, HEIGHT)
- self.img.set_from_pixbuf(pixbuf)
- if self.is_playing:
- return True
- else:
- return False
- except:
- self.next_image()
- def expose(self, widget, event):
- if self.window.is_composited() and USE_COMPOSITE:
- ## Full transparent window
- cr = self.window.window.cairo_create()
- cr.set_source_rgba(0, 0, 0, 0)
- cr.set_operator(cairo.OPERATOR_SOURCE)
- cr.paint()
- def onClick(self, widget, event, data=None):
- if event.button==3: # right click
- self.popupMenu.popup(None, None, None, event.button, event.time)
- elif event.button==1: # left click
- self.next_image()
- def onKeypress(self, widget, event):
- if event.keyval == gtk.keysyms.Escape:
- print 'quit ..'
- gtk.main_quit()
- elif event.keyval == gtk.keysyms.space:
- self.is_playing = not self.is_playing
- if self.is_playing:
- self.next_image()
- else:
- self.next_image()
- def check_screen(self, widget):
- # To check if the display supports alpha channels, get the colormap
- screen = widget.get_screen()
- colormap = screen.get_rgba_colormap()
- if colormap == None:
- colormap = screen.get_rgb_colormap()
- supports_alpha = False
- else:
- supports_alpha = True
- # Now we have a colormap appropriate for the screen, use it
- widget.set_colormap(colormap)
- return supports_alpha
- def run(self):
- gtk.main()
- def responseToDialog(entry, dialog, response):
- dialog.response(response)
- def getPwd():
- #base this on a message dialog
- dialog = gtk.MessageDialog(
- None,
- gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
- gtk.MESSAGE_QUESTION,
- gtk.BUTTONS_OK,
- None)
- dialog.set_markup('Please enter your <b>password</b>:')
- #create the text input field
- entry = gtk.Entry()
- entry.set_visibility(False)
- #allow the user to press enter to do ok
- entry.connect("activate", responseToDialog, dialog, gtk.RESPONSE_OK)
- #create a horizontal box to pack the entry and a label
- hbox = gtk.HBox()
- hbox.pack_start(gtk.Label("Password:"), False, 5, 5)
- hbox.pack_end(entry)
- #add it and show it
- dialog.vbox.pack_end(hbox, True, True, 0)
- dialog.show_all()
- dialog.run()
- pwd = entry.get_text()
- dialog.destroy()
- return pwd
- def msgErr():
- #base this on a message dialog
- dialog = gtk.MessageDialog(
- None,
- gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
- gtk.MESSAGE_ERROR,
- gtk.BUTTONS_OK,
- None)
- dialog.set_markup('Wrong password .. Exit!')
- dialog.show_all()
- dialog.run()
- dialog.destroy()
- if __name__ == "__main__":
- if NEED_PWD:
- pwd = getPwd()
- if not pwd.encode('rot13') == ENC_PWD:
- msgErr()
- exit()
- my_image = App()
- my_image.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement