
    
3jb)                        S r SSKJr  SSKrSSKrSSKJrJr  SSKJrJ	r	  SSK
Jr  SSKJr  SSKJrJr  SS	KJrJr  \(       a  SS
KJr  Sr " S S\R.                  5      r " S S\5      rg)a  XCB backend using MIT-SHM XShmGetImage with automatic fallback.

This is the fastest Linux backend available, and will work in most common
cases. However, it will not work over remote X connections, such as over ssh.

This implementation prefers shared-memory captures for performance and will
fall back to XGetImage when the MIT-SHM extension is unavailable or fails at
runtime. The fallback reason is exposed via ``performance_status`` to aid
debugging.

.. versionadded:: 10.2.0
    )annotationsN)	PROT_READmmap)TYPE_CHECKINGAny)ScreenShotError)xcb)
ALL_PLANESMSSImplXCBBase)LIBXProtoError)Monitor c                  ~    \ rS rSrSr\R                  " 5       r\R                  " 5       r\R                  " 5       r	Sr
g)	ShmStatus    z7Availability of the MIT-SHM extension for this backend.r   N)__name__
__module____qualname____firstlineno____doc__enumautoUNKNOWN	AVAILABLEUNAVAILABLE__static_attributes__r       P/home/wildlama/miniconda3/lib/python3.13/site-packages/mss/linux/xshmgetimage.pyr   r       s&    AiikG		I))+Kr   r   c                     ^  \ rS rSrSrSSS.SU 4S jjjrSS jrSS jrSS	 jrSU 4S
 jjr	SS jr
SS jrSU 4S jjrSrU =r$ )MSSImplXShmGetImage(   zXCB backend using XShmGetImage with an automatic XGetImage fallback.

.. seealso::
    :py:class:`mss.linux.base.MSSImplXCBBase`
        Lists constructor parameters.
NFdisplaywith_cursorc               t   > [         TU ]  XS9  S U l        S U l        S U l        U R                  5       U l        g )Nr#   )super__init___memfd_buf_shmseg
_setup_shm
shm_status)selfr$   r%   	__class__s      r   r(   MSSImplXShmGetImage.__init__0   s:    B #'!%	*. &*__%6r   c                    UnU(       a  USSR                  S U 5       5      -   -  nU R                  R                  U5        g)zDebugging hook for troubleshooting MIT-SHM issues.

This will be called whenever MIT-SHM is disabled.  The optional
arguments are not well-defined; exceptions are common.
z | z, c              3  8   #    U  H  n[        U5      v   M     g 7fN)str).0args     r   	<genexpr>8MSSImplXShmGetImage._shm_report_issue.<locals>.<genexpr>I   s     )Cds#c((ds   N)joinperformance_statusappend)r.   msgargsfull_msgs       r   _shm_report_issue%MSSImplXShmGetImage._shm_report_issueA   s>     		)Cd)C CCCH&&x0r   c                   U R                   c   e [        R                  " U R                   [        R                  5      nUR
                  (       d!  U R                  S5        [        R                  $ [        R                  " U R                   5      nUR                  UR                  4nUS:  a"  U R                  SU5        [        R                  $ U R                  R                  U R                  R                  -  S-  U l        [!        ["        S5      (       d!  U R                  S5        [        R                  $  ["        R$                  " S["        R&                  S9U l        ["        R.                  " U R(                  U R                  5         [1        U R(                  U R                  [2        S
9U l        [        R6                  " [        R8                  " U R                   5      R:                  5      U l          [        R>                  " U R                   U R<                  U R(                  SS9  S U l         [        RF                  $ ! [*         a  nU R-                  S	U5      s S nA$ S nAff = f! [*         a  nU R-                  SU5      s S nA$ S nAff = f! S U l        f = f! [        R@                   a  nU R-                  SU5      s S nA$ S nAff = f! [B         a    U RE                  5         e f = f)NzMIT-SHM extension not present)      zMIT-SHM version too old   memfd_createzos.memfd_create not availablezmss-shm-buf)flagszmemfd_create failed)protzmmap failedF)	read_onlyzCannot attach MIT-SHM segment)$connr	   get_extension_datar   shm_idpresentr?   r   r   shm_query_versionmajor_versionminor_versionpref_screenwidth_in_pixelsheight_in_pixels_bufsizehasattrosrE   MFD_CLOEXECr)   OSError_shm_unavailable	ftruncater   r   r*   ShmSeggenerate_idvaluer+   shm_attach_fdXError	Exception_shutdown_shmr   )r.   shm_ext_datashm_version_datashm_versiones        r   r,   MSSImplXShmGetImage._setup_shmL   sO   yy$$$*	11$))SZZHL''&&'FG ,,,  #44TYY?+99;K;Y;YZKV#&&'@+N ,,, !,,<<t?O?O?`?``cddDM2~..&&'FG ,,,G oom2>>R LLdmm4? dmm)L	 ::coodii&@&F&FGDLQ'%%diit{{V[\"&DK    -  G,,-BAFFG  ?,,]A>>? #'DK:: Q,,-LaPPQ 	 	s   A K 2AK A*K >(I &+K (I5 :AK ?5J 4J* 
I2I-'I2(K -I22K 5
J?JJK JK 	J''J* *K>KKK KK K9c                d    U R                  X5        U R                  5         [        R                  $ r3   )r?   r`   r   r   )r.   r<   excs      r   rX   $MSSImplXShmGetImage._shm_unavailable}   s(    s($$$r   c                B   > U R                  5         [        TU ]	  5         g r3   )r`   r'   close)r.   r/   s    r   rj   MSSImplXShmGetImage.close   s    r   c                    U R                   b!  U R                   R                  5         S U l         U R                  b(  [        R                  " U R                  5        S U l        g g r3   )r*   rj   r)   rU   )r.   s    r   r`   !MSSImplXShmGetImage._shutdown_shm   sI     99 IIOODI;;"HHT[[!DK #r   c                ^   U R                   c  Sn[        U5      eU R                  c   eU R                  c   eUS   US   -  S-  nX0R                  :  a  Sn[        U5      e[
        R                  " U R                   U R                  US   US   US   US   [        [
        R                  R                  U R                  S5
      nUR                  U R                  :w  d  UR                  U R                  :w  ag  S	U R                   S
[        U R                  R                   5       SUR                   S
[        UR                  R                   5       3n[        U5      eUS   US   -  S-  n[#        U R                  5       n[%        US U 5      sS S S 5        $ ! , (       d  f       g = f)Nz5Cannot take screenshot while the connection is closedwidthheightrD   zuRequested capture size exceeds the allocated buffer. If you have resized the screen, please recreate your MSS object.lefttopr   z_Server returned an image with a depth or visual different than it initially reported: expected ,z, got )rI   r   r*   r+   rS   r	   shm_get_imagedrawabler
   ImageFormatZPixmapdepthdrawable_depthvisualdrawable_visual_idhexr\   
memoryview	bytearray)r.   monitorr<   required_size	img_replynew_sizeimg_mvs          r   _grab_xshmgetimage&MSSImplXShmGetImage._grab_xshmgetimage   s   99IC!#&&yy$$$||'''(78+<<q@==(3  "#&&%%IIMMFOENGHOO##LL
	 ??d111Y5E5EI`I`5` //0#d6M6M6S6S2T1U V 'qY-=-=-C-C)D(EG 
 "#&& 7#gh&77!;
 		"fVIX./ #""s   F
F,c                >  > U R                   [        R                  :X  a  [        TU ]  U5      $  U R                  U5      nU R                   [        R                  :w  a0  [        R                  U l         U R                  R                  S5        U$ ! [         a  nU R                   [        R                  :w  a  e  [        TU ]  U5      nO! [         a    e f = fU R                  SU5        [        R                  U l         U R                  5          SnAU$ SnAff = f)z;Retrieve all pixels from a monitor. Pixels have to be RGBX.zMIT-SHM is working correctly.zMIT-SHM GetImage failedN)r-   r   r   r'   _grab_xgetimager   r   r:   r;   r   r   r?   r`   )r.   r   rvrd   r/   s       r   grabMSSImplXShmGetImage.grab   s    ??i3337*733	!((1B)"5"55"+"5"5''../NO4 	3  	!)"3"33W,W5   ""#<a@'33DO  	3	!s0   AB 
DD;C
DC:DD)r*   rS   r)   r+   r-   )r$   zstr | bytes | Noner%   boolreturnNone)r<   r4   r=   r   r   r   )r   r   )r<   r4   rg   r_   r   r   )r   r   )r   r   r   r~   )r   r   r   r   r   r(   r?   r,   rX   rj   r`   r   r   r   __classcell__)r/   s   @r   r!   r!   (   sD     9=RW 7 7"	1/!b%
	.0`$ $r   r!   )r   
__future__r   r   rU   r   r   typingr   r   mss.exceptionr   	mss.linuxr	   mss.linux.baser
   r   mss.linux.xcbhelpersr   r   
mss.modelsr   __all__Enumr   r!   r   r   r   <module>r      sP    #  	   % )  5 1"
		 }. }r   