
    ?gvL                     P   d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlZd dlmZ d dl	m
Z
 d dlZ ej                  dd        ej                  dd       d dlmZmZmZmZ e j$                  j'                  d d	       d d
lmZ e j$                  j'                  d d       d dlZ ej.                  dd       ej$                  j1                  d      Zej$                  j5                   ej6                         dd      Zej$                  j5                  edd      ZdZdZd Z d Z!ejD                  Z# G d de$      Z% G d de%      Z& G d de%      Z' G d de%      Z( G d d      Z)e*dk(  r< ed        ejV                  jY                  e        e)         ejZ                          yy)!    N)OptionParser)setproctitle)PathGtkz3.0CMenu)GLibr   Gior   z(/usr/share/cinnamon/cinnamon-menu-editor)utilz)/usr/share/cinnamon/cinnamon-settings/bincinnamonz/usr/share/locale~zpanel-launchersz	.cinnamon)z.pngz.xpmz.svgzcinnamon-panel-launcherc                 &    | j                  dd      S )N z\ )replace)strings    F/usr/share/cinnamon/cinnamon-desktop-editor/cinnamon-desktop-editor.pyescape_spacer   %   s    >>#u%%    c                    t        j                  d t         j                  j                  t         j                  j                  z  t         j
                  j                  t         j                  j                  d       }|j                  |        |j                          |j                         }|j                          |t         j                  j                  k(  S N)r   MessageDialogDialogFlagsDESTROY_WITH_PARENTMODALMessageTypeQUESTIONButtonsTypeYES_NO
set_markupshow_allrundestroyResponseTypeYES)msgdialogresponses      r   askr'   )   s    t"BBS__EZEZZ"77"55#	%F
 c
OOzz|H
NNs''++++r   c                   f    e Zd ZdZd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y)
ItemEditorNc                    t        j                         | _        | j                  j                  d       | j                  j	                  | j
                         || _        || _        | j                  j                  d      | _	        | j                  j                  d| j                         d | _        | j                  j                  d      | _        | j                  j                         j                  dd       || _        | j                  j#                  | j%                  |             | j'                          || _        | j+                          | j-                          | j/                          y )Nr   editorr&   zicon-chooserzallow-pathsT)r   Builderbuilderset_translation_domainadd_from_fileui_filecallbackdestdir
get_objectr%   connecton_responsestarting_iconicon_chooser
get_dialogset_property	icon_sizeset_icon_sizeget_gtk_size_for_pixelsbuild_ui	item_pathloadcheck_custom_pathresync_validity)selfr>   r1   r2   r:   s        r   __init__zItemEditor.__init__<   s
   {{}++J7""4<<0 ll--h7J(8(89! LL33NC$$&33M4H"''(D(DY(OP"		 r   c                 
   d}	 	 t         j                  j                  t        j                  |            \  }}}||kD  rt        j                  |      S 	 |dz  }X# t        $ r t         j                  j                  cY S w xY w)Nr      )r   IconSizelookup
ValueErrorDIALOG)rB   r:   ivalidwidthheights         r   r<   z"ItemEditor.get_gtk_size_for_pixelsT   s~    +'*||':':3<<?'K$ufI%<<?* &
 FA 
  +||***+s   AA #BBc                     t               r   NotImplementedErrorrB   s    r   r=   zItemEditor.build_ui`       !##r   c                     t               r   rO   rQ   s    r   r@   zItemEditor.check_custom_pathc   rR   r   c                    |r| j                   j                  d      j                  t        j                  j
                  d       | j                   j                  d      j                  t        j                  j
                  t        d             n| j                   j                  d      j                  t        j                  j
                  d       | j                   j                  d      j                  t        j                  j
                  t        d             |r| j                   j                  d      j                  t        j                  j
                  d       | j                   j                  d      j                  t        j                  j
                  t        d             n| j                   j                  d      j                  t        j                  j
                  d       | j                   j                  d      j                  t        j                  j
                  t        d             | j                   j                  d	      j                  |xr |       y )
N
name-entryzgtk-okz
Valid namezprocess-stopzThe name cannot be empty.
exec-entryzValid executablezjThe executable is not valid. It cannot be empty and spaces in the path must be escaped with backslash (\).ok)	r-   r3   set_icon_from_icon_namer   EntryIconPosition	SECONDARYset_icon_tooltip_text_set_sensitive)rB   
name_valid
exec_valids      r   sync_widgetszItemEditor.sync_widgetsf   s   LL##L1II#J_J_JiJikstLL##L1GGH]H]HgHgHI,Y LL##L1II#J_J_JiJikyzLL##L1GGH]H]HgHgHIJeHfh LL##L1II#J_J_JiJikstLL##L1GGH]H]HgHgHIJ\H]_ LL##L1II#J_J_JiJikyzLL##L1GGH]H]HgHgHI  Kx  Iyz 	%33J4M:Nr   c                    	 t        j                  |      \  }}t        j                  |d         sIt        j                  j                  |d         s(t        j                  |d   t        j                        ryy#  Y yxY w)Nr   TF)r   shell_parse_argvfind_program_in_pathospathisdiraccessX_OK)rB   r   successparseds       r   validate_exec_linezItemEditor.validate_exec_line{   st    	"33F;OGV((3RWW]]6RS9=U[][d[deklmenprpwpw[x 	s   A9A= =Bc                     t               r   rO   rQ   s    r   get_keyfile_editszItemEditor.get_keyfile_edits   rR   r   c                     	 | j                   j                  t        |      }| j                  j	                  |      j                  |       y # t        j                  $ r Y y w xY wr   )keyfile
get_stringDESKTOP_GROUPr-   r3   set_textr   GErrorrB   ctlnamevals       r   rr   zItemEditor.set_text   sT    	7,,))->C LL##C(11#6 {{ 		    A A#"A#c                     	 | j                   j                  t        |      }| j                  j	                  |      j                  |       y # t        j                  $ r Y y w xY wr   )ro   get_booleanrq   r-   r3   
set_activer   rs   rt   s       r   	set_checkzItemEditor.set_check   sT    	9,,**=$?C LL##C(33C8 {{ 		rx   c                    	 | j                   j                  t        |      }t        |       | j                  j                  |       || _        t        d| j                  j                                y # t        j                  $ r Y y w xY w)Nzicon:)
ro   rp   rq   printr7   set_iconr6   get_iconr   rs   )rB   rv   rw   s      r   r   zItemEditor.set_icon   ss    	9,,))->C #J&&s+!$D'4,,5578 {{ 		s    A4 4B
	B
c                     t        j                         | _        | j                  xs d}	 | j                  j	                  |t
        j                         y # t         j                  $ r Y y w xY w)N )r   KeyFilero   r>   load_from_filer
   KEY_FILE_FLAGSrs   )rB   re   s     r   r?   zItemEditor.load   sR    ||~~~#	LL''d.A.AB{{ 		s   *A A,+A,c                 ~   t        j                  | j                  | j                                | j                  j	                         \  }}d}| j
                  [t        j                  j                  | j
                  | j                  j                  d      j                         dz         | _        d}	 t        | j                  d      5 }|j                  |       d d d        |r t        j                  | j                  d       t!        j"                  dt        j$                         gt        j&                         y # 1 sw Y   exY w# t(        $ re}t+        t-        d	            rGt/        j0                  t.        j2                  j4                        | _        | j7                          Y d }~y Y d }~y d }~ww xY w)
NFrU   .desktopTwi  zupdate-desktop-database)envzICannot create the launcher at this location.  Add to the desktop instead?)r
   fillKeyFilero   rm   to_datar2   rd   re   joinr-   r3   get_textr>   openwritechmod
subprocessPopengetUserItemPathenvironIOErrorr'   r\   r   get_user_special_dirUserDirectoryDIRECTORY_DESKTOPsave)rB   contentslength	need_execfes         r   r   zItemEditor.save   sB   t'='='?@<<//1&	<<#WW\\$,,8O8OP\8]8f8f8hku8uvDNI
	dnnc* "a!"/79M9M9OPVXV`V`a" "  	1`ab#889K9K9]9]^		 c	s2   6E EA#E EE 	F<AF77F<c                 8    | j                   j                          y r   )r%   presentrQ   s    r   r    zItemEditor.run   s    r   c                     |t         j                  j                  k(  r-| j                          | j	                  d| j
                         y | j	                  d| j
                         y )NTF)r   r"   OKr   r1   r>   )rB   r%   r&   s      r   r5   zItemEditor.on_response   sC    s''***IIKMM$/MM%0r   )NNN   )__name__
__module____qualname__r0   rC   r<   r=   r@   r`   rk   rm   rr   r|   r   r?   r   r    r5    r   r   r)   r)   9   sN    G0
$$O*$79	9(1r   r)   c                   @     e Zd ZdZd Zd Z fdZd Zd Zd Z	 xZ
S )LauncherEditor>/usr/share/cinnamon/cinnamon-desktop-editor/launcher-editor.uic                 B   | j                   j                  d      j                  d| j                         | j                   j                  d      j                  d| j                         | j                   j                  d      j                  d| j                         y Nzexec-browseclickedrU   changedrV   r-   r3   r4   	pick_execrA   rQ   s    r   r=   zLauncherEditor.build_ui   o    .66y$..Q-55iAUAUV-55iAUAUVr   c                 0   | j                   j                  d      j                         j                         }| j                   j                  d      j                         j                         }|dk7  }| j	                  |      }| j                  ||       y NrU   rV   r   r-   r3   r   striprk   r`   rB   args	name_text	exec_textr^   r_   s         r   rA   zLauncherEditor.resync_validity   w    LL++L9BBDJJL	LL++L9BBDJJL	"_
,,Y7
*j1r   c                     t         t        |           | j                  dd       | j                  dd       | j                  dd       | j	                  dd       | j	                  d	d
       | j                  d       y NrU   NamerV   Execcomment-entryCommentterminal-checkTerminaloffload-gpu-checkPrefersNonDefaultGPUIcon)superr   r?   rr   r|   r   rB   	__class__s    r   r?   zLauncherEditor.load   se    nd(*lF+lF+oy1'4*,BCfr   c           	         t        | j                  j                  d      j                         | j                  j                  d      j                         | j                  j                  d      j                         | j                  j                  d      j	                         | j                  j                  d      j	                         | j
                  j                         d      S )NrU   rV   r   r   r   Applicationr   r   r   r   r   r   Type)dictr-   r3   r   
get_activer7   r   rQ   s    r   rm   z LauncherEditor.get_keyfile_edits   s    00>GGI00>GGI LL33ODMMO!\\445EFQQS)-)@)@AT)U)`)`)b**335&( 	(r   c                    t        j                  t        d      | j                  t         j                  t         j
                  j                  t         j                  t         j
                  j                  f      }|j                         }|t         j
                  j                  k(  rA| j                  j                  d      j                  t        |j                                      |j                          y NzChoose a command)titleparentbuttonsrV   r   FileChooserDialogr\   r%   STOCK_CANCELr"   REJECTSTOCK_OKACCEPTr    r-   r3   rr   r   get_filenamer!   rB   buttonchooserr&   s       r   r   zLauncherEditor.pick_exec       ''a0B.C/3{{141A1A3CSCSCZCZ14s?O?O?V?V1XY ;;=s''...LL##L1::<H\H\H^;_`r   c                     | j                   rbt        j                  j                  t	        j
                         t        j                  j                  | j                         d         | _         y y NrE   )r>   rd   re   r   r
   r   splitrQ   s    r   r@   z LauncherEditor.check_custom_path   sG    >>WW\\$*>*>*@"''--PTP^P^B_`aBbcDN r   )r   r   r   r0   r=   rA   r?   rm   r   r@   __classcell__r   s   @r   r   r      s(    NGW2(dr   r   c                   :     e Zd ZdZd Zd Z fdZd Zd Z xZ	S )DirectoryEditorz?/usr/share/cinnamon/cinnamon-desktop-editor/directory-editor.uic                 n    | j                   j                  d      j                  d| j                         y )NrU   r   )r-   r3   r4   rA   rQ   s    r   r=   zDirectoryEditor.build_ui   s'    -55iAUAUVr   c                     | j                   j                  d      j                         j                         }|dk7  }| j                   j                  d      j	                  |       y )NrU   r   rW   )r-   r3   r   r   r]   )rB   r   r   rK   s       r   rA   zDirectoryEditor.resync_validity   sN    LL++L9BBDJJL	b%33E:r   c                     t         t        |           | j                  dd       | j                  dd       | j	                  d       y )NrU   r   r   r   r   )r   r   r?   rr   r   r   s    r   r?   zDirectoryEditor.load  s8    ot)+lF+oy1fr   c                     t        | j                  j                  d      j                         | j                  j                  d      j                         | j                  j                         d      S )NrU   r   	Directory)r   r   r   r   )r   r-   r3   r   r7   r   rQ   s    r   rm   z!DirectoryEditor.get_keyfile_edits	  sY    00>GGI LL33ODMMO**335$& 	&r   c                     t         j                  j                  t        j                         t         j                  j                  | j                        d         | _        y r   )rd   re   r   r
   getUserDirectoryPathr   r>   rQ   s    r   r@   z!DirectoryEditor.check_custom_path  s;    d&?&?&A277==QUQ_Q_C`abCcdr   )
r   r   r   r0   r=   rA   r?   rm   r@   r   r   s   @r   r   r      s#    OGW;
&er   r   c                   F     e Zd ZdZd Zd Zd Z fdZd Zd Z	d Z
 xZS )	CinnamonLauncherEditorr   c                 B   | j                   j                  d      j                  d| j                         | j                   j                  d      j                  d| j                         | j                   j                  d      j                  d| j                         y r   r   rQ   s    r   r=   zCinnamonLauncherEditor.build_ui  r   r   c                 6   t        j                  t              }|j                  d       s|j	                  d        | j
                  d| j
                  vrd}	 t        j                  j                  t        dt        |      z   dz         }t        j                  j                  t        dt        |      z   dz         }t        j                  |      }t        j                  |      }|j                  d       s|j                  d       sn|dz  }|| _        y y )Nzcinnamon-custom-launcherrE   zcinnamon-custom-launcher-r   )r	   file_new_for_pathPANEL_LAUNCHER_PATHquery_existsmake_directory_with_parentsr>   rd   re   r   strOLD_PANEL_LAUNCHER_PATHfile_parse_name)rB   dirrJ   rv   old_namefileold_files          r   r@   z(CinnamonLauncherEditor.check_custom_path  s    ##$78%++D1>>!%?t~~%UAww||$79TWZ[\W]9]`j9jk77<<(?A\_bcd_eAehrArs**40..x8((.x7L7LT7RQ  "DN &Vr   c                 0   | j                   j                  d      j                         j                         }| j                   j                  d      j                         j                         }|dk7  }| j	                  |      }| j                  ||       y r   r   r   s         r   rA   z&CinnamonLauncherEditor.resync_validity,  r   r   c                     t         t        |           | j                  dd       | j                  dd       | j                  dd       | j	                  dd       | j	                  d	d
       | j                  d       y r   )r   r   r?   rr   r|   r   r   s    r   r?   zCinnamonLauncherEditor.load3  sf    $d02lF+lF+oy1'4*,BCfr   c           	         t         j                  j                         }| j                  j	                         }|| j
                  k7  rB|j                  || j                  d      }|r#|j                         }| j                  |      s|}t        | j                  j                  d      j                         | j                  j                  d      j                         | j                  j                  d      j                         | j                  j                  d      j                         | j                  j                  d      j                         |d      S )	Nr   rU   rV   r   r   r   r   r   )r   	IconThemeget_defaultr7   r   r6   lookup_iconr:   r   
in_hicolorr   r-   r3   r   r   )rB   
icon_themeiconinfofilenames        r   rm   z(CinnamonLauncherEditor.get_keyfile_edits<  s   ]]..0
  ))+4%%%))$BD,,.x0#D00>GGI00>GGI LL33ODMMO!\\445EFQQS)-)@)@AT)U)`)`)b&( 	(r   c                     t        j                         }|D ]K  }t        t        j                  j                  |dd            }t        |      }	 |j                  |       yM y# t        $ r Y Zw xY w)NiconshicolorTF)r   get_system_data_dirsr   rd   re   r   relative_torH   )rB   re   datadirsdatadirhicolor_folder	icon_paths         r   r  z!CinnamonLauncherEditor.in_hicolorO  s{    ,,. 	G!"'',,w"KLNT
I((8D E		   s   A&&	A21A2c                    t        j                  t        d      | j                  t         j                  t         j
                  j                  t         j                  t         j
                  j                  f      }|j                         }|t         j
                  j                  k(  rA| j                  j                  d      j                  t        |j                                      |j                          y r   r   r   s       r   r   z CinnamonLauncherEditor.pick_exec]  r   r   )r   r   r   r0   r=   r@   rA   r?   rm   r  r   r   r   s   @r   r   r     s,    NGW""2(&r   r   c                   D    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dd	Z
d
 Zy)Mainc                    t               }|j                  ddddd       |j                  ddd	d
d       |j                  ddddd       |j                  dddd d       |j                  dddt        dd       |j                         \  }}|j                  s|j                  d       |j                  dv r|j                  s|j                  d       |j                  dk(  r|j                  s|j                  d        |j                  d!k(  rt        |      d"k  r|j                  d#       t        j                  j                  d$t        j                  j                        | _        | j                  j                         st!        d%      |j                  | _        |j                  | _        |j$                  | _        |j                  | _        |j                  d!k(  r|d&   | _        |j*                  | _        | j$                  | j-                          | j                  d'k(  r;t/        | j"                  | j0                        }|j2                  j5                          y | j                  d(k(  r;t7        | j"                  | j8                        }|j2                  j5                          y | j                  d!k(  rGt;        | j"                  | j<                  | j*                  )      }|j2                  j5                          y | j                  dk(  rFt7        | j"                  | j>                  | j&                        }|j2                  j5                          y tA        d*       y )+Nz-oz
--originaloriginal_desktop_filezPath of original .desktop file	ORIG_FILE)desthelpmetavarz-dz--directorydestination_directoryz)Destination directory of the new launcherDEST_DIRz-fz--filedesktop_filez2Name of desktop file (i.e. gnome-terminal.desktop)DESKTOP_NAMEz-mz--modemodezDMode to run in: launcher, directory, panel-launcher or nemo-launcher)r  defaultr  z-iz--icon-sizer:   r   z5Size to set the icon picker for (panel-launcher only))r  typer  r  z You must select a mode to run in)	directorylauncherzCdirectory and launcher modes must be accompanied by the -o argumentznemo-launcherz9nemo-launcher mode must be accompanied by the -d argumentzcinnamon-launcherrE   z~cinnamon-launcher mode must have the following syntax:
cinnamon-desktop-editor -mcinnamon-launcher [-ffoo.desktop] <json-path>zcinnamon-applications.menuzcan not load menu treer   r   r!  )r:   zInvalid args)!r   
add_optionint
parse_argsr  errorr  r  lenr   Treenew	TreeFlagsINCLUDE_NODISPLAYtree	load_syncrH   	orig_filer  dest_dir	json_pathr:   get_desktop_pathr   directory_cbr%   r   r   launcher_cbr   panel_launcher_cbnemo_launcher_cbr~   )rB   parseroptionsr   r+   s        r   rC   zMain.__init__i  s   $3JQq  |G  	H$4KR}  HR  	S$~Dx  CQ  	R$vt  KQ  	R$KcSU  ]T  	U ++-$||LL;<<<44W=Z=ZLL^_<<?*73P3PLLTU<<..3t9q=LL c d JJNN#?AbAbc	yy""$566LL	 66#0055<<..!!WDN$..DN(!!#99#$T^^T5F5FGFMM""$YY*$#DNND4D4DEFMM""$YY--+DNND<R<R^b^l^lmFMM""$YY/)#DNND4I4I4==YFMM""$.!r   c                 $    | j                          y r   endrB   ri   	dest_paths      r   r1  zMain.directory_cb      
r   c                 $    | j                          y r   r8  r:  s      r   r2  zMain.launcher_cb  r<  r   c                    |rt        j                  | j                        }|j                  d      }| j                  2|j                  t        j                  j                  |      d          nU|j                  | j                        }|dk\  r5||= |j                  |t        j                  j                  |      d          |j                          | j                  | j                  |       | j                          y )NlauncherListrE   r   )JsonSettingsWidgetsJSONSettingsHandlerr/  	get_valuer  appendrd   re   r   indexinsertsave_settingsask_menu_launcherr9  )rB   ri   r;  settings	launchersrJ   s         r   r3  zMain.panel_launcher_cb  s    *>>t~~NH **>:I  (  y!9!!<=OOD$5$566!!$$Qi(@(CD""$  (&&y1
r   c                 J    |r| j                  |       | j                          y r   )rG  r9  r:  s      r   r4  zMain.nemo_launcher_cb  s    ""9-
r   c                     t        t        d            rit        j                  j	                  t        j                         t        j                  j                  |      d         }t        j                  ||       y y )NziWould you like to add this launcher to the menu also?  It will be placed in the Other category initially.rE   )
r'   r\   rd   re   r   r
   r   r   shutilcopy)rB   r;  new_file_paths      r   rG  zMain.ask_menu_launcher  sT    q|}~GGLL)=)=)?yAYZ[A\]MKK	=1 r   c                    | j                          | j                  t        j                  t        j                  j                  t        d            }t        j                  t        j                  j                  t        d            }||z   D ]9  }t        j                  j                  |      d   | j                  k(  s3|| _        ; y y )Nz	*.desktoprE   )
search_menu_sysr-  globrd   re   r   r   r   r   r  )rB   panel_launchersold_panel_launchersr!  s       r   r0  zMain.get_desktop_path  s    >>!"ii5H+(VWO"&))BGGLL9PR],^"_,/BB .77==*1-1B1BB%-DN. "r   Nc                 P   || j                   j                         }|j                         }|j                         }|t        j
                  j                  k7  r|t        j
                  j                  k(  r"|j                         }| j                  |       n_|t        j
                  j                  k(  rB|j                         }|j                         | j                  k(  r|j                         | _        |j                         }|t        j
                  j                  k7  ry y r   )r+  get_root_directoryiternextr   TreeItemTypeINVALID	DIRECTORYget_directoryrP  ENTRY	get_entryget_desktop_file_idr  get_desktop_file_pathr-  )rB   r   	item_iter	item_typeitems        r   rP  zMain.search_menu_sys  s    >YY113FKKM	NN$	5--555E..888 ..0$$T*e00666 **,++-1B1BB%)%?%?%ADN!(I 5--555r   c                 ,    t        j                          y r   )r   	main_quitrQ   s    r   r9  zMain.end  s    r   r   )r   r   r   rC   r1  r2  r3  r4  rG  r0  rP  r9  r   r   r   r  r  h  s0    0"d 
2
.) r   r  __main__zcinnamon-desktop-editor).sysrd   gettextrQ  optparser   rL  r   r   pathlibr   girequire_versiongi.repositoryr   r   r	   r   re   rE  cmer
   r@  install
expanduserhomer   get_user_data_dirr   r   
EXTENSIONSDEFAULT_ICON_NAMEr   r'   KEY_FILE_DESKTOP_GROUPrq   objectr)   r   r   r   r  r   Windowset_default_icon_namemainr   r   r   <module>ry     s    	   !   %  	   5%     7E " / / = >  > ?  
/ 0 
ww#ggll#94#9#9#;ZIZ[ '',,t[:KL %
- &
, ++M1 M1^.dZ .d`ej e4SZ Slm m^ z*+JJ$$%67FCHHJ	 r   