Преглед на файлове

import initial depuis scripts_utilisateur

manuel преди 3 години
ревизия
5befb6afe2
променени са 36 файла, в които са добавени 7263 реда и са изтрити 0 реда
  1. 150 0
      pycpufreq/cl_actions.py
  2. BIN
      pycpufreq/cl_actions.pyc
  3. BIN
      pycpufreq/cl_actions.pyo
  4. 119 0
      pycpufreq/cl_actions.py~
  5. 94 0
      pycpufreq/cl_taskbaricon.py
  6. BIN
      pycpufreq/cl_taskbaricon.pyc
  7. BIN
      pycpufreq/cl_taskbaricon.pyo
  8. BIN
      pycpufreq/cpu.png
  9. BIN
      pycpufreq/cpu_ondemand.png
  10. BIN
      pycpufreq/cpu_ondemand_auto.png
  11. BIN
      pycpufreq/cpu_powersave.png
  12. BIN
      pycpufreq/cpu_powersave_auto.png
  13. 35 0
      pycpufreq/main.py
  14. 99 0
      pytemp/backup_cl_taskbaricon.py
  15. 73 0
      pytemp/cl_actions.py
  16. BIN
      pytemp/cl_actions.pyc
  17. BIN
      pytemp/cl_actions.pyo
  18. 101 0
      pytemp/cl_taskbaricon.py
  19. BIN
      pytemp/cl_taskbaricon.pyc
  20. BIN
      pytemp/cl_taskbaricon.pyo
  21. 33 0
      pytemp/main.py
  22. BIN
      pytemp/thermometre.jpeg
  23. BIN
      pytemp/thermometre.png
  24. 3145 0
      virtuala_navigilo/Iceweasel-icon.svg
  25. 230 0
      virtuala_navigilo/Midori.svg
  26. 62 0
      virtuala_navigilo/README.fr
  27. 3 0
      virtuala_navigilo/TODO
  28. 192 0
      virtuala_navigilo/go-next.svg
  29. 693 0
      virtuala_navigilo/internet-web-browser.svg
  30. 603 0
      virtuala_navigilo/pitr_red_arrows_set_4.svg
  31. 171 0
      virtuala_navigilo/virtuala_navigilo.py
  32. 7 0
      virtuala_navigilo/virtuala_navigilo.rc_exemple
  33. BIN
      virtuala_navigilo/virtuala_navigilo_logo.png
  34. 1453 0
      virtuala_navigilo/virtuala_navigilo_logo.svg
  35. BIN
      virtuala_navigilo/virtuala_navigilo_logo128.png
  36. BIN
      virtuala_navigilo/virtuala_navigilo_logo32.png

+ 150 - 0
pycpufreq/cl_actions.py

@@ -0,0 +1,150 @@
+#! /usr/bin/env python
+#-*- coding: utf-8 -*-
+
+from cl_taskbaricon import Tray
+import os,sys
+import wx
+import datetime
+import time
+
+# Config
+PATH=os.path.abspath(os.path.dirname(sys.argv[0])) + '/'
+TEMPERATURE_FILE = '/sys/class/thermal/thermal_zone0/temp'
+TEMPERATURE_DIVISOR = 1000
+
+GOUV_FILE='/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'
+FREQ_AUTO_TEMP_MAX = [60, 65, 70]
+FREQ_AUTO_TEMP_MIN = [55, 60, 65]
+PIC_TIME = [ [ datetime.time(hour=6, minute=30), datetime.time(hour=8, minute=30) ], \
+             [ datetime.time(hour=11, minute=45), datetime.time(hour=13, minute=0) ], \
+             [ datetime.time(hour=18, minute=30), datetime.time(hour=20, minute=0) ] ]
+
+del sys
+
+def DoPowersave():
+    os.system("sudo cpufreq-set -g powersave")
+
+def DoOnDemand():
+    os.system("sudo cpufreq-set -g ondemand")
+
+def GetTemp():
+    """ Retourne la température du système """
+    ofi=open(TEMPERATURE_FILE)
+    f=ofi.read()
+    return int(f)/TEMPERATURE_DIVISOR
+
+def GetGouv():
+    """ Retourne le gouverneur processeur actuellement utilisé """
+    ofi=open(GOUV_FILE)
+    f=ofi.read()
+    return f
+
+def DoOnDemand():
+    """ Positionne le gouverneur processeur sur « À la demande » """
+    os.system("sudo cpufreq-set -g ondemand")
+
+def DoPowerSave():
+    """ Positionne le gouverneur processeur sur « Powersave » """
+    os.system("sudo cpufreq-set -g powersave")
+
+class Tray_action(Tray):
+    """ Classe dérivée de la gestion de l'icone et du menu qui gère les actions en plus """
+    def __init__(self, app):
+        Tray.__init__(self, app)
+        self.mode = 'vide'
+        self.prev_gouv = ''
+        self.timer = wx.Timer(self, 1)
+        #print self.timer.GetId()
+        self.timer.Start(3000)
+        self.Bind(wx.EVT_TIMER, self.BoucleRapide, id=1)
+        self.timerlent = wx.Timer(self, 2)
+        self.timerlent.Start(60000)
+        self.Bind(wx.EVT_TIMER, self.BoucleLente, id=2)
+
+    def OnTaskBarActivate(self, evt):
+        self.CreatePopupMenu()
+        print "clic sur l'icone"
+
+    def OnTaskBarClose(self, evt):
+        print "Au revoir !"
+        self.Destroy()
+
+    def OnTaskBarSetPowersave(self, evt):
+        print "appel de OnTaskBarSetPowersave"
+        self.mode = 'MANUEL'
+        DoPowersave()
+        #os.system("sudo cpufreq-set -g powersave")
+        #self.ChangeIcon(PATH + "cpu_powersave.png")
+
+    def OnTaskBarSetOndemand(self, evt):
+        print "appel de OnTaskBarSetOndemand"
+        self.mode = 'MANUEL'
+        DoOnDemand()
+        #os.system("sudo cpufreq-set -g ondemand")
+        #self.ChangeIcon(PATH + "cpu_ondemand.png")
+
+    def OnTaskBarSetEco(self, evt):
+        print "appel mode Eco"
+        self.mode = 'ECO'
+
+    def OnTaskBarSetAutomatic1(self, evt):
+        self.mode = 'AUTO_1'
+        print 'Mode AUTO 1'
+    def OnTaskBarSetAutomatic2(self, evt):
+        self.mode = 'AUTO_2'
+    def OnTaskBarSetAutomatic3(self, evt):
+        self.mode = 'AUTO_3'
+
+
+    def OnTaskBarParam(self, evt):
+        if self.mode:
+            self.IconMonitor(1,4)
+        else:
+            self.ChangeIcon(PATH + "cpu.png")
+        self.mode=not(self.mode)
+
+    def BoucleLente(self, evt):
+        """ Boucle exécutée périodiquement, à une fréquence basse """
+        if 'ECO' in self.mode:
+            maintenant = time.localtime()
+            maintenant = datetime.time(hour=maintenant.tm_hour, minute=maintenant.tm_min)
+
+            #Suivant l'heure, on passe en mode Powersave ou Ondemand
+            # Pic du matin
+            if ( maintenant > PIC_TIME[0][0] and maintenant < PIC_TIME[0][1] ) \
+                or ( maintenant > PIC_TIME[1][0] and maintenant < PIC_TIME[1][1] ) \
+                or ( maintenant > PIC_TIME[2][0] and maintenant < PIC_TIME[2][1] ):
+                DoPowersave() #os.system("sudo cpufreq-set -g powersave")
+                print "Passage automatique (ECO) en mode « Économie d'énergie »"
+            else:
+                DoOnDemand() #os.system("sudo cpufreq-set -g ondemand")
+                print "Passage automatique (ECO) en mode « À la demande »"
+
+    def BoucleRapide(self, evt):
+        """ Boucle exécutée périodiquement, à une fréquence haute """
+        if 'AUTO' in self.mode:
+	    mode_auto = int(self.mode[5])
+            if GetTemp() >= FREQ_AUTO_TEMP_MAX[mode_auto] and GetGouv != 'powersave\n':
+                DoPowersave() #os.system("sudo cpufreq-set -g powersave")
+                #self.ChangeIcon(PATH + "cpu_powersave.png")
+                print "Passage automatique en mode «Économie d'énergie»"
+
+            if GetTemp() <= FREQ_AUTO_TEMP_MIN[mode_auto] and GetGouv() != 'ondemand\n':
+                DoOnDemand() #os.system("sudo cpufreq-set -g ondemand")
+                #self.ChangeIcon(PATH + "cpu_ondemand.png")
+                print "Passage automatique en mode «À la demande»"
+
+        # Met à jour l'icône si besoin
+        nouv_gouv = GetGouv()
+        if nouv_gouv != self.prev_gouv:
+            self.prev_gouv = nouv_gouv
+            if nouv_gouv == 'ondemand\n':
+                if 'AUTO' in self.mode:
+                    self.ChangeIcon(PATH + "cpu_ondemand_auto.png")
+                else:
+                    self.ChangeIcon(PATH + "cpu_ondemand.png")
+            if nouv_gouv == 'powersave\n':
+                if 'AUTO' in self.mode:
+                    self.ChangeIcon(PATH + "cpu_powersave_auto.png")
+                else:
+                    self.ChangeIcon(PATH + "cpu_powersave.png")

BIN
pycpufreq/cl_actions.pyc


BIN
pycpufreq/cl_actions.pyo


+ 119 - 0
pycpufreq/cl_actions.py~

@@ -0,0 +1,119 @@
+#! /usr/bin/env python
+#-*- coding: utf-8 -*-
+
+from cl_taskbaricon import Tray
+import os,sys
+import wx
+import datetime
+
+PATH=os.path.abspath(os.path.dirname(sys.argv[0])) + '/'
+TEMPERATURE_FILE = '/sys/class/thermal/thermal_zone0/temp'
+TEMPERATURE_DIVISOR = 1000
+
+GOUV_FILE='/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'
+FREQ_AUTO_TEMP_MAX = [60, 65, 70]
+FREQ_AUTO_TEMP_MIN = [55, 60, 65]
+PIC_TIME = [ [ datetime.time(hour=6, minute=30), datetime.time(hour=8, minute=30) ], /
+             [ datetime.time(hour=11, minute=45), datetime.time(hour=13, minute=0) ] ]
+
+del sys
+
+def GetTemp():
+    ofi=open(TEMPERATURE_FILE)
+    f=ofi.read()
+    return int(f)/TEMPERATURE_DIVISOR
+
+def GetGouv():
+    ofi=open(GOUV_FILE)
+    f=ofi.read()
+    return f
+
+class Tray_action(Tray):
+    """ Classe dérivée de la gestion de l'icone et du menu qui gère les actions en plus """
+    def __init__(self, app):
+        Tray.__init__(self, app)
+        self.mode = 'vide'
+        self.prev_gouv = ''
+        self.timer = wx.Timer(self)
+        self.timer.Start(3000)
+        self.Bind(wx.EVT_TIMER, self.EachSecond)
+
+    def OnTaskBarActivate(self, evt):
+        self.CreatePopupMenu()
+        print "clic sur l'icone"
+
+    def OnTaskBarClose(self, evt):
+        print "Au revoir !"
+        self.Destroy()
+
+    def OnTaskBarSetPowersave(self, evt):
+        print "appel de OnTaskBarSetPowersave"
+        self.mode = 'MANUEL'
+        os.system("sudo cpufreq-set -g powersave")
+        #self.ChangeIcon(PATH + "cpu_powersave.png")
+
+    def OnTaskBarSetOndemand(self, evt):
+        print "appel de OnTaskBarSetOndemand"
+        self.mode = 'MANUEL'
+        os.system("sudo cpufreq-set -g ondemand")
+        #self.ChangeIcon(PATH + "cpu_ondemand.png")
+
+    def OnTaskBarSetEco(self, evt):
+        print "appel mode Eco"
+        self.mode = 'ECO'
+        os.system("sudo cpufreq-set -g ondemand")
+
+    def OnTaskBarSetAutomatic1(self, evt):
+        self.mode = 'AUTO_1'
+    def OnTaskBarSetAutomatic2(self, evt):
+        self.mode = 'AUTO_2'
+    def OnTaskBarSetAutomatic3(self, evt):
+        self.mode = 'AUTO_3'
+
+        
+    def OnTaskBarParam(self, evt):
+        if self.mode:
+            self.IconMonitor(1,4)
+        else:
+            self.ChangeIcon(PATH + "cpu.png")
+        self.mode=not(self.mode)
+
+    def Each10Seconds(self, evt):
+        
+    def EachSecond(self, evt):
+        if 'AUTO' in self.mode:
+	    mode_auto = int(self.mode[5])
+            if GetTemp() >= FREQ_AUTO_TEMP_MAX[mode_auto] and GetGouv != 'powersave\n':
+                os.system("sudo cpufreq-set -g powersave")
+                #self.ChangeIcon(PATH + "cpu_powersave.png")
+                print "Passage automatique en mode «Économie d'énergie»"
+
+            if GetTemp() <= FREQ_AUTO_TEMP_MIN[mode_auto] and GetGouv() != 'ondemand\n':
+                os.system("sudo cpufreq-set -g ondemand")
+                #self.ChangeIcon(PATH + "cpu_ondemand.png")
+                print "Passage automatique en mode «À la demande»"
+
+        # Devrait être fait à une fréquence plus basse !
+        if 'ECO' in self.mode:
+            maintenant = time.localtime()
+            maintenant = datetime.time(hour=maintenant.tm_hour, minute=maintenant.tm_min)
+
+            #Suivant l'heure, on passe en mode Powersave ou Ondemand
+            # Pic du matin
+            if ( maintenant > PIC_TIME[0][0] and maintenant < PIC_TIME[0][1] ) \
+                or ( maintenant > PIC_TIME[1][0] and maintenant < PIC_TIME[1][1] ) \
+                or ( maintenant > PIC_TIME[2][0] and maintenant < PIC_TIME[2][1] ):
+                os.system("sudo cpufreq-set -g powersave")
+                print "Passage automatique (ECO) en mode « Économie d'énergie »"
+            else:
+                os.system("sudo cpufreq-set -g ondemand")
+                print "Passage automatique (ECO) en mode « À la demande »"
+
+        # Met à jour l'icône si besoin
+        nouv_gouv = GetGouv()
+        if nouv_gouv != self.prev_gouv:
+            self.prev_gouv = nouv_gouv
+            if nouv_gouv == 'ondemand\n':
+                self.ChangeIcon(PATH + "cpu_ondemand.png")
+            if nouv_gouv == 'powersave\n':
+                self.ChangeIcon(PATH + "cpu_powersave.png")

+ 94 - 0
pycpufreq/cl_taskbaricon.py

@@ -0,0 +1,94 @@
+#! /usr/bin/env python 
+#-*- coding: utf-8 -*-
+# Classe permettant l'affichage d'une icone dans la barre des taches
+# avec menu
+# avec choix de l'icone ou choix d'une grandeur à monitorer
+
+import wx
+import string
+
+class Tray(wx.TaskBarIcon):
+    """ Classe pour l'affichage de l'icone et des menus 
+    dans la barre des taches. """
+
+    #Entrées du menu
+    TBMENU_CREATE = []
+
+    def __init__(self, app):
+        wx.TaskBarIcon.__init__(self)
+        self.app = app
+        self.menu_tmp = []
+        #liaisons Boutons-Méthodes (actions en dur)
+        self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.OnTaskBarActivate)
+
+    def MenuAddItem(self, nom, action):
+        """ Add an item to the menu and link it to corresponding method """
+        if action != None :
+            new_item = wx.NewId()
+            self.menu_tmp.append({nom:new_item})
+            self.Bind(wx.EVT_MENU, action, id=new_item)
+        else:
+            self.menu_tmp.append({nom:None})
+
+    def CreatePopupMenu(self):
+        """ Method called when we need to display the menu """
+        menu = wx.Menu()
+        for item in self.menu_tmp:
+            for nom,action in item.items():
+                if action!=None:
+                    menu.Append(action, nom)
+                else:
+                    menu.AppendSeparator()
+        return menu
+
+    def ChangeIcon(self, imgpath):
+        """ Change taskbar icon """
+        img = wx.Image(imgpath,wx.BITMAP_TYPE_PNG)
+        bmp = img.ConvertToBitmap()
+#        bmp.SetMask(wx.Mask(bmp, wx.Colour().Alpha()))
+        icon = wx.IconFromBitmap(img.ConvertToBitmap())
+        icon = wx.EmptyIcon()
+        icon.CopyFromBitmap(bmp)
+        self.SetIcon(icon, "pycpufreq")
+
+    def IconMonitor(self, l=2, r=4):
+        l_off=[128,0,0] # couleurs
+        l_on=[255,0,0]
+        r_off=[0,128,0]
+        r_on=[0,255,0]
+
+        s_line = "\xff\xff\xff"+"\0"*45
+        s_border = "\xff\xff\xff\0\0\0"
+        s_point = "\0"*3
+        sl_off = string.join(map(chr,l_off),'')*6
+        sl_on = string.join(map(chr,l_on),'')*6
+        sr_off = string.join(map(chr,r_off),'')*6
+        sr_on = string.join(map(chr,r_on),'')*6
+
+        s=""+s_line
+        for i in range(5):
+            if i<(5-l):
+                sl = sl_off
+            else:
+                sl = sl_on
+
+            if i<(5-r):
+                sr = sr_off
+            else:
+                sr = sr_on
+
+            s+=s_border+sl+s_point+sr+s_point
+            s+=s_border+sl+s_point+sr+s_point
+            s+=s_line
+
+        image = wx.EmptyImage(16,16)
+        image.SetData(s)
+
+        bmp = image.ConvertToBitmap()
+        bmp.SetMask(wx.Mask(bmp, wx.WHITE)) #sets the transparency colour to white 
+
+        icon = wx.EmptyIcon()
+        icon.CopyFromBitmap(bmp)
+        self.SetIcon(icon, "")
+
+

BIN
pycpufreq/cl_taskbaricon.pyc


BIN
pycpufreq/cl_taskbaricon.pyo


BIN
pycpufreq/cpu.png


BIN
pycpufreq/cpu_ondemand.png


BIN
pycpufreq/cpu_ondemand_auto.png


BIN
pycpufreq/cpu_powersave.png


BIN
pycpufreq/cpu_powersave_auto.png


+ 35 - 0
pycpufreq/main.py

@@ -0,0 +1,35 @@
+#! /usr/bin/env python
+#-*- coding: utf-8 -*-
+
+import wx
+#import cl_taskbaricon
+import cl_actions
+#import pynotify
+import sys
+import os
+
+PATH=os.path.abspath(os.path.dirname(sys.argv[0])) + '/'
+
+del sys
+del os
+
+class Main(wx.App):
+    def OnInit(self):
+        wx.InitAllImageHandlers()
+        self.tray = cl_actions.Tray_action(self)
+        self.verbose = True
+        return True
+
+if __name__=="__main__" :
+    app = Main()
+    app.tray.ChangeIcon(PATH + "cpu.png")
+    app.tray.MenuAddItem("Économique", app.tray.OnTaskBarSetPowersave)
+    app.tray.MenuAddItem("À la demande", app.tray.OnTaskBarSetOndemand)
+    app.tray.MenuAddItem("À la demande - Eco", app.tray.OnTaskBarSetEco)
+    app.tray.MenuAddItem("Automatique 1", app.tray.OnTaskBarSetAutomatic1)
+    app.tray.MenuAddItem("Automatique 2", app.tray.OnTaskBarSetAutomatic2)
+    app.tray.MenuAddItem("Automatique 3", app.tray.OnTaskBarSetAutomatic3)
+    app.tray.MenuAddItem("Paramètres", app.tray.OnTaskBarParam)
+    app.tray.MenuAddItem("separateur on s'en fou", None)
+    app.tray.MenuAddItem("Quitter", app.tray.OnTaskBarClose)
+    app.MainLoop()

+ 99 - 0
pytemp/backup_cl_taskbaricon.py

@@ -0,0 +1,99 @@
+#! /usr/bin/env python 
+#-*- coding: utf-8 -*-
+# Classe permettant l'affichage d'une icone dans la barre des taches
+# avec menu
+# avec choix de l'icone ou choix d'une grandeur à monitorer
+
+import wx
+import string
+class Menu_item:
+    def __init__(self, name, action, type_item="entry"):
+        self.name=name
+        self.action=action
+        self.type_item=type_item
+        self.icon=None
+
+
+class Tray(wx.TaskBarIcon):
+    """ Classe pour l'affichage de l'icone et des menus 
+    dans la barre des taches. """
+
+    #Entrées du menu
+    TBMENU_SET_POWERSAVE = wx.NewId()
+    TBMENU_SET_ONDEMAND = wx.NewId()
+    TBMENU_PARAM = wx.NewId()
+    TBMENU_CLOSE = wx.NewId()
+    TBMENU_CREATE = []
+
+
+    def __init__(self, app):
+        wx.TaskBarIcon.__init__(self)
+        self.app = app
+        self.menu_tmp = {}
+        #liaisons Boutons-Méthodes (actions en dur)
+        self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.OnTaskBarActivate)
+
+    def MenuAddItem(self, nom, action):
+        """ Add an item to the menu and link it to corresponding method """
+        self.menu_tmp[nom]=wx.NewId()
+        self.Bind(wx.EVT_MENU, action, id=self.menu_tmp[nom])
+
+    def CreatePopupMenu(self):
+        """ Method called when we need to display the menu """
+        menu = wx.Menu()
+        for nom,action in self.menu_tmp.items():
+            menu.Append(action, nom)
+        menu.AppendSeparator()
+        return menu
+
+    def ChangeIcon(self, imgpath):
+        """ Change taskbar icon """
+        img = wx.Image(imgpath,wx.BITMAP_TYPE_PNG)
+        bmp = img.ConvertToBitmap()
+#        bmp.SetMask(wx.Mask(bmp, wx.Colour().Alpha()))
+        icon = wx.IconFromBitmap(img.ConvertToBitmap())
+        icon = wx.EmptyIcon()
+        icon.CopyFromBitmap(bmp)
+        self.SetIcon(icon, "pycpufreq")
+
+    def IconMonitor(self, l=2, r=4):
+	l_off=[128,0,0] # couleurs
+	l_on=[255,0,0]
+	r_off=[0,128,0]
+	r_on=[0,255,0]
+	
+	s_line = "\xff\xff\xff"+"\0"*45
+	s_border = "\xff\xff\xff\0\0\0"
+	s_point = "\0"*3
+	sl_off = string.join(map(chr,l_off),'')*6
+	sl_on = string.join(map(chr,l_on),'')*6
+	sr_off = string.join(map(chr,r_off),'')*6
+	sr_on = string.join(map(chr,r_on),'')*6
+	
+        s=""+s_line
+        for i in range(5):
+            if i<(5-l):
+                sl = sl_off
+            else:
+                sl = sl_on
+
+            if i<(5-r):
+                sr = sr_off
+            else:
+                sr = sr_on
+
+            s+=s_border+sl+s_point+sr+s_point
+            s+=s_border+sl+s_point+sr+s_point
+            s+=s_line
+
+        image = wx.EmptyImage(16,16)
+        image.SetData(s)
+
+        bmp = image.ConvertToBitmap()
+        bmp.SetMask(wx.Mask(bmp, wx.WHITE)) #sets the transparency colour to white 
+
+        icon = wx.EmptyIcon()
+        icon.CopyFromBitmap(bmp)
+        self.SetIcon(icon, "")
+
+

+ 73 - 0
pytemp/cl_actions.py

@@ -0,0 +1,73 @@
+#! /usr/bin/env python
+#-*- coding: utf-8 -*-
+
+from cl_taskbaricon import Tray
+import os,sys
+import wx
+
+PATH=os.path.abspath(os.path.dirname(sys.argv[0])) + '/'
+TEMPERATURE_FILE = '/sys/class/thermal/thermal_zone0/temp'
+TEMPERATURE_DIVISOR = 1000
+
+class Tray_action(Tray):
+    """ Classe dérivée de la gestion de l'icone et du menu qui gère les actions en plus """
+    def __init__(self, app):
+        Tray.__init__(self, app)
+        self.mode = 1
+
+        self.timer = wx.Timer(self)
+        self.timer.Start(3000)
+        self.Bind(wx.EVT_TIMER, self.EachSecond)
+
+        self.CheckTemp()
+        self.DisplayTemp()
+
+    def OnTaskBarActivate(self, evt):
+        self.CreatePopupMenu()
+
+    def DisplayTemp(self):
+        unites=self.temp%10
+        dizaines=(self.temp - unites)/10
+        #print "Temp: %d * 10 + %d" % (dizaines, unites)
+        self.IconMonitor(dizaines - 2, unites/2)
+
+    def OnTaskBarClose(self, evt):
+        print "Au revoir !"
+        self.Destroy()
+
+    def OnTaskBarSetPowersave(self, evt):
+        print "appel de OnTaskBarSetPowersave"
+        os.system("sudo cpufreq-set -g powersave")
+        self.ChangeIcon(PATH + "cpu_powersave.png")
+
+    def OnTaskBarSetOndemand(self, evt):
+        print "appel de OnTaskBarSetOndemand"
+        os.system("sudo cpufreq-set -g ondemand")
+        self.ChangeIcon(PATH + "cpu_ondemand.png")
+
+    def OnTaskBarParam(self, evt):
+        if self.mode:
+            self.IconMonitor(1,4)
+        else:
+            self.ChangeIcon(PATH + "cpu.png")
+        self.mode=not(self.mode)
+
+    def OnTaskBarLock(self, evt):
+        os.system('xlock')
+
+    def OnTaskBarSleep(self, evt):
+        os.system('sudo pm-suspend')
+        #os.system('sudo s2ram -f')
+
+    def CheckTemp(self):
+        """ Recuppère la température actuelle à partir de /sys/class/ """
+        #ofi=open('/proc/acpi/thermal_zone/THRM/temperature')
+        #f=ofi.read()
+        #self.temp=int(f.split(':')[1].strip().replace(" C", ""))
+        ofi = open(TEMPERATURE_FILE)
+        f=ofi.read()
+        self.temp = int(f)/TEMPERATURE_DIVISOR
+
+    def EachSecond(self, evt):
+        self.CheckTemp()
+        self.DisplayTemp()

BIN
pytemp/cl_actions.pyc


BIN
pytemp/cl_actions.pyo


+ 101 - 0
pytemp/cl_taskbaricon.py

@@ -0,0 +1,101 @@
+#! /usr/bin/env python 
+#-*- coding: utf-8 -*-
+# Classe permettant l'affichage d'une icone dans la barre des taches
+# avec menu
+# avec choix de l'icone ou choix d'une grandeur à monitorer
+
+import wx
+import string
+
+class Tray(wx.TaskBarIcon):
+    """ Classe pour l'affichage de l'icone et des menus 
+    dans la barre des taches. """
+
+    #Entrées du menu
+    TBMENU_CREATE = []
+
+    def __init__(self, app):
+        wx.TaskBarIcon.__init__(self)
+        self.app = app
+        self.menu_tmp = []
+        #liaisons Boutons-Méthodes (actions en dur)
+        self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.OnTaskBarActivate)
+
+    def MenuAddItem(self, nom, action):
+        """ Add an item to the menu and link it to corresponding method """
+        if action != None :
+            new_item = wx.NewId()
+            self.menu_tmp.append({nom:new_item})
+            self.Bind(wx.EVT_MENU, action, id=new_item)
+        else:
+            self.menu_tmp.append({nom:None})
+
+    def CreatePopupMenu(self):
+        """ Method called when we need to display the menu """
+        menu = wx.Menu()
+        for item in self.menu_tmp:
+            for nom,action in item.items():
+                if action!=None:
+                    menu.Append(action, nom)
+                else:
+                    menu.AppendSeparator()
+        return menu
+
+    def ChangeIcon(self, imgpath):
+        """ Change taskbar icon """
+        img = wx.Image(imgpath,wx.BITMAP_TYPE_PNG)
+        bmp = img.ConvertToBitmap()
+#        bmp.SetMask(wx.Mask(bmp, wx.Colour().Alpha()))
+        icon = wx.IconFromBitmap(img.ConvertToBitmap())
+        icon = wx.EmptyIcon()
+        icon.CopyFromBitmap(bmp)
+        self.SetIcon(icon, "Temp: %d °C" % self.temp)
+
+    def IconMonitor(self, l=2, r=4):
+        l_off=[128,0,0] # couleurs
+        l_on=[255,0,0]
+        r_off=[0,128,0]
+        r_on=[0,255,0]
+
+        s_line = "\xff\xff\xff"+"\0"*45
+        s_border = "\xff\xff\xff\0\0\0"
+        s_point = "\0"*3
+        sl_off = string.join(map(chr,l_off),'')*6
+        sl_on = string.join(map(chr,l_on),'')*6
+        sr_off = string.join(map(chr,r_off),'')*6
+        sr_on = string.join(map(chr,r_on),'')*6
+
+        s=""+s_line
+        for i in range(5):
+            if i<(5-l):
+                sl = sl_off
+            else:
+                sl = sl_on
+
+            if i<(5-r):
+                sr = sr_off
+            else:
+                sr = sr_on
+
+            s+=s_border+sl+s_point+sr+s_point
+            s+=s_border+sl+s_point+sr+s_point
+            s+=s_line
+
+        image = wx.EmptyImage(16,16)
+        image.SetData(s)
+
+        bmp = image.ConvertToBitmap()
+        bmp.SetMask(wx.Mask(bmp, wx.WHITE)) #sets the transparency colour to white 
+
+        icon = wx.EmptyIcon()
+        icon.CopyFromBitmap(bmp)
+        self.SetIcon(icon, "Temp: %d°C" % self.temp)
+
+    def SetIconTimer(self):
+        self.icon_timer = wx.Timer(self, ID_ICON_TIMER)
+        wx.EVT_TIMER(self, ID_ICON_TIMER, self.BlinkIcon)
+        self.icon_timer.Start(100) 
+
+    def BlinkIcon(self, event):
+        self.CheckTemp()
+        self.MonitorIcon()

BIN
pytemp/cl_taskbaricon.pyc


BIN
pytemp/cl_taskbaricon.pyo


+ 33 - 0
pytemp/main.py

@@ -0,0 +1,33 @@
+#! /usr/bin/env python
+#-*- coding: utf-8 -*-
+
+import wx
+#import cl_taskbaricon
+import cl_actions
+import pynotify
+import sys
+import os
+import time
+
+PATH=os.path.abspath(os.path.dirname(sys.argv[0])) + '/'
+
+class Main(wx.App):
+    def OnInit(self):
+        wx.InitAllImageHandlers()
+        self.tray = cl_actions.Tray_action(self)
+        self.verbose = True
+        return True
+
+if __name__=="__main__" :
+    app = Main()
+#    app.tray.ChangeIcon(PATH + "cpu.png")
+    app.tray.IconMonitor()
+#    app.tray.MenuAddItem("Économique", app.tray.OnTaskBarSetPowersave)
+#    app.tray.MenuAddItem("Ondemand", app.tray.OnTaskBarSetOndemand)
+    app.tray.MenuAddItem("Paramètres", app.tray.OnTaskBarParam)
+    app.tray.MenuAddItem("separateur on s'en fou", None)
+    app.tray.MenuAddItem("Verrouiller l'écran", app.tray.OnTaskBarLock)
+    app.tray.MenuAddItem("Mettre en veille", app.tray.OnTaskBarSleep)
+    app.tray.MenuAddItem("separateur on s'en fou", None)
+    app.tray.MenuAddItem("Quitter", app.tray.OnTaskBarClose)
+    app.MainLoop()

BIN
pytemp/thermometre.jpeg


BIN
pytemp/thermometre.png


Файловите разлики са ограничени, защото са твърде много
+ 3145 - 0
virtuala_navigilo/Iceweasel-icon.svg


+ 230 - 0
virtuala_navigilo/Midori.svg

@@ -0,0 +1,230 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48"
+   height="48"
+   id="svg3612"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   version="1.0"
+   sodipodi:docname="drawing-1.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3614">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 19.696583 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="34.692669 : 19.696583 : 1"
+       inkscape:persp3d-origin="17.346334 : 13.131055 : 1"
+       id="perspective42" />
+    <linearGradient
+       id="linearGradient3412">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.59836066;"
+         offset="0"
+         id="stop3414" />
+      <stop
+         style="stop-color:#4e9a06;stop-opacity:0;"
+         offset="1"
+         id="stop3416" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3458">
+      <stop
+         style="stop-color:#41a100;stop-opacity:1;"
+         offset="0"
+         id="stop3460" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3462" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3412"
+       id="linearGradient2416"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1626866,0.3285437,-0.3285437,1.1626866,325.6313,407.16081)"
+       x1="13"
+       y1="11"
+       x2="40"
+       y2="19" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3458"
+       id="linearGradient2427"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1626866,0.3285437,-0.3285437,1.1626866,327.75135,406.92561)"
+       x1="33"
+       y1="33"
+       x2="4"
+       y2="5" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.2"
+     inkscape:cx="-2.4112669"
+     inkscape:cy="21.831798"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:window-width="1443"
+     inkscape:window-height="766"
+     inkscape:window-x="0"
+     inkscape:window-y="22"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3623"
+       visible="true"
+       enabled="true" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="-24.285714,35.982143"
+       id="guide3782" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="10.535714,-15.357143"
+       id="guide3784" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="8.3928572,12.321429"
+       id="guide3786" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3617">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-322.76854,-423.39033)">
+    <g
+       transform="matrix(1.1626866,0.3285437,-0.3285437,1.1626866,327.85931,406.67587)"
+       style="stroke:none"
+       id="g3562">
+      <path
+         sodipodi:nodetypes="ccsssscssccc"
+         id="path3564"
+         d="M 32.62692,6.6695339 C 28.943103,10.347154 11.111941,12.664469 9,33 C 9.3414198,38.11565 11.750163,44.619293 16.499797,43.597643 C 17.482576,43.386246 18.538501,43.794446 19.203605,44.407481 C 23.555343,48.418538 27.732345,46.782233 28.855024,43.962447 C 29.070261,43.421846 29.754997,43.365614 30.315916,43.589557 C 36.857006,46.201039 38.613158,38.645886 39,33 C 39.096949,30.551387 37.800853,11.942617 35.822153,10.473066 C 35.232485,10.035129 33.801652,12.187441 32.644545,14.379307 C 23.397466,31.895713 11.762403,24.057082 32.238499,7.1548098 L 32.4735,6.6276491 L 32.744417,6.6586341"
+         style="fill:#c5f199;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+      <g
+         style="fill:#c5f199;fill-opacity:1;stroke:none;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:1"
+         id="g3566">
+        <path
+           style="fill:#c5f199;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:1"
+           d="M 24,45 L 24,33"
+           id="path3568" />
+        <path
+           style="fill:#c5f199;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:1"
+           d="M 15,42 L 15,35"
+           id="path3570" />
+        <path
+           style="fill:#c5f199;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:1"
+           d="M 33,42 L 33,35"
+           id="path3572" />
+      </g>
+    </g>
+    <g
+       transform="matrix(1.1626866,0.3285437,-0.3285437,1.1626866,327.85931,406.67587)"
+       id="g3574"
+       style="fill:#73d216;fill-opacity:1;stroke:none">
+      <path
+         sodipodi:nodetypes="csccsssscc"
+         id="path3576"
+         d="M 35.234589,13.724224 C 31.496538,21.805793 21.999895,29.946967 19.494746,24.633171 C 18.259214,22.012423 20.444587,17.339475 24.970511,12.046117 C 19.052984,15.684909 9.0048605,24.657969 10.614085,33.891165 C 10.240096,37.730699 13.217584,44.854617 17.074704,42.528018 C 18.102914,41.907806 19.832336,42.804046 20.452936,43.859693 C 21.771483,46.102557 26.565305,45.447239 27.607052,44.011061 C 28.374886,42.952509 29.980607,42.339501 31.245483,42.634122 C 36.778838,43.922978 37.16615,36.508792 37.142809,33.588177 C 38.771623,22.841659 35.355682,17.704462 35.234589,13.724224 z"
+         style="fill:#73d216;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+      <g
+         style="fill:#73d216;fill-opacity:1;stroke:none;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:1"
+         id="g3578">
+        <path
+           style="fill:#73d216;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:1"
+           d="M 33,42 L 33,35"
+           id="path3580" />
+        <path
+           style="fill:#73d216;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:1"
+           d="M 24,45 L 24,33"
+           id="path3582" />
+        <path
+           style="fill:#73d216;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:1"
+           d="M 15,42 L 15,35"
+           id="path3584" />
+      </g>
+    </g>
+    <path
+       sodipodi:nodetypes="cccsscsc"
+       id="path3586"
+       d="M 329.51073,447.61372 C 332.22018,442.31643 337.23637,442.25529 346.02247,445.13278 C 351.85692,445.13277 359.69811,439.61104 364.13235,434.66153 C 365.12684,453.86745 356.57278,473.21027 348.95566,465.678 C 347.93716,464.67086 347.17038,465.7736 345.66657,466.61478 C 344.22635,467.4204 343.53424,467.54511 341.98051,467.14292 C 336.85873,467.46725 335.86518,459.21391 333.59195,460.87858 C 329.28077,464.03562 327.73041,455.09453 329.51073,447.61372 z"
+       style="fill:url(#linearGradient2427);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="cc"
+       id="path3590"
+       d="M 334.53834,462.27896 C 334.2078,459.40748 333.844,454.00043 336.35842,450.8616"
+       style="fill:none;fill-rule:evenodd;stroke:#c5f199;stroke-width:3.6246419;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       id="path3592"
+       d="M 347.26802,454.03922 C 344.36973,461.6067 346.25402,462.8854 347.66323,466.99966 L 347.66323,466.99966 L 347.66323,466.99966 L 347.48466,466.37466"
+       style="fill:none;fill-rule:evenodd;stroke:#c5f199;stroke-width:3.6246419;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <g
+       transform="matrix(1.1626866,0.3285437,-0.3285437,1.1626866,300.43486,392.47027)"
+       id="g3596">
+      <path
+         style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#204c00;stroke-width:0.82766795;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 58.836696,11.191679 C 54.60152,13.283618 34.371877,21.539565 34.111956,38.37916 C 34.23937,44.016827 37.022977,50.949008 42.995777,48.976423 C 43.419099,48.836853 43.503143,48.965524 43.757523,49.283134 C 47.911767,54.469973 53.736445,51.666736 54.462077,48.968721 C 54.565425,48.584458 54.107103,48.849125 54.462077,48.968721 C 61.90878,51.477628 63.638909,44.604122 64.115394,38.779293 C 65.224194,33.529058 61.312968,14.079248 60.37612,15.673393 C 44.414802,42.833251 39.236631,24.348064 58.836696,11.191679"
+         id="path3598"
+         sodipodi:nodetypes="ccsssscsc" />
+      <g
+         id="g3600"
+         style="fill:none;fill-opacity:1;stroke:#306600;stroke-width:0.82766795;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         transform="translate(25,5)">
+        <g
+           style="stroke:#204c00;stroke-width:0.82766795;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           id="g3602">
+          <path
+             sodipodi:nodetypes="cc"
+             style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#204c00;stroke-width:0.82766795;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="M 18.645566,43.903974 C 15.051587,37.187354 16.540541,35.406359 16.713974,33.280216"
+             id="path3606" />
+          <path
+             sodipodi:nodetypes="cc"
+             style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#204c00;stroke-width:0.82766795;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="M 29.35012,43.828988 C 26.087374,40.085035 25.418677,36.423326 26.118423,33.355781"
+             id="path3608" />
+        </g>
+      </g>
+    </g>
+    <path
+       sodipodi:nodetypes="ccccccc"
+       id="path3610"
+       d="M 351.92318,429.5918 C 352.10808,427.28792 329.31466,436.91697 329.60494,447.76046 C 333.57302,442.60412 337.42833,442.17904 343.75497,444.76136 C 348.36775,449.06988 334.57289,441.21352 351.92318,429.5918 L 351.92318,429.5918 L 351.92318,429.5918 L 351.92318,429.5918 z"
+       style="fill:url(#linearGradient2416);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+  </g>
+</svg>

+ 62 - 0
virtuala_navigilo/README.fr

@@ -0,0 +1,62 @@
+╻ ╻╻┏━┓╺┳╸╻ ╻┏━┓╻  ┏━┓   ┏┓╻┏━┓╻ ╻╻┏━╸╻╻  ┏━┓
+┃┏┛┃┣┳┛ ┃ ┃ ┃┣━┫┃  ┣━┫   ┃┗┫┣━┫┃┏┛┃┃╺┓┃┃  ┃ ┃
+┗┛ ╹╹┗╸ ╹ ┗━┛╹ ╹┗━╸╹ ╹   ╹ ╹╹ ╹┗┛ ╹┗━┛╹┗━╸┗━┛
+
+
+Virtuala Navigilo (0.1) est un pseudo navigateur web qui redirige les requêtes
+d'ouverture d'une nouvelle page vers le navigateur adéquat.
+
+L'objectif est d'apporter une fonction semblable au mécanisme d'alternative
+de Debian, au niveau utilisateur, pour apporter une plus grande simplicité
+dans la gestion de son navigateur préféré.
+
+En effet, actuellement, si vous souhaitez utiliser un navigateur différent
+de x-www-browser, vous êtes obligés de le définir dans chaque application
+susceptible de lancer une page web (messagerie, messagerie instantannée, 
+terminal ...).
+
+                     prefs système
+                     prefs utilisateur
+                     navigateurs lancés
+                             |
+                            \|/
++--------------+    +--------------------+
+| Application1 |--->|  virtuala_navigilo |
++--------------+    |                    |
+                    |                    |----> Lance ou réutilise
++--------------+    |                    |      le navigateur le plus adéquat
+| Application2 |--->|                    |
++--------------+    |                    |
+                    +--------------------+
+
+Cette application devrait être particulièrement utile aux personnes
+utilisant ou souhaitant tester plusieurs navigateurs.
+
+
+Installation
+------------
+
+Vérifier que la variable NomProcessus contient tous les navigateurs du système
+que vous souhaitez utiliser.
+
+Mettre l'exécutable virtuala_navigilo dans un répertoire du $PATH.
+
+Définir dans vos applications l'utilisation du navigateur virtuala_navigilo
+
+Si vous avez des préférences différentes des préférences du système, vous pouvez
+les spécifier dans le fichier ~/.virtuala_navigilo.rc
+
+Vous pouvez également remplacer la/les icones que vous auriez créé sur votre
+bureau pour lancer vos navigateurs par une icone lançant Virtuala Navigilo.
+
+
+Exemple de .virtuala_navigilo.rc
+--------------------------------
+## Fichier de préférence de navigateur web pour l'utilisateur
+# Seule la ligne 'Best: ' est exploitée
+Link: x-www-browser
+Status: manual
+Best: /usr/bin/midori
+Value: /usr/bin/midori
+
+

+ 3 - 0
virtuala_navigilo/TODO

@@ -0,0 +1,3 @@
+à regarder:
+- ce que dit freedesktop
+- module python webbrowser 

+ 192 - 0
virtuala_navigilo/go-next.svg

@@ -0,0 +1,192 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   sodipodi:docname="go-next.svg"
+   sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/actions"
+   inkscape:version="0.46"
+   sodipodi:version="0.32"
+   id="svg11300"
+   height="48"
+   width="48"
+   inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
+   inkscape:export-xdpi="90.000000"
+   inkscape:export-ydpi="90.000000"
+   version="1.0"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 24 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="48 : 24 : 1"
+       inkscape:persp3d-origin="24 : 16 : 1"
+       id="perspective23" />
+    <linearGradient
+       id="linearGradient2591">
+      <stop
+         style="stop-color:#73d216"
+         offset="0"
+         id="stop2593" />
+      <stop
+         style="stop-color:#4e9a06"
+         offset="1.0000000"
+         id="stop2595" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient8662"
+       inkscape:collect="always">
+      <stop
+         id="stop8664"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop8666"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient8650"
+       inkscape:collect="always">
+      <stop
+         id="stop8652"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop8654"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.046729,-3.749427e-16,2.853404e-16,1.557610,-19.51799,3.452086)"
+       r="17.171415"
+       fy="2.8969381"
+       fx="19.701141"
+       cy="2.8969381"
+       cx="19.701141"
+       id="radialGradient8656"
+       xlink:href="#linearGradient8650"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,2.511012e-15,16.87306)"
+       r="15.644737"
+       fy="36.421127"
+       fx="24.837126"
+       cy="36.421127"
+       cx="24.837126"
+       id="radialGradient8668"
+       xlink:href="#linearGradient8662"
+       inkscape:collect="always" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2591"
+       id="radialGradient2597"
+       cx="22.291636"
+       cy="32.797512"
+       fx="22.291636"
+       fy="32.797512"
+       r="16.9562"
+       gradientTransform="matrix(0.843022,1.871885e-16,-2.265228e-16,1.020168,4.499298,1.381992)"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     inkscape:window-y="30"
+     inkscape:window-x="0"
+     inkscape:window-height="818"
+     inkscape:window-width="1280"
+     inkscape:showpageshadow="false"
+     inkscape:document-units="px"
+     inkscape:grid-bbox="true"
+     showgrid="false"
+     inkscape:current-layer="layer1"
+     inkscape:cy="27.398876"
+     inkscape:cx="20.508639"
+     inkscape:zoom="11.313708"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     borderopacity="0.25490196"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     fill="#4e9a06"
+     stroke="#4e9a06" />
+  <metadata
+     id="metadata4">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Jakub Steiner</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:source>http://jimmac.musichall.cz</dc:source>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+        <dc:title>Go Next</dc:title>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>go</rdf:li>
+            <rdf:li>next</rdf:li>
+            <rdf:li>right</rdf:li>
+            <rdf:li>arrow</rdf:li>
+            <rdf:li>pointer</rdf:li>
+            <rdf:li>&gt;</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/publicdomain/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     inkscape:label="Layer 1"
+     id="layer1">
+    <path
+       transform="matrix(1.271186,0.000000,0.000000,1.271186,-8.119376,-15.10179)"
+       d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1  9.1923885,36.421127 A 15.644737 8.3968935 0 1 1  40.481863 36.421127 z"
+       sodipodi:ry="8.3968935"
+       sodipodi:rx="15.644737"
+       sodipodi:cy="36.421127"
+       sodipodi:cx="24.837126"
+       id="path8660"
+       style="opacity:0.29946522;color:#000000;fill:url(#radialGradient8668);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:nodetypes="cccccccc"
+       id="path8643"
+       d="M 8.5541875,15.517348 L 8.5541875,32.511768 L 21.538,32.511768 L 21.538,41.056806 L 41.497835,24.150365 L 21.41919,7.1251168 L 21.41919,15.522652 L 8.5541875,15.517348 z "
+       style="opacity:1;color:#000000;fill:url(#radialGradient2597);fill-opacity:1;fill-rule:evenodd;stroke:#3a7304;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    <path
+       sodipodi:nodetypes="cccccc"
+       id="path8645"
+       d="M 21.962385,8.2485033 L 21.962385,16.054978 L 9.1452151,16.054978 L 9.1452151,25.095691 C 26.895215,27.095691 25.778752,17.640403 40.528752,24.140403 L 21.962385,8.2485033 z "
+       style="opacity:0.5080214;color:#000000;fill:url(#radialGradient8656);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    <path
+       style="opacity:0.48128339;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 9.537702,16.561892 L 9.537702,31.546332 L 22.523069,31.546332 L 22.523069,38.941498 L 40.001083,24.145807 L 22.507108,9.3654066 L 22.507108,16.566789 L 9.537702,16.561892 z "
+       id="path8658"
+       sodipodi:nodetypes="cccccccc" />
+  </g>
+</svg>

Файловите разлики са ограничени, защото са твърде много
+ 693 - 0
virtuala_navigilo/internet-web-browser.svg


+ 603 - 0
virtuala_navigilo/pitr_red_arrows_set_4.svg

@@ -0,0 +1,603 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   sodipodi:docname="kuba_red_arrow_right.svg"
+   sodipodi:docbase="D:\Documents and Settings\Joanna\My Documents\My Pictures\graph_vector\admin"
+   inkscape:version="0.45.1"
+   sodipodi:version="0.32"
+   id="svg1878"
+   height="27.776558"
+   width="36.514278"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.0"
+   inkscape:export-filename="D:\Documents and Settings\Joanna\My Documents\My Pictures\graph_vector\admin\kuba_red_arrows_set.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <metadata
+     id="metadata3">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:title>Arrow icon set</dc:title>
+        <dc:description>icons for toolbar buttons</dc:description>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>icon</rdf:li>
+            <rdf:li>arrow</rdf:li>
+            <rdf:li>navigation</rdf:li>
+            <rdf:li>green</rdf:li>
+            <rdf:li>red</rdf:li>
+            <rdf:li>button</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <dc:publisher>
+          <cc:Agent
+             rdf:about="http://www.openclipart.org">
+            <dc:title>Open Clip Art Library</dc:title>
+          </cc:Agent>
+        </dc:publisher>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Jakub Jankiewicz</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:rights>
+          <cc:Agent>
+            <dc:title>Jakub Jankiewicz</dc:title>
+          </cc:Agent>
+        </dc:rights>
+        <dc:date />
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <cc:license
+           rdf:resource="http://web.resource.org/cc/PublicDomain" />
+        <dc:language>pl</dc:language>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://web.resource.org/cc/PublicDomain">
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/Reproduction" />
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/Distribution" />
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs3">
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient4214"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.80139,-1.247831,0,-91.98082,2.832902)"
+       x1="392.41861"
+       y1="-308.43417"
+       x2="412.94818"
+       y2="-287.17914" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient4220"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.80139,0,0,1.247832,-83.30236,3.761402)"
+       x1="358.60312"
+       y1="247.41286"
+       x2="341.68527"
+       y2="267.08432" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7090"
+       id="linearGradient9068"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(-1.20748,-0.828171)"
+       x1="-451.17389"
+       y1="-315.64212"
+       x2="-433.6821"
+       y2="-333.89999" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2315"
+       id="linearGradient9071"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.867067,0,0,-0.594693,497.8279,330.6143)"
+       x1="-53.427612"
+       y1="109.7897"
+       x2="-31.586103"
+       y2="95.684341" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2372"
+       id="linearGradient8316"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.136424,0,0,0.418246,623.2448,181.4234)"
+       x1="-50.436199"
+       y1="124.94588"
+       x2="-50.436199"
+       y2="165.6252" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7090"
+       id="linearGradient8960"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1.20748,-0.828171,0,0,0)"
+       x1="215.31508"
+       y1="-458.99512"
+       x2="233.06174"
+       y2="-441.21478" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2315"
+       id="linearGradient8963"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.867067,-0.594693,0,434.3013,307.465)"
+       x1="-53.427612"
+       y1="109.7897"
+       x2="-31.586103"
+       y2="95.684341" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2372"
+       id="linearGradient8322"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.136424,0,0,0.418246,475.3562,179.7453)"
+       x1="-50.436199"
+       y1="124.94588"
+       x2="-50.436199"
+       y2="165.6252" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7090"
+       id="linearGradient10532"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.20748,0,0,0.828171,-24.66659,304.2048)"
+       x1="248.20323"
+       y1="312.07166"
+       x2="230.44843"
+       y2="331.67487" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2315"
+       id="linearGradient10530"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.867067,0,0,0.594693,300.8685,509.5204)"
+       x1="-53.427612"
+       y1="109.7897"
+       x2="-31.586103"
+       y2="95.684341" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2372"
+       id="linearGradient10528"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.136424,0,0,0.418246,389.9845,182.2898)"
+       x1="-50.436199"
+       y1="124.94588"
+       x2="-50.436199"
+       y2="165.6252" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient7377"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.80139,0,0,-1.247831,-11.99137,4.689902)"
+       x1="-579.00195"
+       y1="-246.08231"
+       x2="-559.39771"
+       y2="-267.71384" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient7666"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.80139,0,0,1.247832,21.81462,45.70683)"
+       x1="358.60312"
+       y1="247.41286"
+       x2="341.68527"
+       y2="267.08432" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient7664"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.80139,0,0,1.247832,-2.077583,45.70683)"
+       x1="358.60312"
+       y1="247.41286"
+       x2="341.68527"
+       y2="267.08432" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient7732"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.80139,-1.247832,0,0,0)"
+       x1="488.85745"
+       y1="-301.27124"
+       x2="507.57675"
+       y2="-281.40521" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient7730"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.80139,-1.247832,0,0,0)"
+       x1="458.62335"
+       y1="-301.67392"
+       x2="477.9736"
+       y2="-280.46561" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient7718"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(-0.80139,-1.247832)"
+       x1="-563.7262"
+       y1="-297.63159"
+       x2="-546.16992"
+       y2="-318.54547" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient7716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(-0.80139,-1.247832)"
+       x1="-593.22046"
+       y1="-298.25281"
+       x2="-575.34497"
+       y2="-318.54547" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient7714"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-0.80139,1.247831,0,-75.01063,3.703202)"
+       x1="-390.87134"
+       y1="361.03598"
+       x2="-413.24628"
+       y2="338.45248" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient7756"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-0.80139,1.247832,0,0,0)"
+       x1="-456.45148"
+       y1="358.80856"
+       x2="-476.01202"
+       y2="338.0029" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient7754"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-0.80139,1.247832,0,0,0)"
+       x1="-485.63391"
+       y1="358.67432"
+       x2="-505.8255"
+       y2="337.60022" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7090"
+       id="linearGradient9014"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1.20748,0.828171,0,0,0)"
+       x1="-215.19727"
+       y1="558.79907"
+       x2="-232.25471"
+       y2="540.76831" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2315"
+       id="linearGradient9017"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-0.867067,0.594693,0,393.8812,233.7987)"
+       x1="-53.427612"
+       y1="109.7897"
+       x2="-31.586103"
+       y2="95.684341" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2372"
+       id="linearGradient8328"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.136424,0,0,0.418246,553.0718,180.3036)"
+       x1="-50.436199"
+       y1="124.94588"
+       x2="-50.436199"
+       y2="165.6252" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient8731"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(-1.20748,-0.828171)"
+       x1="-451.30542"
+       y1="-228.70355"
+       x2="-434.33966"
+       y2="-246.57704" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2315"
+       id="linearGradient8734"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.867067,0,0,-0.594693,497.8279,258.6143)"
+       x1="-53.427612"
+       y1="109.7897"
+       x2="-31.586103"
+       y2="95.684341" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2372"
+       id="linearGradient8622"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.136424,0,0,0.418246,623.2448,181.4234)"
+       x1="-50.436199"
+       y1="124.94588"
+       x2="-50.436199"
+       y2="165.6252" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient8765"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1.20748,-0.828171,0,0,0)"
+       x1="155.51448"
+       y1="-459.7464"
+       x2="173.43343"
+       y2="-440.7139" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2315"
+       id="linearGradient8768"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.867067,-0.594693,0,434.3013,235.465)"
+       x1="-53.427612"
+       y1="109.7897"
+       x2="-31.586103"
+       y2="95.684341" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2372"
+       id="linearGradient8628"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.136424,0,0,0.418246,475.3562,179.7453)"
+       x1="-50.436199"
+       y1="124.94588"
+       x2="-50.436199"
+       y2="165.6252" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient8771"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.20748,0.828171)"
+       x1="248.07172"
+       y1="224.94089"
+       x2="230.57993"
+       y2="244.73628" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2315"
+       id="linearGradient8774"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.867067,0,0,0.594693,325.5351,133.3156)"
+       x1="-53.427612"
+       y1="109.7897"
+       x2="-31.586103"
+       y2="95.684341" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2372"
+       id="linearGradient8634"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.136424,0,0,0.418246,389.9845,182.2898)"
+       x1="-50.436199"
+       y1="124.94588"
+       x2="-50.436199"
+       y2="165.6252" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient8759"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1.20748,0.828171,0,0,0)"
+       x1="-155.74126"
+       y1="558.79907"
+       x2="-171.93723"
+       y2="541.26917" />
+    <linearGradient
+       id="linearGradient2315">
+      <stop
+         style="stop-color:#83cb46;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop2317" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop2319" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2315"
+       id="linearGradient8762"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-0.867067,0.594693,0,393.8812,161.7987)"
+       x1="-53.427612"
+       y1="109.7897"
+       x2="-31.586103"
+       y2="95.684341" />
+    <linearGradient
+       id="linearGradient2372">
+      <stop
+         style="stop-color:#006f9d;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop2374" />
+      <stop
+         style="stop-color:#7bcefb;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop2376" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2372"
+       id="linearGradient8640"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.136424,0,0,0.418246,553.0718,180.3036)"
+       x1="-50.436199"
+       y1="124.94588"
+       x2="-50.436199"
+       y2="165.6252" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient9478"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.673203,0,0,-1.147595,-296.4722,-123.4769)"
+       x1="-451.30542"
+       y1="-228.70355"
+       x2="-434.33966"
+       y2="-246.57704" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient9375"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1.673203,-1.147595,0,-237.2859,-125.731)"
+       x1="155.51448"
+       y1="-459.7464"
+       x2="173.43343"
+       y2="-440.7139" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient9351"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.673203,0,0,1.147595,-203.141,-119.8205)"
+       x1="248.07172"
+       y1="224.94089"
+       x2="230.57993"
+       y2="244.73628" />
+    <linearGradient
+       id="linearGradient11462">
+      <stop
+         style="stop-color:#80ff26;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop11464" />
+      <stop
+         style="stop-color:#2c9600;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop11466" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11462"
+       id="linearGradient9447"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1.673203,1.147595,0,-269.0057,-124.9573)"
+       x1="-155.74126"
+       y1="558.79907"
+       x2="-171.93723"
+       y2="541.26917" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7090"
+       id="linearGradient9491"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.673203,0,0,-1.147595,-296.4722,-182.0235)"
+       x1="-451.30542"
+       y1="-228.70355"
+       x2="-434.33966"
+       y2="-246.57704" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7090"
+       id="linearGradient9493"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1.673203,-1.147595,0,-237.2859,-184.2777)"
+       x1="155.51448"
+       y1="-459.7464"
+       x2="173.43343"
+       y2="-440.7139" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7090"
+       id="linearGradient9495"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.673203,0,0,1.147595,-203.141,-178.3671)"
+       x1="248.07172"
+       y1="224.94089"
+       x2="230.57993"
+       y2="244.73628" />
+    <linearGradient
+       id="linearGradient7090">
+      <stop
+         style="stop-color:#ff2a26;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop7092" />
+      <stop
+         style="stop-color:#96000d;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop7094" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient7090"
+       id="linearGradient9497"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1.673203,1.147595,0,-269.0057,-183.504)"
+       x1="-155.74126"
+       y1="558.79907"
+       x2="-171.93723"
+       y2="541.26917" />
+  </defs>
+  <sodipodi:namedview
+     inkscape:window-y="65"
+     inkscape:window-x="99"
+     inkscape:window-height="581"
+     inkscape:window-width="836"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     inkscape:cy="239.99998"
+     inkscape:cx="320"
+     inkscape:zoom="0.77472527"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     height="200px"
+     width="283.23425px" />
+  <metadata
+     id="metadata4">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     inkscape:label="Layer 1"
+     id="layer1"
+     transform="translate(-179.04255,-77.464742)">
+    <path
+       style="color:#000000;fill:url(#linearGradient9495);fill-opacity:1;fill-rule:nonzero;stroke:#6b1a11;stroke-width:1.75;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 200.81343,78.339742 L 200.81343,83.688082 L 179.91755,83.688082 L 179.91755,98.986852 L 200.81343,98.986852 L 200.81343,104.3663 L 214.68183,91.337472 L 200.81343,78.339742 z "
+       id="path10091"
+       sodipodi:nodetypes="cccccccc" />
+  </g>
+</svg>

+ 171 - 0
virtuala_navigilo/virtuala_navigilo.py

@@ -0,0 +1,171 @@
+#! /usr/bin/env python
+# *-* encoding: utf-8
+
+# Virtuala Navigilo : redirige une requête d'ouverture de lien de manière
+# optimale suivant votre navigateur préféré et du/des navigateur(s) déjà
+# lancé(s).
+
+import sys
+import os
+
+# Config
+FICHIER_CONF = os.environ['HOME']+'/.virtuala_navigilo.rc'
+
+# Table de correspondance nom binaire <=> nom processus
+NomProcessus = {'firefox-esr':'firefox-esr', \
+                'midori':'midori', \
+                'chromium-browser':'chromium-browser', \
+                'xlinks2':'xlinks2', \
+                '/home/docs/icecat/icecat/icecat-bin':'icecat-bin', \
+                #'w3m':'w3m' \
+                }
+
+
+class Navigateur:
+    """ Classe regroupant les paramètres et méthodes associés à un navigateur
+        du système. """
+
+    def __init__(self, nom, executable, nom_processus, tourne):
+        self.nom = nom
+        self.executable = executable
+        self.nom_processus = nom_processus
+        self.tourne = tourne
+        self.priorite = 0
+
+    def lance(self, url=False):
+        """ Lance le navigateur """
+        if url:
+            os.execl(self.executable, self.executable, url)
+        else:
+            os.execl(self.executable, self.executable)
+
+    def DefinitPriorite(self) :
+        """ Définit la priorité donnée au navigateur. Le choix de
+            l'utilisateur, si existant prévaut sur le choix système. """
+
+        # Obtention du choix système
+        sppref = os.popen('update-alternatives --query x-www-browser')
+        spref = sppref.readlines()
+        sppref.close()
+
+        for l in spref:
+            l = l.split(': ')
+            #TODO : lire toutes les valeurs, pas seulement la Best !
+            if l[0] == 'Best':
+                b = l[1].strip('\n')
+                b = b.strip(' ')
+                if b == self.executable:
+                    self.priorite = 100
+                    #print(" Priorité du systeme: %s  = 100" % self.executable)
+
+        # Si les préférences utilisateurs sont disponibles, on les utilise.
+        # On écrase ainsi les préfs système
+        if os.access(FICHIER_CONF, os.R_OK):
+            uppref = open(FICHIER_CONF, 'r')
+            upref = uppref.readlines()
+            uppref.close()
+
+            for l in upref:
+                l = l.split(': ')
+                #TODO : idem, gérer les autres que Best ?
+                if l[0] == 'Best':
+                    b = l[1].strip('\n')
+                    b = b.strip(' ')
+                    if b == self.executable:
+                        self.priorite = 100
+                        #print(" Priorité utilisateur : %s  = 100" % self.executable)
+        else:
+            print "Pas de préférences utilisateur. Pour y rémédier, créez un ~/.navigateur_virtuel."
+
+
+
+def NavigateursSysteme():
+    """ Retourne un tableau des navigateurs installés avec leurs informations
+        utiles. """
+
+    navigateurs = []
+
+    # Obtention des navigateurs présents sur le système
+    pliste = os.popen('update-alternatives --list x-www-browser')
+    tmp_bin = pliste.readlines()
+    pliste.close()
+
+    # Détermination de l'état des navigateurs du système pour l'utilisateur
+    ps = os.popen('''ps -Au $USER''')
+    tmp_etat = ps.readlines()
+    ps.close()
+    
+    for i in xrange(len(tmp_bin)):
+        # Conditionnement du chemin du binaire
+        executable = tmp_bin[i].replace('\n', '')
+
+        # Extraction du nom (nom du binaire)
+        nom = executable.split('/')[-1]
+
+        # Détermination de l'état
+        try:
+            np = NomProcessus[nom]
+            etat = False
+            for l in tmp_etat:
+                if np in l:
+                    etat = True
+
+            navigateurs.append(Navigateur(nom, executable, NomProcessus[nom], etat))
+
+        except KeyError:
+            print("Navigateur « %s » trouvé sur le système mais pas d'informations \
+disponibles sur ce navigateur, il sera ignoré." % nom)
+
+    return navigateurs
+
+
+def NavigateurPreferable(navigateurs):
+    """ A partir d'un tableau de Navigateur, retourne le plus prioritaire lancé
+        ou à défaut le plus prioritaire spécifié par l'utilisateur ou le système.  """
+
+    max_nav = False
+    max_prio = 0
+
+    for nav in navigateurs:
+        if nav.tourne:
+            if nav.priorite > max_prio:
+                max_nav = nav
+
+    # Pas de naviguateur lancé
+    if not max_nav:
+        for nav in navigateurs:
+            if nav.priorite > max_prio:
+                max_nav = nav
+
+    return max_nav
+
+
+def main():
+    params = False
+    if len(sys.argv) > 1:
+        params = sys.argv[1]
+
+    # Construction de la liste des navigateurs potentiels
+    navigateurs = NavigateursSysteme()
+
+    print("%d navigateur(s) trouvé(s) sur le système :" % len(navigateurs))
+    for nav in navigateurs:
+        print("   * %s [tourne=%s]" % (nav.nom, nav.tourne))
+
+    # Etablissement des priorités de chaque navigateur
+    for nav in navigateurs:
+        nav.DefinitPriorite()
+
+    # Choix du navigateur à utiliser
+    nav = NavigateurPreferable(navigateurs)
+    print "Navigateur retenu : %s, priorite=%d, tourne=%s" % (nav.nom, nav.priorite, nav.tourne)
+
+    if nav:
+        # Lancement du navigateur
+        nav.lance(params)
+    else:
+        print "Oups ! Aucun navigateur ne sera lancé !"
+
+if __name__ == '__main__':
+    main()
+

+ 7 - 0
virtuala_navigilo/virtuala_navigilo.rc_exemple

@@ -0,0 +1,7 @@
+## Fichier de préférence de navigateur web pour l'utilisateur
+# Seule la ligne 'Best: ' est exploitée
+Link: x-www-browser
+Status: manual
+Best: /usr/bin/midori
+Value: /usr/bin/midori
+

BIN
virtuala_navigilo/virtuala_navigilo_logo.png


Файловите разлики са ограничени, защото са твърде много
+ 1453 - 0
virtuala_navigilo/virtuala_navigilo_logo.svg


BIN
virtuala_navigilo/virtuala_navigilo_logo128.png


BIN
virtuala_navigilo/virtuala_navigilo_logo32.png


Някои файлове не бяха показани, защото твърде много файлове са промени