Vlastný vyhľadávací nástroj
 

Mic's trayicon

6 days and 3.62 hours since someone reset this sign. Record is 21 days and 18.88 hours.
p1010085

p1010085

Date: 02/11/2009

Zaujímavé linky:
KSP
FMFI UK
GJH

------BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS d- s+: a-- C++ UL+++ P+ L++ E--- W++ N? o? K? w-- O? M? V? PS+ PE+(-) Y+ PGP+ t>+ 5++ X+ R+ tv-- b+ DI+ D G++ e>+++ h-- r++ y?
------END GEEK CODE BLOCK------

This script has few features:

  • Resides in system tray
  • Clipboard history and reverting (last 10 entries)
  • URL select -- download and run (this is a security hole)
  • Your own launch scripts

Config example:

  1. submenu:Tablet
  2. Set buttons:/home/mic/.config/mictray/set_wacom.sh
  3. Update screen:/home/mic/.config/mictray/update_wacom_to_screen.sh
  4. endsubmenu
  5. Setup display:gnome-display-properties
  6. Chromium:chromium-browser

Source code:

  1. #!/usr/bin/python
  2. # This program is under GPLv3 license --
  3. # http://www.gnu.org/licenses/gpl-3.0.html
  4. #
  5. # If you think, that this script is usefull, please send me a postcard to
  6. # adress:
  7. # Michal Nanasi
  8. # Azalkova 1
  9. # 82101 Bratislava
  10. # Slovakia
  11.  
  12. import gtk
  13. import tempfile
  14. import os
  15. import re
  16. import sys
  17. from threading import Thread
  18.  
  19.  
  20. class DownloadAndExecuteURL(Thread):
  21.  
  22.     def __init__(self,text):
  23.         Thread.__init__(self)
  24.         self.text=text
  25.  
  26.     def run(self):
  27.         text=self.text
  28.         name=tempfile.NamedTemporaryFile().name
  29.         text=text.replace('&','%26')
  30.         print("/usr/bin/wget --output-document="+name+" "+text)
  31.         os.system("/usr/bin/wget --output-document="+name+" "+text+"; /usr/bin/xdg-open "+name)
  32.  
  33.  
  34.  
  35. class URLMenu:
  36.  
  37.  
  38.     def changeURL(self,url,index=0):
  39.         if len(self.urls)>0:
  40.             self.urls.pop(index);
  41.         self.addURL(url);
  42.  
  43.     def addURL(self,url):
  44.         self.urls.insert(0,url)
  45.         if len(self.urls)>self.maxSize:
  46.             self.urls.pop()
  47.         self.changed=True
  48.         cld=self.menu.get_children()
  49.         for child in cld:
  50.             self.menu.remove(child)
  51.         for url in self.urls:
  52.             item = gtk.MenuItem
  53.             menuItem=gtk.MenuItem(url)
  54.             self.menu.append(menuItem)
  55.             menuItem.connect("activate", self.menuItemResponse,url)
  56.             menuItem.show_all()
  57.         self.menu.show_all()
  58.  
  59.     def getTop(self):
  60.         if len(self.urls)==0:
  61.             return None
  62.         return self.urls[0]
  63.  
  64.  
  65.  
  66.     def menuItemResponse(self,widget,url):
  67.         thread = DownloadAndExecuteURL(url)
  68.         thread.start()
  69.  
  70.     def getMenu(self):
  71.         return self.menu
  72.  
  73.     def __init__(self,maxSize=10):
  74.         self.urls=list()
  75.         self.menu=gtk.Menu()
  76.         self.changed=True
  77.         self.maxSize=maxSize
  78.  
  79.  
  80.  
  81. class ClipboardMenu:
  82.  
  83.     def on_clipboard_owner_change(self, clipboard, event):
  84.         item = self.clipboard.wait_for_text()
  85.         if item != None:
  86.             self.addText(item)
  87.             self.clipboard_text = item
  88.         elif self.clipboard_text != None:
  89.             self.clipboard.set_text(self.clipboard_text)
  90.  
  91.     def derived(self,text1,text2):
  92.         if text1 == None or text2 == None:
  93.             return False
  94.         if text1.count(text2)+text2.count(text1)>0:
  95.             return True
  96.         return False
  97.  
  98.     def addText(self,text):
  99.         if self.urlMenu:
  100.             if re.match("^https?://.*",text) or re.match("^s?ftp://.*",text):
  101.                 if self.derived(self.urlMenu.getTop(),text):
  102.                     self.urlMenu.changeURL(text,0)
  103.                 else:
  104.                     self.urlMenu.addURL(text)
  105.  
  106.         if self.derived(self.clipboard_text,text):
  107.             self.boards[0]=text
  108.         else:
  109.             self.boards.insert(0,text);
  110.  
  111.         if len(self.boards)>self.maxSize:
  112.             self.boards.pop();
  113.         cld=self.menu.get_children()
  114.         fir=2;
  115.         for child in cld:
  116.             if fir!=0:
  117.                 fir=fir-1
  118.             else:
  119.                 self.menu.remove(child)
  120.         for clip in self.boards:
  121.             item = gtk.MenuItem
  122.             cp = clip.replace("\n","")
  123.             if len(cp)>20:
  124.                 cp = cp[0:19]+"..."
  125.             menuItem=gtk.MenuItem(cp)
  126.             self.menu.append(menuItem)
  127.             menuItem.connect("activate", self.menuItemResponse,clip)
  128.             menuItem.show_all()
  129.         self.menu.show_all()
  130.  
  131.     def menuItemResponse(self,widget,clip):
  132.         for text in self.boards:
  133.             if text == clip:
  134.                 self.boards.remove(text)
  135.         self.clipboard.set_text(clip)
  136.  
  137.     def getMenu(self):
  138.         return self.menu
  139.  
  140.     def __init__(self,maxSize=10):
  141.         self.menu=gtk.Menu()
  142.         self.urlMenu = URLMenu()
  143.         menuitem = gtk.MenuItem("URL")
  144.         self.menu.append(menuitem)
  145.         menuitem.set_submenu(self.urlMenu.getMenu())
  146.         self.menu.append(gtk.SeparatorMenuItem())
  147.         self.menu.show_all()
  148.         self.boards=list()     
  149.         self.maxSize=maxSize
  150.         self.clipboard = gtk.clipboard_get("PRIMARY")
  151.         self.clipboard_text = self.clipboard.wait_for_text()
  152.         self.clipboard.connect('owner-change', self.on_clipboard_owner_change)
  153.  
  154.  
  155. class ScriptMenu:
  156.  
  157.     def getMenu(self):
  158.         return self.menu
  159.  
  160.     def menuItemResponse(self,widget,script):
  161.         os.system(script+" & ");       
  162.  
  163.     def __init__(self,config):
  164.         self.menu=gtk.Menu()
  165.         stack = list();
  166.         stack.append(self.menu)
  167.  
  168.         f = open(config,"r")
  169.         file = f.readlines()
  170.  
  171.         for line in file:
  172.             m = stack[len(stack)-1]
  173.             if re.match("^[ \t]*submenu:.*",line):
  174.                 #nove submenu
  175.                 (lol,sep,item) = line.partition(":")
  176.                 item=item.strip()
  177.                 menuitem = gtk.MenuItem(item)
  178.                 m.append(menuitem);
  179.                 m=gtk.Menu();
  180.                 menuitem.set_submenu(m)
  181.                 stack.append(m)
  182.             elif re.match("^[\t]*endsubmenu[ \t]*",line):
  183.                 m.show_all();
  184.                 stack.pop();
  185.             else:
  186.                 (item,sep,script) = line.partition(":")
  187.                 item=item.strip()
  188.                 script=script.strip()
  189.                 menuitem=gtk.MenuItem(item)
  190.                 m.append(menuitem)
  191.                 menuitem.connect("activate",self.menuItemResponse,script);
  192.                 menuitem.show_all();
  193.         if len(stack)!=1:
  194.             raise Exception('ERROR IN CONFUGURE FILE')
  195.         self.menu.show_all();
  196.  
  197.  
  198.  
  199.  
  200. class ActionMenu:
  201.  
  202.     def getMenu(self):
  203.         return self.menu
  204.  
  205.     def __init__(self):
  206.         self.scriptmenu=ScriptMenu(os.getenv("HOME")+"/.config/mictray/scriptmenu.cfg")
  207.         self.menu=self.scriptmenu.getMenu()
  208.         self.menu.prepend(gtk.SeparatorMenuItem())
  209.         self.ClMenu=ClipboardMenu()
  210.         clmenuItem = gtk.MenuItem("Clipboard")
  211.         self.menu.prepend(clmenuItem)
  212.         clmenuItem.set_submenu(self.ClMenu.getMenu())
  213.         self.menu.show_all()
  214.  
  215.  
  216.  
  217.  
  218. class StatusIcc:
  219.  
  220.  
  221.     # activate callback
  222.     def activate( self, widget, data=None):
  223.         self.actionMenu.getMenu().popup(None, None, gtk.status_icon_position_menu, 0,0, widget)
  224.  
  225.     def  show_hide(self, widget,response_id, data= None):
  226.            if response_id == gtk.RESPONSE_YES:
  227.                widget.hide()
  228.            else:
  229.                widget.hide()
  230.  
  231.  
  232.     # destroyer callback
  233.     def  destroyer(self, widget,response_id, data= None):
  234.         if response_id == gtk.RESPONSE_OK:
  235.             gtk.main_quit()
  236.         else:
  237.             widget.hide()
  238.  
  239.     # popup callback
  240.     def popup(self, button, widget, data=None):
  241.         dialog = gtk.MessageDialog(
  242.         parent         = None,
  243.         flags          = gtk.DIALOG_DESTROY_WITH_PARENT,
  244.         type           = gtk.MESSAGE_INFO,
  245.         buttons        = gtk.BUTTONS_OK_CANCEL,
  246.         message_format = "Do you want to close this Status Icon program?")
  247.         dialog.set_title("Popup Window")
  248.         dialog.connect("response", self.destroyer)
  249.         dialog.show()
  250.  
  251.     def __init__(self):
  252.         # create a new Status Icon
  253.         self.staticon = gtk.StatusIcon()
  254.         self.staticon.set_from_stock(gtk.STOCK_ABOUT)
  255.         self.staticon.set_blinking(False)
  256.         self.actionMenu=ActionMenu();
  257.         self.staticon.connect("activate", self.activate)
  258.         self.staticon.connect("popup_menu", self.popup)
  259.         self.staticon.set_visible(True)
  260.  
  261.         # invoking the main()
  262.         gtk.main()
  263.  
  264. if __name__ == "__main__":
  265.     statusicon = StatusIcc()
Dátum poslednej zmeny: 27 január, 2010, 15:01 CET
Created by Mic ( mic(at)ksp(dot)sk, ICQ: 281832795, jabber: mic47@jabber.sk) Tato stranka vyzera najlepsie na mojom monitore:-) A v prehliadacoch Chromium, Firefox, Opera, Epiphany. Odporúčaná šírka monitora je aspoň 1280 pixelov. Pri menších šírkach sa nemusia niektoré fotky v galérii zobraziť korektne. Použitý software: PmWiki, Gallery 2.