
    'j                         d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlmZmZmZ d dlmZ  G d	 d
          ZdS )    N)glob)Lock)	randrange)which)ListOptional)CannotExecuteXvfbCannotFindXvfbVirtualDisplayNotSupported)OS_NAMEc                      e Zd ZdZddee         ddfdZdZede	fd            Z
edee	         fd	            Zd
 Zde	fdZd Zd Zedee	         fd            Zedefd            Zedefd            Zed             ZdS )VirtualDisplayz=
    A minimal virtual display implementation for Linux.
    FdebugreturnNc                 V    || _         d| _        d| _        t                      | _        dS )zN
        Constructor for the VirtualDisplay class (singleton object).
        N)r   proc_displayr   _lock)selfr   s     X/home/ice/.hermes/hermes-agent/venv/lib/python3.11/site-packages/camoufox/virtdisplay.py__init__zVirtualDisplay.__init__   s(     
04	'+VV


    )z-screen01x1x24z-acz	-nolistentcp
-extensionRENDERz
+extensionGLXr   	COMPOSITEr   XVideor   zXVideo-MotionCompensationr   XINERAMAz-shmemz-fpz	built-insz	-nocursorz-brc                     t          d          }|st          d          t          j        |t          j                  st          d|           |S )z5
        Get the path to the xvfb executable
        Xvfbz)Please install Xvfb to use headless mode.z*I do not have permission to execute Xvfb: )r   r
   osaccessX_OKr	   )r   paths     r   	xvfb_pathzVirtualDisplay.xvfb_path1   s[    
 V}} 	N !LMMMyrw'' 	Y#$WQU$W$WXXXr   c                 2    | j         d| j         g| j        S )z&
        Get the xvfb command
        :)r(   display	xvfb_argsr   s    r   xvfb_cmdzVirtualDisplay.xvfb_cmd=   s#    
  2DL 2 2DT^DDr   c                     | j         r(t          dd                    | j                             t	          j        | j        | j         rdnt          j        | j         rdnt          j                  | _        dS )z+
        Spawn a detatched process
        zStarting virtual display: N)stdoutstderr)r   printjoinr.   
subprocessPopenDEVNULLr   r-   s    r   execute_xvfbzVirtualDisplay.execute_xvfbD   sr     : 	H-sxx/F/FGGG$M:=44:+=:=44:+=
 
 
			r   c                     |                                   | j        5  | j        |                                  n| j        rt          d| j                    d| j         cddd           S # 1 swxY w Y   dS )(
        Get the display number
        NzUsing virtual display: r*   )assert_linuxr   r   r8   r   r3   r+   r-   s    r   getzVirtualDisplay.getP   s     	Z 	& 	&y !!#### @>>>???%t|%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&s   AA--A14A1c                     | j         5  | j        rN| j                                        5| j        rt	          d| j                   | j                                         ddd           dS # 1 swxY w Y   dS )z,
        Terminate the xvfb process
        NzTerminating virtual display:)r   r   pollr   r3   r+   	terminater-   s    r   killzVirtualDisplay.kill]   s     Z 	& 	&y &TY^^--5: H8$,GGG	##%%%		& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&s   AA++A/2A/c                 .    |                                   dS )z;
        Kill and delete the VirtualDisplay object
        N)r@   r-   s    r   __del__zVirtualDisplay.__del__g   s     			r   c                      t           j                            dd          } 	 t          t           j                            | d                    }n# t          $ r g cY S w xY wd |D             S )z0
        Get list of lock files in /tmp
        TMPDIRz/tmpz.X*-lockc                 P    g | ]#}t           j                            |          !|$S  )r$   r'   isfile).0ps     r   
<listcomp>z2VirtualDisplay._get_lock_files.<locals>.<listcomp>w   s+    ;;;a):):;;;;r   )r$   environr<   r   r'   r4   FileNotFoundError)tmpd
lock_filess     r   _get_lock_fileszVirtualDisplay._get_lock_filesm   su    
 z~~h//	bgll4<<==JJ  	 	 	III	;;:;;;;s   -A AAc                      t          t          d t                                                              } | r.t	          dt	          |           t          dd          z             ndS )z)
        Search for free display
        c                     t          |                     d          d                             d          d                   S )NX   -r   )intsplit)xs    r   <lambda>z.VirtualDisplay._free_display.<locals>.<lambda>   s/    #aggcll1o33C88;<< r   c         )listmapr   rO   maxr   )lss    r   _free_displayzVirtualDisplay._free_displayy   sa    
 <<n>\>\>^>^__
 
 79@s2s2ww1b!1!11222b@r   c                 P    | j         |                                 | _         | j         S )r:   )r   r`   r-   s    r   r+   zVirtualDisplay.display   s'    
 =  ..00DM}r   c                  :    t           dk    rt          d          dS )z5
        Assert that the current OS is Linux
        linz+Virtual display is only supported on Linux.N)r   r   rF   r   r   r;   zVirtualDisplay.assert_linux   s&    
 e,-Z[[[ r   )F)__name__
__module____qualname____doc__r   boolr   r,   propertystrr(   r   r.   r8   r<   r@   rB   staticmethodrO   rU   r`   r+   r;   rF   r   r   r   r      s         htn     I$ 	3 	 	 	 X	 E$s) E E E XE

 

 

&S & & & && & &   	<T#Y 	< 	< 	< \	< A3 A A A \A     X \ \ \\ \ \r   r   )r$   r5   r   multiprocessingr   randomr   shutilr   typingr   r   camoufox.exceptionsr	   r
   r   camoufox.pkgmanr   r   rF   r   r   <module>rr      s   				                                   ! ! ! ! ! ! ! !         
 $ # # # # #A\ A\ A\ A\ A\ A\ A\ A\ A\ A\r   