
    zj*                    d    d Z ddlmZ ddlZddlZddlZddlmZ ddlmZ ddl	m
Z
  G d d      Zy)	u   표준 라이브러리(ctypes)만 사용하는 최소 Windows system-tray helper.

Tk UI는 main thread에서 유지하고, tray thread는 복원 요청 Event만 올린다.
호출 측은 poll_restore()를 Tk after()에서 주기적으로 확인한다.
    )annotationsN)wintypes)Optional)Pathc                  n    e Zd ZdZdddZedd       Zedd       ZddZddZ	ddZ
dd	Zdd
ZddZy)WindowsTrayIconu  Windows notification area icon with click-to-restore semantics.

    - 외부 패키지를 사용하지 않는다.
    - 아이콘은 hide_to_tray 시에만 표시하고 복원 시 제거한다.
    - tray thread에서 Tk를 직접 호출하지 않는다.
    Nc                   t        |xs d      | _        t        |xs | j                        d d | _        |r"t        t        |      j	                               nd| _        t        j                         | _        t        j                         | _	        t        j                         | _
        d| _        d | _        d| _        d| _        t        j                   dk(  | _        y )N_StApp    Fr   nt)strapp_idtooltipr   resolve	icon_path	threadingEvent_restore_event_ready_event_show_event_last_show_ok_thread_hwnd_visibleosname
_supported)selfr   r   r   s       D:\_St\Shared\windows_tray.py__init__zWindowsTrayIcon.__init__   s    &,H-71dkk24C8;DT)_4467"'oo/%OO-$??,"37
''T/    c                ,    t        | j                        S N)boolr   r   s    r    	supportedzWindowsTrayIcon.supported'   s    DOO$$r"   c                ,    t        | j                        S r$   )r%   r   r&   s    r    visiblezWindowsTrayIcon.visible+   s    DMM""r"   c                   | j                   sy| j                  r| j                  j                         ry| j                  j	                          t        j                  | j                  | j                   dd      | _        | j                  j                          | j                  j                  d       t        | j                        S )NFTz-tray)targetr   daemong       @timeout)r   r   is_aliver   clearr   Thread_thread_mainr   startwaitr%   r   r&   s    r    r3   zWindowsTrayIcon.start/   s    <<DLL113! ''t/@/@$++V[G\eijs+DJJr"   c                h   | j                         sy	 | j                  j                          d| _        t        j
                  j                  j                  | j                  | j                  dd       | j                  j                  d       t        | j                        S # t        $ r Y yw xY w)NFr         ?r-   )r3   r   r0   r   ctypeswindlluser32PostMessageWr   _wm_showr4   r%   	Exceptionr&   s    r    showzWindowsTrayIcon.show:   s    zz|	""$!&DMM  --djj$--AN!!#!.**++ 		s   BB% %	B10B1c                    | j                   r| j                  sd| _        y 	 t        j                  j
                  j                  | j                  | j                  dd       y # t        $ r
 d| _        Y y w xY w)NFr   )	r   r   r   r7   r8   r9   r:   _wm_hider<   r&   s    r    hidezWindowsTrayIcon.hideF   sZ    djj!DM	"MM  --djj$--AN 	"!DM	"s   A A# #A65A6c                t   | j                   sy t        | j                  xs d      }|r-	 t        j                  j
                  j                  |ddd       | j                  }|r8|j                         r(|t        j                         ur|j                  d       d| _        d| _        y # t        $ r Y `w xY w)Nr      r6   r-   F)r   intr   r7   r8   r9   r:   r<   r   r/   r   current_threadjoinr   )r   hwndts      r    stopzWindowsTrayIcon.stopO   s    4::?#$$11$1E LL!9+C+C+E"EFF3F
  s   ,B+ +	B76B7c                n    | j                   j                         sy| j                   j                          y)NFT)r   is_setr0   r&   s    r    poll_restorezWindowsTrayIcon.poll_restore^   s,    ""))+!!#r"   c                
    !"# t         j                  j                  #t         j                  j                  "t         j                  j                  }d}|dz    _        |dz    _        |dz    _        ddddd	d
ddddddddt        j                  t         j                        dk(  rt         j                  }nt         j                  }t        j                  |t        j                  t        j                  t        j                   t        j"                         G fddt         j$                        } G d dt         j$                         G fddt         j$                        t        j&                  |j(                  _        t        j                  #j,                  _        t        j.                  t        j0                  t        j0                  t        j.                  t         j2                  t         j2                  t         j2                  t         j2                  t        j                  t        j4                  t        j6                  t        j8                  g#j,                  _        |#j<                  _        t        j                  t        j                  t        j                   t        j"                  g#j<                  _        t        j                  t        j                  t        j                   t        j"                  g#j>                  _        t        j@                  #jB                  _        t        jD                  #jF                  _        t        j6                  t        j0                  t        j                  t         j2                  t         j2                  t        j                  g#jF                  _        t        j@                  g#jH                  _        t        j.                  t        jJ                        g"jL                  _        |j)                  d       }d jN                   dtQ        jR                          dtU                }         dt        j@                         d  "fd!d  "#fd! #f	d       } |       }||_+        ||_,        ||_-        #j]                  t        j^                  |            }	|	s j`                  jc                          y #j-                  d
||d
d
d
d
d
d d |d       }
|
s. j`                  jc                          	 #je                  ||       y ti        |
       _5         j`                  jc                          t        jl                         }	 #jo                  t        j^                  |      d d
d
      d
kD  rs#jq                  t        j^                  |             #js                  t        j^                  |             #jo                  t        j^                  |      d d
d
      d
kD  rs !        d
 _5        r	 #jI                         	 #je                  ||       y # tf        $ r Y y w xY w# tf        $ r Y .w xY w# tf        $ r Y y w xY w#  !        d
 _5        r"	 #jI                         n# tf        $ r Y nw xY w	 #je                  ||       w # tf        $ r Y w w xY wxY w)Ni   Q   R   S      rB   i  i  i  r         i   @      c                     e Zd Zdej                  fdW  fdej                  fdej                  fdej                  fdej                  fdej                  fdej                  fd	ej                  fd
ej                  fg
Zy)/WindowsTrayIcon._thread_main.<locals>.WNDCLASSWstylelpfnWndProc
cbClsExtra
cbWndExtra	hInstancehIconhCursorhbrBackgroundlpszMenuNamelpszClassNameN)__name__
__module____qualname__r   UINTr7   c_int	HINSTANCEHICONHANDLEHBRUSHLPCWSTR_fields_)WNDPROCs   r    	WNDCLASSWrV      s    (--((v||,v||,h001(..)HOO, (//2!1!12 ("2"23Hr"   rm   c                  ~    e Zd Zdej                  fdej
                  fdej
                  fdej                  dz  fgZy)*WindowsTrayIcon._thread_main.<locals>.GUIDData1Data2Data3Data4rT   N)ra   rb   rc   r7   c_ulongc_ushortc_ubyterk    r"   r    GUIDro      s>    &..)&//*&//*&..1,-	Hr"   rx   c                     e Zd Zdej                  fdej
                  fdej                  fdej                  fdej                  fdej                  fdej                  dz  fd	ej                  fd
ej                  fdej                  dz  fdej                  fdej                  dz  fdej                  fdW  fdej                  fgZ	y)5WindowsTrayIcon._thread_main.<locals>.NOTIFYICONDATAWcbSizehWnduIDuFlagsuCallbackMessager\   szTip   dwStatedwStateMaskszInfo   uTimeoutOrVersionszInfoTitlerS   dwInfoFlagsguidItemhBalloonIconN)
ra   rb   rc   r   DWORDHWNDrd   rg   WCHARrk   )rx   s   r    NOTIFYICONDATAWrz      s    8>>*'&8==)#X]]3(..)(..3./HNN+/8>>C/0$hmm4 34/T"0Hr"   r   _StTray__Fc                     r&	 j                   t        j                               dd_        y # t        $ r Y w xY w)NF)Shell_NotifyIconWr7   byrefr<   r   )
NIM_DELETE
icon_addednidr   shell32s   r    remove_iconz1WindowsTrayIcon._thread_main.<locals>.remove_icon   sF    --j&,,s:KL J!DM ! s   %4 	A A c           	     N   rd_         yt        j                        _        | _        d_        	z  
z  _        j                  _        t        j                         j                  r^t        j                        j                         r;	 j                  d j                  ddz        }|rt        j                  |      r_        nNt        j"                  t        j$                        t        j&                        }j)                  d |      _        j*                  _        	 t/        j1                  t        j2                                    }||_         |S # t        $ r t        j                         Y w xY w# t        $ r d}Y ;w xY w)NTrQ   r   F)r   r7   sizeofr{   r|   r}   r~   _wm_trayr   r   rg   r   r   is_file
LoadImageWr<   r\   castc_void_prj   	LoadIconWr   r   r%   r   r   )rF   loadedicon_resourceokIDI_APPLICATION
IMAGE_ICONLR_DEFAULTSIZELR_LOADFROMFILENIF_ICONNIF_MESSAGENIF_TIPNIM_ADDr   r   loaded_iconr   r   r   r9   s       r    add_iconz.WindowsTrayIcon._thread_main.<locals>.add_icon   sc    $7CJCHCG$x/'9CJ#'==C "..*K~~$t~~"6">">"@3#..tT^^ZQRTUWfiwWwxF&.nnV&< '	 &FOOO,LhN^N^ _",,T=A	CI'33GV\\#=NOP JDMI ! 3"*.."2K3  s$   :E3 :.F 3FFF$#F$c                  	 |j                   k(  r( 
|       _        j                  j                          y|j                  k(  r         y|j
                  k(  r-t        |      }|	fv rj                  j                          y|k(  r         j                  |        y|k(  r         j                  d       yj                  | |||      S )Nr   )r;   r   r   setr?   r   rC   r   DestroyWindowPostQuitMessageDefWindowProcW)rF   msgwparamlparameventWM_CLOSE
WM_DESTROYWM_LBUTTONDBLCLKWM_LBUTTONUPWM_RBUTTONUPr   r   r   r9   s        r    wndprocz-WindowsTrayIcon._thread_main.<locals>.wndproc   s    dmm#%-d^"  $$&dmm#dmm#F\+;\JJ''++-h$$T*j &&q)((sFFCCr"   returnNone)rF   rC   r   r%   ):r7   r8   r9   r   kernel32r   r;   r?   r   r   
c_longlongc_longWINFUNCTYPEr   r   rd   WPARAMLPARAM	StructureHMODULEGetModuleHandleWrestypeCreateWindowExWr   rj   re   HMENUrf   LPVOIDargtypesr   r:   rg   r   rh   r   DestroyIconPOINTERr   r   r   getpididrX   r[   r`   RegisterClassWr   r   r   UnregisterClassWr<   rC   r   MSGGetMessageWTranslateMessageDispatchMessageW)$r   r   WM_APPLRESULTrm   hinst
class_namer   wcatomrF   r   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rl   r   r   r   r   r   r   r9   s$   `           @@@@@@@@@@@@@@@@@@@@@@@@r    r2   zWindowsTrayIcon._thread_maind   s]   %%--''==))
!
 
 ==)Q.''GmmG$$WhmmX]]HOO]e]l]lm	(( 		6## 		f.. 	& -5,<,<!!))1&NNH,,h.>.>LL&,,fllMM8>>8+=+=x+
'
 )0%*2--YaYhYh)i&(0x}}hooW_WfWf'g$#+>> $,OO!&.&8&8(:J:JHMM[a[g[gioiuiuw  xE  xE  &F"'/~~&6#.6nnfnn_>]-^!!*))$/}Abiik]!BtH:F

nn&	" 	"	 	 	B 
	D 	D 
	D. [ %$$V\\"%56!!#%%aZAq!QPTVZ\acgh!!#''
E: Y
lln	$$V\\#%6aCaG''S(9:''S(9: $$V\\#%6aCaG MDJ&&{3''
E:)  " !    MDJ&&{3  ''
E: s   Y? ,BZ, Z ,Z ?	Z
Z	ZZ	Z)(Z),\>[\	[\[\ [32\3	[?<\>[??\r$   )r   r   r   r   r   zstr | os.PathLike[str] | None)r   r%   r   )ra   rb   rc   __doc__r!   propertyr'   r)   r3   r=   r@   rH   rK   r2   rw   r"   r    r   r      sS    * % % # #	 
"Dr"   r   )r   
__future__r   r7   r   r   r   typingr   pathlibr   r   rw   r"   r    <module>r      s-   
 #  	    V Vr"   