
    uc>                        d Z ddlZddlZddlZddlmZmZ ddlmZ ddl	m
Z
mZ ddlZ G d de          Z G d d	e          Zg ZeD ]^Ze                    ej                            ed
                     e                    ej                            ed                     _e                    ej                            d                     g ai Zi Zi Zddg dfdZd Zd Zd Zd Zd ZdS )z`
Complete implementation of the XDG Icon Spec
http://standards.freedesktop.org/icon-theme-spec/
    N)IniFileis_ascii)xdg_data_dirs)NoThemeErrordebugc                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )	IconThemez&Class to parse and validate IconThemesc                 .    t          j        |            d S Nr   __init__selfs    //usr/lib/python3/dist-packages/xdg/IconTheme.pyr   zIconTheme.__init__           c                     | j         S r   )namer   s    r   __repr__zIconTheme.__repr__   s
    yr   c                     t          j        | |ddg           t          j                            |          | _        t          j                            | j                  \  }| _        d S )Nz
Icon ThemeKDE Icon Theme)r   parseospathdirnamedirsplitr   )r   filenils      r   r   zIconTheme.parse   sQ    dD<1A"BCCC7??4((7==22diiir   c                     | j         S r   )r   r   s    r   getDirzIconTheme.getDir   s	    xr   c                 0    |                      dd          S )NNameTlocalegetr   s    r   getNamezIconTheme.getName    s    xxtx,,,r   c                 0    |                      dd          S )NCommentTr$   r&   r   s    r   
getCommentzIconTheme.getComment"   s    xx	$x///r   c                 0    |                      dd          S )NInheritsTlistr&   r   s    r   getInheritszIconTheme.getInherits$   s    xx
x...r   c                 0    |                      dd          S )NDirectoriesTr.   r&   r   s    r   getDirectorieszIconTheme.getDirectories&   s    xxDx111r   c                 0    |                      dd          S )NScaledDirectoriesTr.   r&   r   s    r   getScaledDirectorieszIconTheme.getScaledDirectories(   s    xx+$x777r   c                 0    |                      dd          S )NHiddenbooleantyper&   r   s    r   	getHiddenzIconTheme.getHidden*   s    xxyx111r   c                 ,    |                      d          S )NExampler&   r   s    r   
getExamplezIconTheme.getExample,   s    xx	"""r   c                 2    |                      dd|          S )NSizeintegerr;   groupr&   r   	directorys     r   getSizezIconTheme.getSize0   s    xxYix@@@r   c                 0    |                      d|          S )NContextrD   r&   rE   s     r   
getContextzIconTheme.getContext2   s    xx	x333r   c                 <    |                      d|          }|r|S dS )NTyperJ   	Thresholdr&   r   rF   values      r   getTypezIconTheme.getType4   s)    y11 	L;r   c                 p    |                      dd|          }|s|dk    r|S |                     |          S )NMaxSizerB   rC   r   r'   rG   rO   s      r   
getMaxSizezIconTheme.getMaxSize:   @    )DD 	+EQJJL<<	***r   c                 p    |                      dd|          }|s|dk    r|S |                     |          S )NMinSizerB   rC   r   rT   rO   s      r   
getMinSizezIconTheme.getMinSize@   rV   r   c                 J    |                      dd|          }|s|dk    r|S dS )NrN   rB   rC   r      r&   rO   s      r   getThresholdzIconTheme.getThresholdF   s3    9IFF 	EQJJL1r   c                 :    |                      dd|          }|pdS )NScalerB   rC      r&   rO   s      r   getScalezIconTheme.getScaleM   s#    y	BBzr   c                    | j         dk    r| j                            d           | j        dk    rn@| j        dk    r| j                            d           n| j                            d           	 | j        | j                  d         | _        n*# t          $ r | j                            d           Y nw xY w	 | j        | j                  d	         | _        n*# t          $ r | j                            d
           Y nw xY w	 | j        | j                  d         | _	        d S # t          $ r | j                            d           Y d S w xY w)Nr   z%[KDE Icon Theme]-Header is deprecatedz.themez.desktopz$.desktop fileExtension is deprecatedUnknown File extensionr#   zKey 'Name' is missingr*   zKey 'Comment' is missingr2   zKey 'Directories' is missing)
defaultGroupwarningsappendfileExtensioncontentr   KeyErrorerrorscommentdirectoriesr   s    r   checkExtraszIconTheme.checkExtrasR   s    000M  !HIII )):--M  !GHHHHM  !9:::	8T%67?DII 	8 	8 	8K677777	8	;<(9:9EDLL 	; 	; 	;K9:::::	;	?#|D,=>}MD 	? 	? 	?K=>>>>>>	?s6   3B $B87B8<C $D DD$ $$EEc                    || j         k    r	 | j        |         d         | _        n-# t          $ r  | j                            d|z             Y nw xY w	 | j        |         d         | _        d S # t          $ r! | j                            d|z             Y d S w xY w||                                 v rz	 | j        |         d         | _        n# t          $ r
 d| _        Y nw xY w	 | j        |         d         | _        d S # t          $ r! | j                            d|z             Y d S w xY wt          j	        d	|          rt          |          s| j                            d
|z             d S d S )Nr#   z#Key 'Name' in Group '%s' is missingr*   z&Key 'Comment' in Group '%s' is missingrM   rN   rA   z#Key 'Size' in Group '%s' is missing^\[X-Invalid Group name: %s)rc   rg   r   rh   ri   re   r3   r;   rematchr   r   rD   s     r   
checkGroupzIconTheme.checkGroupr   s   D%%%R L/7		 R R R""#H5#PQQQQQRU L/	:			 U U U""#Ke#STTTTTTUd))++++( L/7		 ( ( ('			(R L/7			 R R R""#H5#PQQQQQQR(8U++ 	A 	AK7%?@@@@@	A 	AsE   & 'AAA. .'BB3C C C $C> >'D)(D)c                 (   || j         k    r,t          j        dt          j        j        z   dz   |          rd S t          j        dt          j        j        z   dz   |          rd S |dk    r|                     ||d           d S |dk    r|                     ||d           d S |dk    r|                     ||d           d S |d	k    r|                     ||d
           d S |dk    r|                     ||           d S t          j        d|          rd S | j                            d|z             d S || 	                                v r|dk    r|                     ||d           d S |dk    r|                     ||           d S |dk    r;|                     ||           |dvr| j                            d|z             d S d S |dk    rI|                     ||d           | j
        dk    r$| j                            d| j
        z             d S d S |dk    rI|                     ||d           | j
        dk    r$| j                            d| j
        z             d S d S |dk    rI|                     ||d           | j
        dk    r$| j                            d| j
        z             d S d S |dk    r|                     ||d           d S t          j        d|          rd S | j                            d|z             d S d S )Nz^Name$z^Commentr-   Tr.   r2   r5   r8   r9   r:   r>   ^X-[a-zA-Z0-9-]+Invalid key: %srA   rB   rI   rM   )FixedScalablerN   zGKey 'Type' must be one out of 'Fixed','Scalable','Threshold', but is %srS   ry   z"Key 'MaxSize' give, but Type is %srX   z"Key 'MinSize' give, but Type is %srN   z$Key 'Threshold' give, but Type is %sr^   )rc   rp   rq   xdgLocaleregex
checkValueri   re   r3   r;   r   keyrP   rD   s       r   checkKeyzIconTheme.checkKey   s   D%%%x
 004c:: <*SZ%55c93?? <
""U66666%%U66666+++U66666U;;;;;	!!U+++++,c22 <""#4s#:;;;;;d))++++f}}U;;;;;	!!U+++++U+++ BBBK&&'psx'xyyyyy CB	!!U;;;9
**K&&'Kdi'WXXXXX +*	!!U;;;9
**K&&'Kdi'WXXXXX +*##U;;;9++K&&'MPTPY'YZZZZZ ,+U;;;;;,c22 <""#4s#:;;;;;5 ,+r   N)__name__
__module____qualname____doc__r   r   r   r!   r(   r+   r0   r3   r6   r<   r?   rG   rK   rQ   rU   rY   r\   r`   rl   rs   r    r   r   r	   r	      s\       ,,    3 3 3
  - - -0 0 0/ / /2 2 28 8 82 2 2# # #A A A4 4 4  + + ++ + +    
? ? ?@A A A./< /< /< /< /<r   r	   c                   H    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )IconDataz*Class to parse and validate IconData Filesc                 .    t          j        |            d S r   r   r   s    r   r   zIconData.__init__   r   r   c                 <    |                                  }|rd|z  S dS )Nz<IconData: %s>z
<IconData>)getDisplayName)r   displaynames     r   r   zIconData.__repr__   s+    ))++ 	 #k11<r   c                 4    t          j        | |dg           d S )Nz	Icon Data)r   r   )r   r   s     r   r   zIconData.parse   s    dD;-00000r   c                 0    |                      dd          S )zBRetrieve the display name from the icon data, if one is specified.DisplayNameTr$   r&   r   s    r   r   zIconData.getDisplayName   s    xxdx333r   c                 2    |                      ddd          S )zzRetrieve the embedded text rectangle from the icon data as a list of
        numbers (x0, y0, x1, y1), if it is specified.EmbeddedTextRectanglerB   Tr;   r/   r&   r   s    r   getEmbeddedTextRectanglez!IconData.getEmbeddedTextRectangle   s     xx/idxKKKr   c                 2    |                      ddd          S )zRetrieve the anchor points for overlays & emblems from the icon data,
        as a list of co-ordinate pairs, if they are specified.AttachPointspointTr   r&   r   s    r   getAttachPointszIconData.getAttachPoints   s     xxW4x@@@r   c                 T    | j         dk    r| j                            d           d S d S )N.iconrb   )rf   rd   re   r   s    r   rl   zIconData.checkExtras   s5    ((M  !9::::: )(r   c                     || j         k    sWt          j        d|          rt          |          s5| j                            d|                    dd          z             d S d S d S )Nrn   ro   asciireplace)rc   rp   rq   r   ri   re   encoderr   s     r   rs   zIconData.checkGroup   sq    ***HXu%% +*25// +K7%,,wPY:Z:ZZ[[[[[ +***r   c                 J   t          j        dt          j        j        z   dz   |          rd S |dk    r|                     ||dd           d S |dk    r|                     ||dd           d S t          j        d	|          rd S | j                            d
|z             d S )Nz^DisplayNameru   r   rB   Tr   r   r   rv   rw   )rp   rq   rz   r{   r|   r}   ri   re   r~   s       r   r   zIconData.checkKey   s    8N3:#33C7== 		8D+++OOCYTOBBBBBN""OOCW4O@@@@@X(#.. 	8DK03677777r   N)r   r   r   r   r   r   r   r   r   r   rl   rs   r   r   r   r   r   r      s        00       1 1 14 4 4L L LA A A; ; ;
\ \ \8 8 8 8 8r   r   iconspixmapsz~/.icons)pngsvgxpmc                    |dk    rt           j        j        }|dk    rt           j        j        }t          j                            |           r| S t          j                            |           d         dd         |v r%t          j                            |           d         } t          g k    st          d         j	        |k    rt          t          |                    a| ||t          |          f}	 t          |         \  }}t          j                    |z
  t           j        j        k    r	t          |= n|S # t           $ r Y nw xY wt          D ]7}t#          | |||          }|r!t          j                    |ft          |<   |c S 8t$          D ]}|t&          vs{t)          t          j                    t&          |         d         z
            t           j        j        k    rt&          |         d         t          j                            |          k     rlt          j                            |          rMt	          j        |          t          j                    t          j                            |          ft&          |<   t&                                          D ]\  }	}
|D ]|}	 | dz   |z   |
d         v rIt          j                            |	| dz   |z             }t          j                    |gt          |<   |c c S ]# t4          $ r}t6          r|Y d}~ud}~ww xY w|dk    r0t9          | |d          }t          j                    |gt          |<   |S dS )a  Get the path to a specified icon.
    
    size :
      Icon size in pixels. Defaults to ``xdg.Config.icon_size``.
    theme :
      Icon theme name. Defaults to ``xdg.Config.icon_theme``. If the icon isn't
      found in the specified theme, it will be looked up in the basic 'hicolor'
      theme.
    extensions :
      List of preferred file extensions.
    
    Example::
    
        >>> getIconPath("inkscape", 32)
        '/usr/share/icons/hicolor/32x32/apps/inkscape.png'
    Nr_   r   r[   .hicolor)rz   Config	icon_size
icon_themer   r   isabssplitextthemesr   r/   __get_themestuple
icon_cachetime
cache_timerh   
LookupIconicondirs	dir_cacheintgetmtimeisdirlistdiritemsjoinUnicodeDecodeErrorr   getIconPath)iconnamesizetheme
extensionstmp	timestampiconthmerF   r   values	extensiones                r   r   r      sE   ( t||z#}}
% 
w}}X  
w!!!$QRR(J667##H--a0 	"&).E11l5))** T5%
"3"3
4C$S/	4 IKK)#
(===3K       (D$
;; 	#y{{D1JsOKKK	
  e e	Y&&DIKK)I"6q"99::cj>SSS)$Q'"'*:*:9*E*EEEi(( F$&Jy$9$949;;HXHXYbHcHc#dIi  ((  V# 
	 
	I	c>I-::7<<X^i-GHHD'+y{{D&9JsOKKKKK ; &    GDDDD	
	 	8T9559;;-
3 s+   5D9 9
EE%AK??
L		LLc                     t           j                            |           rlt           j                            |           d         dz   }t           j                            |          r't	                      }|                    |           |S dS dS )zRetrieve the data from the .icon file corresponding to the given file. If
    there is no .icon file, it returns None.
    
    Example::
    
        getIconData("/usr/share/icons/Tango/scalable/places/folder.svg")
    r   r   N)r   r   isfiler   r   r   )r   	icon_filedatas      r   getIconDatar   P  s     
w~~d G$$T**1-7	7>>)$$ 	::DJJy!!!K 	 	r   c              #     K   t           D ]}t          j                            || d          }t          j                            |          r n[t          j                            || d          }t          j                            |          r nt
          rt          |           dS t                      }|                    |           |V  |	                                D ]}t          |          D ]}|V  dS )zjGenerator yielding IconTheme objects for a specified theme and any themes
    from which it inherits.
    zindex.themezindex.desktopN)r   r   r   r   r   r   r   r	   r   r0   r   )	themenamer   
theme_filer   subthemets         r   r   r   _  s       
 
W\\#y-@@
7>>*%% 	EW\\#y/BB
7>>*%% 	E	  	*y)))KKE	KK

KKK%%''  h'' 	 	AGGGG	 r   c           	      d   |j         t          vrg t          |j         <   t          |j                                      t          j                    t          j        j        dz   z
             t          |j                                      d           t          |j                                      t                                 t          t          j                    t          |j                  d         z
            t          j        j        k    rt          j                    t          |j                  d<   |	                                D ]T}t          D ]H}t          j                            ||j         |          }|t          |j                  d         vs\t          |j                  d         t          j                            t          j                            ||j                             k     r|dk    rt          j                            |          r|t          j        |          gt          |j                  d         |<   t          j                            t          j                            ||j                             t          |j                  d<   JVt          |j                  d                                         D ][\  }}t%          |d         ||          r?|D ]<}| dz   |z   |d         v r*t          j                            || dz   |z             c c S =\d}	d}
t          |j                  d                                         D ]_\  }}t'          |d         ||          }||	k     r=|D ]:}| dz   |z   |d         v r(t          j                            || dz   |z             }
|}	;`|
S )Nr_   r   r[    r   l        )r   theme_cachere   r   rz   r   r   dictr   r3   r   r   r   r   r   r   r   r   DirectoryMatchesSizeDirectorySizeDistance)r   r   r   r   subdirrF   r   r   r   minimal_sizeclosest_filenamedistances               r   r   r   v  s1   z$$"$EJEJ&&ty{{cj6Ka6O'PQQQEJ&&q)))EJ&&tvv... 49;;UZ03344
8MMM%)Y[[EJ"**,, 	f 	fF% f f	gll9UZ??{5:6q999uz*1-0@0@iX]XbAcAc0d0dddbLLGMM#&& !7=rz#6OK
+A.s3131A1A"',,yY^YcBdBd1e1eK
+A.f #5:.q17799 I IVq	477 	I' I I	c>I-::7<<X^i-GHHHHHHH ; L"5:.q17799 , ,V(D%@@l""' , ,	c>I-::')w||CC)9S'T'T$#+Lr   c                 T   |                     |           }|                    |           }|                    |           }|                    |           }|                    |           }|dk    r||k    S |dk    r||cxk    o|k    nc S |dk    r||z
  |cxk    o||z   k    nc S d S )Nrx   	ScaleablerN   )rQ   rG   r\   rY   rU   r   iconsizer   rM   rA   rN   rX   rS   s           r   r   r     s    ==  D==  D""6**Iv&&Gv&&Gwx			(----g-----			i8????ti/?????? 
	r   c                    |                     |           }|                    |           }|                    |           }|                    |           }|                    |           }|dk    rt          ||z
            S |dk    r||k     r||z
  S ||k    r||z
  S dS |dk    r|||z
  k     r||z
  S |||z   k    r||z
  S dS d S )Nrx   ry   r   rN   )rQ   rG   r\   rY   rU   absr   s           r   r   r     s   ==  D==  D""6**Iv&&Gv&&Gw4(?###			gX%%X%%q			dY&&&X%%y(((g%%q 
	r   ) r   r   r   rp   xdg.IniFiler   r   xdg.BaseDirectoryr   xdg.Exceptionsr   r   
xdg.Configrz   r	   r   r   basedirre   r   r   
expanduserr   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s   
  				 ) ) ) ) ) ) ) ) + + + + + + . . . . . . . .    i< i< i< i< i< i< i< i<X38 38 38 38 38w 38 38 38n  6 6GOOBGLL'22333OOBGLL)445555 "":.. / / / 
	
!%tBWBWBW P P P Pd    .% % %N@ @ @    r   