Advertisement
pablokal

image_desklet_extended

Jun 30th, 2012
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.62 KB | None | 0 0
  1. #!/usr/bin/python2
  2.  
  3. ##
  4. # Image 'desklet' .. Show random image on desktop
  5. #
  6. ## Thanks to : Lucas Rocha - http://blogs.gnome.org/lucasr/
  7.  
  8.  
  9. # -- Config
  10.  
  11. ## Images directory
  12. DIR = ( '/home/paul/Afbeeldingen/systemart',
  13.         '/usr/share/backgrounds/',
  14.         # '',
  15.       )
  16.  
  17. ## Time between change ( in sec )
  18. TIMER = 10
  19.  
  20. ## Background color : HTML Color or None
  21. BG_COLOR = "#000000"
  22.  
  23. ## Gtk config
  24. IS_DESKTOP_WIDGET = False
  25. IS_DECORATED = False
  26. IS_STICK = True
  27. SHOW_BORDER = True
  28.  
  29. ## Transparent background if composite
  30. USE_COMPOSITE = True
  31.  
  32. ## Fullscreen mode ( like screensaver )
  33. FULLSCREEN = False
  34.  
  35. ## Password
  36. NEED_PWD = False
  37. ENC_PWD = 'zlcnffjbeq'
  38.  
  39. ## Position on desktop
  40. POS_X = 900
  41. POS_Y = 450
  42.  
  43. ## Image size
  44. WIDTH = 900
  45. HEIGHT = 600
  46.  
  47. ###### -- End config
  48.  
  49.  
  50. import gtk
  51. import cairo
  52. import os
  53. import random
  54. import mimetypes
  55. import gobject
  56.  
  57. class App():
  58.   def __init__(self):
  59.  
  60.     self.items_list = []
  61.     for dir in DIR:
  62.         dir_items = os.listdir(dir)
  63.  
  64.         for item in dir_items:
  65.             mimetype = mimetypes.guess_type(item)[0]
  66.             if mimetype and mimetype.split('/')[0] == 'image':
  67.                 self.items_list.append(os.path.join(dir, item))
  68.     self.items = list(self.items_list)
  69.  
  70.     self.create_frame()
  71.     ## go ..
  72.     self.is_playing = True
  73.     self.set_image()
  74.     self.timer = gobject.timeout_add(TIMER*1000, self.set_image)
  75.  
  76.   def create_frame(self):
  77.     self.window = gtk.Window()
  78.     self.window.add_events(gtk.gdk.BUTTON_PRESS_MASK|gtk.gdk.ENTER_NOTIFY|gtk.gdk.LEAVE_NOTIFY)
  79.     self.window.connect("destroy", gtk.main_quit)
  80.     self.window.connect("button_press_event", self.onClick)
  81.     self.window.connect("key-press-event", self.onKeypress)
  82.     self.window.connect('expose-event', self.expose)
  83.     self.window.move(POS_X, POS_Y)
  84.  
  85.     self.window.set_app_paintable(True)
  86.     self.check_screen(self.window)
  87.  
  88.     if IS_STICK:
  89.         self.window.stick()
  90.  
  91.     self.window.set_decorated(IS_DECORATED)
  92.  
  93.     if IS_DESKTOP_WIDGET and not FULLSCREEN:
  94.       self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DESKTOP)
  95.     else:
  96.       self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_NORMAL)
  97.  
  98.     self.window.set_skip_taskbar_hint(True)
  99.  
  100.     if SHOW_BORDER:
  101.         self.window.set_border_width(1)
  102.     else:
  103.         self.window.set_border_width(0)
  104.  
  105.     if BG_COLOR:
  106.         self.window.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(BG_COLOR))
  107.  
  108.     ## menu
  109.     self.popupMenu = gtk.Menu()
  110.     menuPopup = gtk.ImageMenuItem (gtk.STOCK_QUIT)
  111.     menuPopup.connect("activate", gtk.main_quit)
  112.     self.popupMenu.add(menuPopup)
  113.     self.popupMenu.show_all()
  114.  
  115.     if FULLSCREEN:
  116.       global WIDTH, HEIGHT
  117.       WIDTH, HEIGHT = gtk.gdk.screen_width(), gtk.gdk.screen_height()
  118.       self.window.fullscreen()
  119.  
  120.     self.img = gtk.Image()
  121.     self.img.set_size_request(WIDTH,HEIGHT)
  122.     self.img.show()
  123.     self.window.add(self.img)
  124.     self.window.show_all()
  125.  
  126.     if FULLSCREEN:
  127.       self.window.present()
  128.  
  129.   def next_image(self):
  130.     if not self.timer == None:
  131.       gobject.source_remove(self.timer)
  132.       self.timer = None
  133.  
  134.     if self.is_playing:
  135.       self.set_image()
  136.       self.timer = gobject.timeout_add(TIMER*1000, self.set_image)
  137.  
  138.   def set_image(self, widget=None, event=None):
  139.     if not self.is_playing:
  140.       return False
  141.  
  142.     if len(self.items) == 1:
  143.       #~ print 'last in list ..'
  144.       img_path = self.items[0]
  145.       self.items = list(self.items_list)
  146.     else:
  147.       #~ print 'random :',
  148.       rnd = random.randint(0, len(self.items)-1)
  149.       #~ print rnd , '[' , len(self.items)-1, ']'
  150.       img_path = self.items[rnd]
  151.       self.items.pop(rnd)
  152.  
  153.     try:
  154.       pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(img_path, WIDTH, HEIGHT)
  155.       self.img.set_from_pixbuf(pixbuf)
  156.       if self.is_playing:
  157.         return True
  158.       else:
  159.         return False
  160.     except:
  161.       self.next_image()
  162.  
  163.   def expose(self, widget, event):
  164.       if self.window.is_composited() and USE_COMPOSITE:
  165.           ## Full transparent window
  166.           cr = self.window.window.cairo_create()
  167.           cr.set_source_rgba(0, 0, 0, 0)
  168.           cr.set_operator(cairo.OPERATOR_SOURCE)
  169.           cr.paint()
  170.  
  171.   def onClick(self, widget, event, data=None):
  172.     if event.button==3: # right click
  173.         self.popupMenu.popup(None, None, None, event.button, event.time)
  174.     elif event.button==1: # left click
  175.         self.next_image()
  176.  
  177.   def onKeypress(self, widget, event):
  178.     if event.keyval == gtk.keysyms.Escape:
  179.       print 'quit ..'
  180.       gtk.main_quit()
  181.     elif event.keyval == gtk.keysyms.space:
  182.       self.is_playing = not self.is_playing
  183.       if self.is_playing:
  184.         self.next_image()
  185.     else:
  186.       self.next_image()
  187.  
  188.   def check_screen(self, widget):
  189.       # To check if the display supports alpha channels, get the colormap
  190.       screen = widget.get_screen()
  191.       colormap = screen.get_rgba_colormap()
  192.       if colormap == None:
  193.           colormap = screen.get_rgb_colormap()
  194.           supports_alpha = False
  195.       else:
  196.           supports_alpha = True
  197.       # Now we have a colormap appropriate for the screen, use it
  198.       widget.set_colormap(colormap)
  199.       return supports_alpha
  200.  
  201.   def run(self):
  202.       gtk.main()
  203.  
  204.  
  205. def responseToDialog(entry, dialog, response):
  206.   dialog.response(response)
  207.  
  208. def getPwd():
  209.   #base this on a message dialog
  210.   dialog = gtk.MessageDialog(
  211.       None,
  212.       gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
  213.       gtk.MESSAGE_QUESTION,
  214.       gtk.BUTTONS_OK,
  215.       None)
  216.   dialog.set_markup('Please enter your <b>password</b>:')
  217.   #create the text input field
  218.   entry = gtk.Entry()
  219.   entry.set_visibility(False)
  220.   #allow the user to press enter to do ok
  221.   entry.connect("activate", responseToDialog, dialog, gtk.RESPONSE_OK)
  222.   #create a horizontal box to pack the entry and a label
  223.   hbox = gtk.HBox()
  224.   hbox.pack_start(gtk.Label("Password:"), False, 5, 5)
  225.   hbox.pack_end(entry)
  226.   #add it and show it
  227.   dialog.vbox.pack_end(hbox, True, True, 0)
  228.   dialog.show_all()
  229.   dialog.run()
  230.   pwd = entry.get_text()
  231.   dialog.destroy()
  232.   return pwd
  233.  
  234. def msgErr():
  235.   #base this on a message dialog
  236.   dialog = gtk.MessageDialog(
  237.       None,
  238.       gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
  239.       gtk.MESSAGE_ERROR,
  240.       gtk.BUTTONS_OK,
  241.       None)
  242.   dialog.set_markup('Wrong password .. Exit!')
  243.   dialog.show_all()
  244.   dialog.run()
  245.   dialog.destroy()
  246.  
  247. if __name__ == "__main__":
  248.  
  249.   if NEED_PWD:
  250.     pwd = getPwd()
  251.     if not pwd.encode('rot13') == ENC_PWD:
  252.       msgErr()
  253.       exit()
  254.  
  255.   my_image = App()
  256.   my_image.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement