
    iP                        S r SSKJr  SSKrSSKrSSKrSSKJr  SSKJ	r	  SSK
JrJrJr  SSKJr   \rSSKrSS	KJrJrJrJrJrJrJrJrJrJrJr  SS
KJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-  \" \$5      r.\" \!5      r/\R`                  " SSS9r1\1Rd                  r2\*\2l3        \+/\2l4        \R`                  " SSS9r5Sr6Sr7Sr8Sr9Sr:Sr; " S S\5      r< " S S\R8                  5      r= " S S\R8                  5      r> " S S\R8                  5      r? " S S\R                  5      rA " S S\R8                  5      rB\" \\'\(\" \<5      5      rC\5R                  rE\\C\,\!/\El4        \#\El3        \5R                  rF\\Fl3        \5R                  rG\#/\Gl4        \"\Gl3        \5R                  rI\.\-\\/\Il4        \"\Il3        \5R                  rJ\./\Jl4        \"\Jl3        \5R                  rL\./\Ll4        \S-  rM\5R                  rN\M/\Nl4        \"\Nl3        \5R                  rP\\%\/\Pl4        \\Pl3        \5R                  rR\\/\Rl4        \\Rl3        \5R                  rS\\\M\%\\/\Sl4        \\Sl3        \5R                  rT\\" \B5      \/\Tl4        \\Tl3        SrUSrVSrWSrXSrY\5R                  r[\&/\[l4        \\[l3        S r\Sr]S!r^S"r_S#r`\]\\^\\_\\`\0ra0 SS$_S%S&_S'S(_S)S*_S+S,_S S-_S.S/_S0S1_S2S3_S4S5_S6S7_S6S8_S6S9_S:S;_S<S=_S>S?_S>S@_0 SASB_SCSD_SESF_SGSH_SISJ_SKSL_SMSN_SOSP_SQSR_SSST_SUSV_SWSX_SYSZ_S[S\_S]S^_S_S`_SaSb_E0 ScSd_SeSf_SgSh_SiSj_SkSl_SmSn_SoSp_SqSr_SsSt_SuSv_SwSx_SySz_S{S|_S}S~_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SGS _GSGS_GSGS_GSGS_GSGS_GS	GS
_GSGS_E0 GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS _GS!GS"_GS#GS$_GS%GS&_GS'GS(_GS)GS*_GS+GS,_GS-GS._E0 GS/GS0_GS1GS2_GS3GS4_GS5GS6_GS7GS8_GS9GS:_GS;GS<_GS=GS>_GS?GS@_GSAGSB_GSCGSD_GSEGSF_GSGGSH_GSIGSJ_GSKGSL_GSMGSN_GSOGSP_EGSQGSRGSSGSTS*GSU.Erb\" 5       rc\	" \d5      re\	" \d5      rf0 rg/ GSVQrh\R                  " SK5      rj\R                  " SK5      rk\M" 5       rlGSW rmGSX rn\nro/ GSYQrpGSZqqGSZqrGSZqs\t" / GS[Q5      ruGS\ rvGS] rwGS^ rxGS_ ryGS` rzGSa r{GSb r|\}GSc:X  a0  \n" 5         SSK~r~\~R                  " \e5        \~R                  " \f5        gg! \ a     GNf = f(d  a  
This is the Windows backend for keyboard events, and is implemented by
invoking the Win32 API through the ctypes module. This is error prone
and can introduce very unpythonic failure modes, such as segfaults and
low level memory leaks. But it is also dependency-free, very performant
well documented on Microsoft's website and scattered examples.

# TODO:
- Keypad numbers still print as numbers even when numlock is off.
- No way to specify if user wants a keypad key or not in `map_char`.
    )unicode_literalsN)Lock)defaultdict   )KeyboardEventKEY_DOWNKEY_UP)normalize_name)c_shortc_charc_uint8c_int32c_intc_uintc_uint32c_long	Structure	CFUNCTYPEPOINTER)WORDDWORDBOOLHHOOKMSGLPWSTRWCHARWPARAMLPARAMLONGHMODULELPCWSTR	HINSTANCEHWNDkernel32T)use_last_erroruser32         c                   6    \ rS rSrS\4S\4S\4S\4S\4/rSrg)	KBDLLHOOKSTRUCT7   vk_code	scan_codeflagstimedwExtraInfo N)	__name__
__module____qualname____firstlineno__r   r   	ULONG_PTR_fields___static_attributes__r2       Y/home/kali/github-search/github-env/lib/python3.13/site-packages/keyboard/_winkeyboard.pyr+   r+   7   s0    E"e$% 	*	,Hr:   r+   c                   <    \ rS rSrS\4S\4S\4S\4S\4S\44rSrg	)

MOUSEINPUT?   dxdy	mouseDatadwFlagsr0   r1   r2   N)	r3   r4   r5   r6   r   r   r7   r8   r9   r2   r:   r;   r=   r=   ?   s6    tte$E"	*,Hr:   r=   c                   6    \ rS rSrS\4S\4S\4S\4S\44rSrg)	
KEYBDINPUTG   wVkwScanrB   r0   r1   r2   N)	r3   r4   r5   r6   r   r   r7   r8   r9   r2   r:   r;   rD   rD   G   s.    $E"	*	,Hr:   rD   c                   *    \ rS rSrS\4S\4S\44rSrg)HARDWAREINPUTN   uMsgwParamLwParamHr2   N)r3   r4   r5   r6   r   r   r8   r9   r2   r:   r;   rI   rI   N   s     D!D!#Hr:   rI   c                   *    \ rS rSrS\4S\4S\44rSrg)_INPUTunionS   mikihir2   N)	r3   r4   r5   r6   r=   rD   rI   r8   r9   r2   r:   r;   rO   rO   S   s!    z"z"}%'Hr:   rO   c                   $    \ rS rSrS\4S\44rSrg)INPUTX   typeunionr2   N)r3   r4   r5   r6   r   rO   r8   r9   r2   r:   r;   rU   rU   X   s    +&(Hr:   rU            i  i  i  )zcontrol-break processingF   )	backspaceF	   )tabF   )clearF   )enterF)shiftF   )ctrlF   )altF   )pauseF   )	caps lockF   )zime kana modeF)zime hanguel modeF)zime hangul modeF   )zime junja modeF   )zime final modeF   )zime hanja modeF)zime kanji modeF   )escF   )zime convertF   )zime nonconvertF   )z
ime acceptF   )zime mode change requestF    )spacebarF!   )zpage upF"   )z	page downF#   )endF$   )homeF%   )leftF&   )upF'   )rightF(   )downF)   )selectF*   )printF+   )executeF,   )zprint screenF-   )insertF.   )deleteF/   )helpF0   )0F1   )1F2   )2F3   )3F4   )4F5   )5F6   )6Fr,   )7F8   )8F9   )9FA   )aFB   )bFC   )cFD   )dFE   )eFF   )fFrE   )gFH   )hFI   )iFJ   )jFK   )kFL   )lFM   )mFrJ   )nFO   )oFP   )pFQ   )qFR   )rFrP   )sFT   )tFU   )uFV   )vFW   )wFrV   )xFY   )yFZ   )zF[   )zleft windowsF\   )zright windowsF]   )applicationsF_   )sleepF`   )r   Ta   )r   Tb   )r   Tc   )r   Td   )r   Te   )r   Tf   )r   Tg   )r   Th   )r   Ti   )r   Tj   )*Tk   )+Tl   )	separatorTm   )-Tn   )decimalTo   )/Tp   )f1Fq   )f2Fr   )f3Fs   )f4Ft   )f5Fu   )f6Fv   )f7Fw   )f8Fx   )f9Fy   )f10Fz   )f11F{   )f12F|   )f13F}   )f14F~   )f15F   )f16F   )f17F   )f18F   )f19F   )f20F   )f21F   )f22F   )f23F   )f24F   )num lockF   )scroll lockF   )z
left shiftF   )zright shiftF   )z	left ctrlF   )z
right ctrlF   )z	left menuF   )z
right menuF   )zbrowser backF   )zbrowser forwardF   )zbrowser refreshF   )zbrowser stopF   )zbrowser search keyF   )zbrowser favoritesF   )zbrowser start and homeF   )zvolume muteF   )zvolume downF   )z	volume upF   )z
next trackF   )zprevious trackF   )z
stop mediaF   )zplay/pause mediaF   )z
start mailF   )zselect mediaF   )zstart application 1F   )zstart application 2F   )r   F   ),F   )r   F   ).F   )zime processF   )attnF   )crselF   )exselF   )z	erase eofF)playF)zoomF)z	reserved F)pa1F)               )r2   rd   alt grr$  )rd   r$  rl   )rd   rl   )rW  r$  c           	   #   8  #    XU4[         ;   nU[        ;   nU(       a  U(       a  [        U   S   v   SSU;   -  [        S'   SSU;   -  [        S'   SSU;   -  [        S'   SS	U;   -  [        S
'   SSU;   -  [        S'   SSU;   -  [        S'   [        X[        [        [        [        5      S5      nU(       aK  [        R                  (       a6  [        R                  v   [        X[        [        [        [        5      S5        [        U S-  US-  -  [        S5      nU(       a'  [        R                  (       a  [        R                  v   [        R                  U[        5      S-  nUS:w  a  [        U5      v   U(       d  U(       a  [        U   S   v   g g g 7f)Nr   r  rd   r[   rW  re   rg   r   rl   rk   r$  r#  r&  r%  ro   i      )keypad_keysofficial_virtual_keyskeyboard_state	ToUnicodeunicode_bufferlenvalueGetKeyNameTextname_bufferr&   MapVirtualKeyWMAPVK_VK_TO_CHARchr)	r.   vkis_extended	modifiers	is_keypadis_officialunicode_retname_retchars	            r;   get_event_namesrp  _  sk    ,;I--K[#B'**7i#78N48y#89N48y#89N4;)#;<N4:#:;N4=I#=>N4B>>3~K^`abK~++"""
 	"^ATVWXi2or0AA;PTUHK%%  %56=Dqy$i#B'** %9s   FFc                  L  ^ [            [        (       a
   SSS5        g[        S5       V s/ s H  o [        R	                  U [
        S5      4PM!     nn [        S5       Vs/ s H   n[        R	                  U[        S5      U4PM"     nnX-    H  u  pBXBSSS4[        ;   a  M  U[        ;  a	  U[        U'   S H  n[         H  nXBXV4n[        [        U6 5      nU(       d  M!  U V	s/ s H  oR                  5       PM     n
n	X-   [        U'   [        [        [        X-   5      5       H  u  p[        U	   R!                  X45        M      M     M     M     S H:  n[         H-  nS/[        SSXV4'   [        S   R!                  SSSXV445        M/     M<     SSS5        [#        S	 5      mTR%                  SSS
SSS.5        U4S jn[        [        R'                  5       5       H  u  p[)        [+        U5      US9[        U	'   M!     gs  sn f s  snf s  sn	f ! , (       d  f       N= f)zL
Ensures the scan code/virtual key code/name translation tables are
filled.
NrY   r   )r   r   rW    r)  r   c                      g)N
   r2   r2   r:   r;   <lambda>$_setup_name_tables.<locals>.<lambda>  s    rr:   r(   rZ   r)   )r2   rU  rV  )rf   )rh   c                 &   > U u  pUu  p4pVTU   XXC4$ )Nr2   )liner   entryr.   rh  extendedrj  modifiers_preferences          r;   	order_key%_setup_name_tables.<locals>.order_key  s&    -2*	x#I.RJJr:   )key)tables_lockto_nameranger&   MapVirtualKeyExWMAPVK_VSC_TO_VK_EXMAPVK_VK_TO_VSC_EXscan_code_to_vkdistinct_modifierslistrp  lower	enumeratemapr
   	from_nameappendr   updateitemssortedset)scall_scan_codesrh  all_vksr.   rz  rj  ry  namesnamelowercase_namesr   r|  entriesr{  s                 @r;   _setup_name_tablesr    s   
 
7F 

 ^cch]ij]iWYv66r;MqQR]ij]bch]ij]iWY62227I1MrR]ij+5MIq!Q'72/-/	* #!3I&H@E %!89EuDI*JED::<E*J).)@ (1^UE\1]'^GA%dO22A:> (_ "4 # 6: H/	<D:c878(#**AS(/N+OP 0 I 
R 'z2QAARS_` abK ioo/0 W9=	$ 1U kj" +K/ 
sA   HH&HH 'HAH!H%H>BHH
H#)$r     r   r  rs   rb   r   r  r   r   r   r  r,   r   r   r  r   r#  r   r  )rE   r   r   )rE   r}   r   )r   r   r   )r   r   r   )r   r   r   )r   ry   r   r   r   r   r  )r   r   r   )r   r   r   )r   r   r   )r   r`   r   )r   r   r   )r   r   r   rJ   r   r   r  )r   r{   r   )r   r   r   )r   r   r   )r   r   r   )r   rz   r   )r   r   r   )r   r   r   )r   r   r   )rP   r   r   )rP   r   r   F)r[   r'  r(  c                    ^ ^ [        5         U 4S jmU4S jn[        S5      n[        U5      n[        S5      n[	        S5      n[        X#XE5      n[        R                  " [        U5        g)aJ  
Registers a Windows low level keyboard hook. The provided callback will
be invoked for each high-level keyboard event, and is expected to return
True if the key event should be passed to the next program, or False if
the event is to be blocked.

No event is processed until the Windows messages are pumped (see
start_intercept).
c           	        > US:X  a  [         (       a  Sq gS[        -  S[        -  -   S[        R	                  S5      S-  -  -   S	[        R	                  S
5      S-  -  -   S[        R	                  S5      S-  -  -   nX!X44nU[
        ;  a  [        [        U6 5      [
        U'   [
        U   nU(       a  US   OS nU[        ;   a	  U [        :H  qUS:X  a  US:X  a  Sq U [        :H  qX!U4[        ;   nT	" [        X=(       d    U* XxS95      $ )Nr,  FTrU  rV  rX  r#  r   rY  rk   )r&  r%  r   rr  r)  )
event_typer.   r  rk  )ignore_next_right_altshift_is_pressedaltgr_is_pressedr&   GetKeyStater  r  rp  	shift_vksr   r\  r   )
r  rh  r.   ri  rj  ry  r  r  rk  callbacks
            r;   process_key&prepare_intercept.<locals>.process_key  s/   
 ://$)! ))**+V//59:; f006:;<  2 24 81 <=	> 	 7!/5"9:GEN uQxd ?)X5c	$(!)X5K0K?	GWUWTW^bxyyr:   c                   >  UR                   R                  n[        S-  nU[        :w  af  UR                   R                  U-  U:w  aI  [
        U   nUR                   R                  S-  nUR                   R                  nT
" XSXv5      nU(       d  g[        S XU5      $ ! [         a*  n	[        S5        [        R                  " 5          S n	A	N<S n	A	ff = f)Nrw   r   zError in keyboard hook:)contentsr-   LLKHF_INJECTED	VK_PACKETr/   keyboard_event_typesr.   	Exceptionr   	traceback	print_excCallNextHookEx)nCodewParamlParamrh  fake_altr  ri  r.   should_continuer   r  s             r;   low_level_keyboard_handler5prepare_intercept.<locals>.low_level_keyboard_handler  s    	"((B&-HY6??#8#88#Cx#O1&9
$oo33a7"OO55	"-ji"U&
 dE6::	  	"+,!!	"s   BB 
C) CCrb   Nr   )	r  r   LowLevelKeyboardProcGetModuleHandleWr   SetWindowsHookExatexitregisterUnhookWindowsHookEx)r  r  WH_KEYBOARD_LLkeyboard_callbackhandle	thread_idkeyboard_hookr  s   `      @r;   prepare_interceptr    s_     zB;& 2YN,-GHt$FaI$^ZM OO'):;r:   c                     [        U 5        [        5       n[        USSS5      (       d,  [        U5        [	        U5        [        USSS5      (       d  M+  g g Nr   )r  LPMSG
GetMessageTranslateMessageDispatchMessage)r  msgs     r;   listenr  0  sE    h
'CaA&& aA&&r:   c              #      #    [        5         [        R                  U 5      nU(       d#  [        SR	                  [        U 5      5      5      eU H  u  p#Uu  pEpgU=(       d    U* U4v   M     g 7f)Nz+Key name {} is not mapped to any known key.)r  r  get
ValueErrorformatrepr)r  r  r   ry  r.   rh  ri  rj  s           r;   map_namer  7  s`     mmD!GFMMdSWjYZZ05-	{B3	)) s   A+A-c                    U S:X  a/  [         R                  SXS5        [         R                  SXS5        g U S:  a.  [        R                  U S5      n[         R                  X US5        g [         R                  U * SUS5        g )Nrr  re   r   rg   )r&   keybd_eventr  r  )coder  rh  s      r;   _send_eventr  A  sp    s{415415	  q)2Z3 	D5!Z3r:   c                     [        U S5        g r  r  r  s    r;   pressr  N      ar:   c                     [        U S5        g )Nr(   r  r  s    r;   releaser  Q  r  r:   c           
      .   [        U R                  S5      5      n/ n/ n[        S[        U5      S5       H  nXUS-    u  pV[	        SUS-  U-   [
        SS 5      nUR                  [        [        [        US95      5        [	        SUS-  U-   [
        [        -  SS 5      nUR                  [        [        [        US95      5        M     X#-   n[        U5      n	[        U	-  n
U
" U6 n[        [        R                  " [        5      5      n[        XU5        g )Nzutf-16ler   r(   r\   )rR   )	bytearrayencoder  ra  rD   KEYEVENTF_UNICODEr  rU   INPUT_KEYBOARDrO   KEYEVENTF_KEYUPr   ctypessizeof	SendInput)	character
surrogatespressesreleasesr   higherr  	structureinputsnInputsLPINPUTpInputscbSizes                r;   type_unicoder  T  s     9++J78JGH1c*oq)"QqS)q5A:"79JAtT	u^[I-FGHq5A:"79J_9\^_aef	nkY.GHI * F&kGgoGvG6=='(Fg'r:   __main__)__doc__
__future__r   rer  r  	threadingr   collectionsr   _keyboard_eventr   r   r	   _canonical_namesr
   unichrrg  	NameErrorr  r   r   r   r   r   r   r   r   r   r   r   ctypes.wintypesr   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r  r7   WinDLLr$   r  restypeargtypesr&   r  INPUT_MOUSEr  INPUT_HARDWAREr  r  r+   r=   rD   rI   UnionrO   rU   r  SetWindowsHookExWr  r  r  GetMessageWr  r  DispatchMessageAr  keyboard_state_typeGetKeyboardStateGetKeyNameTextWrc  re  MapVirtualKeyr_  r  rf  MAPVK_VK_TO_VSCMAPVK_VSC_TO_VKr  r  
VkKeyScanW	VkKeyScanr  
WM_KEYDOWNWM_KEYUPWM_SYSKEYDOWNWM_SYSKEYUPr  r]  r  r  r  r  r  r  create_unicode_bufferrd  r`  r^  rp  r  initr\  r  r  r  r  r  r  r  r  r  r  r  r  r3   pprintr2   r:   r;   <module>r     s=  
 ( 	    # < < ,	
C  t t t t B  B  B  BEN	==D9,, "  $I   
x$	7	 ,i ,,!! ,,!! ,#F$$ #
'&,, '
(F ( !8PQ ++ "$8)eL     && 00  %w  "  
dFF3
 
 ** "G    ))!7  m ** 01    ''!651  %% &)  	f&965&Q	 	 	gene4	 	     	W	 	 
 f8	 `
-`
` 	.` 	
	`
 	
` 	
` 	/` 	.` 	
` 	
` 	
"` 	
%` 	
$` 	
#` 	
#`  	
#!`" 	
##`$ 	.%`& 	
 '`( 	
#)`* 	
+`, 	
,-`. 	
/`0 	
1`2 	
3`4 	.5`6 	/7`8 	/9`: 	-;`< 	
=`> 	/?`@ 	
A`B 	
C`D 	
E`F 	
!G`H 	
I`J 	
K`L 	/M`N 	,O`P 	,Q`R 	,S`T 	,U`V 	,W`X 	,Y`Z 	,[`\ 	,]`^ 	,_`` 	,a`b 	,c`d 	,e`f 	,g`h 	,i`j 	,k`l 	,m`n 	,o`p 	,q`r 	,s`t 	,u`v 	,w`x 	,y`z 	,{`| 	,}`~ 	,`@ 	,A`B 	,C`D 	,E`F 	,G`H 	,I`J 	,K`L 	,M`N 	,O`P 	,Q`R 	,S`T 	,U`V 	
!W`X 	
"Y`Z 	
![`\ 	
]`^ 	+_`` 	+a`b 	+c`d 	+e`f 	+g`h 	+i`j 	+k`l 	+m`n 	+o`p 	+q`r 	+s`t 	+u`v 	
w`x 	+y`z 	
{`| 	+}`~ 	-`@ 	-A`B 	-C`D 	-E`F 	-G`H 	-I`J 	-K`L 	-M`N 	-O`P 	.Q`R 	.S`T 	.U`V 	.W`X 	.Y`Z 	.[`\ 	.]`^ 	._`` 	.a`b 	.c`d 	.e`f 	.g`h 	.i`j 	.k`l 	.m`n 	
o`p 	
 q`r 	
s`t 	
 u`v 	
w`x 	
y`z 	
{`| 	
}`~ 	
!`@ 	
$A`B 	
$C`D 	
!E`F 	
'G`H 	
&I`J 	
+K`L 	
 M`N 	
 O`P 	
Q`R 	
S`T 	
#U`V 	
W`X 	
%Y`Z 	
[`\ 	
!]`^ 	
(_`` 	
(a`b 	,c`d 	,e`f 	,g`h 	,i`l 	
 m`n 	/o`p 	
q`r 	
s`t 	
u`v 



` D f
d
		  **2.--b1$&+@5>p &P    "#	H<T*4(& z
MM'
MM)	 ]  		s   V9 9WW