
    uj=                        d Z ddlmZ ddlmZ ddlmZmZmZ ddl	Z	ddl
Z
ddlmZmZ eeeeef   Z ed       G d	 d
             Z G d d      Zy)u  
yjm_capture_sources.py

캡처 대상 선택 전용 모듈.
- window  : 선택된 HWND 영역
- display : 특정 모니터 1개
- desktop : 전체 가상 바탕화면

수정 포인트(v2.3):
- 실제 캡처 기준은 초기 yjm_window_cast와 동일하게 mss.monitors[1:] 원본 순서를 사용한다.
- Win32 병합/정렬은 하지 않는다. Win32 정보는 yjm_monitor_lab.py에서 별도 진단한다.
- 프로그램 실행 후 디스플레이가 바뀌어도 refresh_displays()로 다시 읽을 수 있다.

mss.monitors 규칙:
- monitors[0] : 전체 가상 바탕화면
- monitors[1] : 첫 번째 물리/논리 디스플레이
- monitors[2] : 두 번째 디스플레이
    )annotations)	dataclass)CallableOptionalTupleN)list_mss_physical_displaysset_dpi_awarenessT)frozenc                  >    e Zd ZU ded<   ded<   ded<   edd       Zy)	CaptureTargetstrmodeRectrecttitlec           
         | j                   \  }}}}t        |      t        |      t        dt        ||z
              t        dt        ||z
              dS )N   )lefttopwidthheight)r   intmax)selfr   r   rightbottoms        *D:\_St\RTC8790_8791\yjm_capture_sources.pymonitor_dictzCaptureTarget.monitor_dict)   sR    #'99 c5&Is8C-.!S#./	
 	
    Nreturndict)__name__
__module____qualname____annotations__propertyr    r   r   r   r   #   s#    
I
JJ
 
r   r   c                      e Zd ZddZddZddZddZddZddZe	ddd	dd
       Z
e	dd       Ze	dd       ZddZddZddZddZy)CaptureSourceManagerc                l    t                || _        d| _        d| _        | j	                         | _        y )Nwindowr   )r	   get_selected_hwndr   display_indexlist_displaysdisplays)r   r-   s     r   __init__zCaptureSourceManager.__init__5   s/    !2	**,r   c                    d| _         y )Nr,   r   r   s    r   
set_windowzCaptureSourceManager.set_window<   s	    	r   c                    d| _         t        dt        |            | _        | j                  r2t        | j                  t        | j                        dz
        | _        y y )Ndisplayr   r   )r   r   r   r.   r0   minlen)r   r.   s     r   set_displayz CaptureSourceManager.set_display?   sL    	 C$67==!$T%7%7T]]9Ka9O!PD r   c                    d| _         y )Ndesktopr3   r4   s    r   set_desktopz CaptureSourceManager.set_desktopE   s	    	r   c                    | j                         | _        | j                  rGt        t        d| j                        t        | j                        dz
        | _        | j                  S d| _        | j                  S )Nr   r   )r/   r0   r8   r   r.   r9   r4   s    r   refresh_displaysz%CaptureSourceManager.refresh_displaysH   sd    **,==!$SD,>,>%?T]]ASVWAW!XD }} "#D}}r   c                R    | j                   s| j                          | j                   S )N)r0   r?   r4   s    r   get_displaysz!CaptureSourceManager.get_displaysP   s    }}!!#}}r    F)deviceprimaryc                   t        |       } t        |      }t        |      }t        |      }| |t        d|      t        d|      | t        d|      z   |t        d|      z   |||t        |      d
S )Nr   )
r   r   r   r   r   r   sourceindexrC   rD   )r   r   bool)r   r   r   r   rF   rG   rC   rD   s           r   _normalize_displayz'CaptureSourceManager._normalize_displayU   st    4y#hE
VE]!VnC5M)C6N*G}
 	
r   c                 $   g } t        t                     D ]w  \  }}| j                  t        j	                  |j
                  |j                  |j                  |j                  d|j                  |j                  |j                               y | S )u!  실제 캡처 대상은 mss.monitors[1:] 원본 순서를 그대로 사용한다.

        초기 yjm_window_cast.py도 self.sct.monitors[1:]를 그대로 사용했다.
        그래서 여기서는 Win32 EnumDisplayMonitors와 병합하거나 top/left로 정렬하지 않는다.
        mss)rF   rG   rC   rD   )	enumerater   appendr*   rI   r   r   r   r   rG   rC   rD   )r0   imons      r   r/   z"CaptureSourceManager.list_displaysh   sz      " : <=FAsOO$77HHGGIIJJ ))::KK 8 	 > r   c            	         t        j                          5 } | j                  d   }t        j                  |d   |d   |d   |d   dd      cd d d        S # 1 sw Y   y xY w)Nr   r   r   r   r   rK   )rF   rG   )rK   monitorsr*   rI   )sctms     r   get_virtual_desktopz(CaptureSourceManager.get_virtual_desktop   sY    WWY#QA'::&	%'
( ;  YYs   6AAc                    | j                   dk(  r| j                         S | j                   dk(  r| j                         S | j                   dk(  r| j                         S y )Nr,   r7   r<   )r   _get_window_target_get_display_target_get_desktop_targetr4   s    r   
get_targetzCaptureSourceManager.get_target   sV    99 **,,99	!++--99	!++--r   c                   | j                         }|rt        j                  |      sy t        j                  |      \  }}}}||z
  dk  s||z
  dk  ry t        j                  |      xs d| }t        d||||f|      S )N   zHWND r,   )r-   win32guiIsWindowGetWindowRectGetWindowTextr   )r   hwndr   r   r   r   r   s          r   rV   z'CaptureSourceManager._get_window_target   s    %%'8,,T2#+#9#9$#? c5&4<1 1&&t,>%vXc5&'A5IIr   c           
        | j                         }|sy t        t        d| j                        t	        |      dz
        }||   }t        |d         }t        |d         }|t        |d         z   }|t        |d         z   }|j                  dd      }|j                  d	d      }	d
| dt        |d          dt        |d          d| d| 
}
|r	|
d| dz  }
|	r|
d|	 z  }
t        d||||f|
      S )Nr   r   r   r   r   r   rF   rB   rC   u   디스플레이  xz @ ,z []r7   )rA   r8   r   r.   r9   r   getr   )r   r0   idxrS   r   r   r   r   srcdevr   s              r   rW   z(CaptureSourceManager._get_display_target   s   $$&#a++,c(ma.?@SM1V9~!E(ms1W:&s1X;''eeHb!eeHb!"3%qQwZ(93q{;K:LCPTvUVWZV[\r#a[ EqYEYsE6(BEJJr   c                    | j                         }t        |d         }t        |d         }|t        |d         z   }|t        |d         z   }t        d||||fd      S )Nr   r   r   r   r<   u   전체 바탕화면)rT   r   r   )r   rS   r   r   r   r   s         r   rX   z(CaptureSourceManager._get_desktop_target   sh    $$&1V9~!E(ms1W:&s1X;''YsE6(BDYZZr   N)r-   zCallable[[], Optional[int]])r!   None)r.   r   r!   rk   )r!   z
list[dict])r   r   r   r   r   r   r   r   rF   r   rG   r   rC   r   rD   rH   r!   r"   r    )r!   zOptional[CaptureTarget])r#   r$   r%   r1   r5   r:   r=   r?   rA   staticmethodrI   r/   rT   rY   rV   rW   rX   r(   r   r   r*   r*   4   s~    -Q
 su  HM 
 
$  , 
 

JK&[r   r*   )__doc__
__future__r   dataclassesr   typingr   r   r   rK   r\   yjm_monitor_prober   r	   r   r   r   r*   r(   r   r   <module>rr      sb   & # ! , , 
  K S#sC  $
 
 
 F[ F[r   