Advertisement
pablokal

image_desklet_extended

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