
    AHj%                       d dl mZ d dlZd dlZd dlZd dlZd dlmZmZ d dlm	Z	m
Z
mZmZ d dlmZmZmZmZmZmZmZmZ d dlmZmZmZmZmZ d dlmZ d dlmZ d d	l m!Z!m"Z" d d
l#m$Z$ erd dl%m&Z&  ejN                  dd      Z(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9e(jt                  Z:ej                   ge:_;        ej"                  e:_<         G d de	      Z= G d de
      Z> G d d e	      Z? G d! d"e	      Z@ G d# d$e	      ZA G d% d&e	      ZB G d' d(e	      ZC G d) d*e
      ZD G d+ d,e	      ZEd3d-ZFd4d.ZGd5d/ZHd6d7d0ZI G d1 d2ej                        ZKy)8    )annotationsN)AbstractEventLooprun_coroutine_threadsafe)	StructureUnionbyrefwintypes)BOOLCHARDWORDHANDLESHORTUINTWCHARWORD)IOTYPE_CHECKINGCallableListOptional)	constants)XTermParser)EventResize)Size)Appkernel32T)use_last_error                   @      i   iii  c                       e Zd ZdZdefdefgZy)COORDz:https://docs.microsoft.com/en-us/windows/console/coord-strXYN)__name__
__module____qualname____doc__r   _fields_     M/root/tools/cai/cai_env/lib/python3.12/site-packages/textual/drivers/win32.pyr(   r(   2   s    D 
e	eHr1   r(   c                       e Zd ZdZdefdefgZy)uCharEhttps://docs.microsoft.com/en-us/windows/console/key-event-record-str	AsciiCharUnicodeCharN)r+   r,   r-   r.   r   r   r/   r0   r1   r2   r4   r4   ;   s    O 
d	Hr1   r4   c                  8    e Zd ZdZdefdefdefdefdefdefgZy)	KEY_EVENT_RECORDr5   bKeyDownwRepeatCountwVirtualKeyCodewVirtualScanCoder4   dwControlKeyStateN)	r+   r,   r-   r.   r
   r   r4   r   r/   r0   r1   r2   r9   r9   D   s>    O 
T		D!	T"	%	e$Hr1   r9   c                  ,    e Zd ZdZdefdefdefdefgZy)MOUSE_EVENT_RECORDzGhttps://docs.microsoft.com/en-us/windows/console/mouse-event-record-strdwMousePositiondwButtonStater>   dwEventFlagsN)r+   r,   r-   r.   r(   r   r/   r0   r1   r2   r@   r@   Q   s.    Q 
E"	% 	e$		Hr1   r@   c                      e Zd ZdZdefgZy)WINDOW_BUFFER_SIZE_RECORDzNhttps://docs.microsoft.com/en-us/windows/console/window-buffer-size-record-strdwSizeN)r+   r,   r-   r.   r(   r/   r0   r1   r2   rE   rE   \   s    X5!"Hr1   rE   c                      e Zd ZdZdefgZy)MENU_EVENT_RECORDzFhttps://docs.microsoft.com/en-us/windows/console/menu-event-record-strdwCommandIdN)r+   r,   r-   r.   r   r/   r0   r1   r2   rH   rH   b   s    P%&Hr1   rH   c                      e Zd ZdZdefgZy)FOCUS_EVENT_RECORDzGhttps://docs.microsoft.com/en-us/windows/console/focus-event-record-str	bSetFocusN)r+   r,   r-   r.   r
   r/   r0   r1   r2   rK   rK   h   s    Qd#$Hr1   rK   c                  2    e Zd ZdZdefdefdefdefdefgZ	y)
InputEventAhttps://docs.microsoft.com/en-us/windows/console/input-record-strKeyEvent
MouseEventWindowBufferSizeEvent	MenuEvent
FocusEventN)
r+   r,   r-   r.   r9   r@   rE   rH   rK   r/   r0   r1   r2   rN   rN   n   s;    K 
%&	)*	 ";<	'(	)*Hr1   rN   c                  4    e Zd ZdZdej
                  fdefgZy)INPUT_RECORDrO   	EventTyper   N)r+   r,   r-   r.   r	   r   rN   r/   r0   r1   r2   rV   rV   z   s    Khmm,w
.CDHr1   rV   c                x    t        j                  | j                               }t        j	                  ||      }|S )zSet the console mode for a given file (stdout or stdin).

    Args:
        file: A file like object.
        mode: New mode.

    Returns:
        True on success, otherwise False.
    )msvcrtget_osfhandlefilenoKERNEL32SetConsoleMode)filemodewindows_filehandlesuccesss       r2   set_console_moderb      s3      --dkkm<%%&8$?GNr1   c                    t        j                  | j                               }t        j                         }t
        j                  |t        j                  |             |j                  S )zGet the console mode for a given file (stdout or stdin)

    Args:
        file: A file-like object.

    Returns:
        The current console mode.
    )
rY   rZ   r[   r	   r   r\   GetConsoleModectypesr   value)r^   r`   r_   s      r2   get_console_moderg      sK      --dkkm<>>D.T0BC::r1   c                     t         j                  t         j                  t              t              dfd} t	        t
        z         t	        t               | S )zlEnable application mode.

    Returns:
        A callable that will restore terminal to previous state.
    c                 6    t                t               y)z)Restore console mode to previous settingsN)rb   )current_console_mode_incurrent_console_mode_outterminal_interminal_outs   r2   restorez(enable_application_mode.<locals>.restore   s    &=>'?@r1   returnNone)sys	__stdin__
__stdout__rg   rb   "ENABLE_VIRTUAL_TERMINAL_PROCESSINGENABLE_VIRTUAL_TERMINAL_INPUT)rn   rj   rk   rl   rm   s    @@@@r2   enable_application_moderw      sa     --K>>L.{;/=A A
 .1SS ["?@Nr1   c                    t         t        |       z  } ||  }t        j                  t        |      |t	        d      t        |            }|t        k(  ry| |   S )a  
    Waits for multiple handles. (Similar to 'select') Returns the handle which is ready.
    Returns `None` on timeout.
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms687025(v=vs.85).aspx
    Note that handles should be a list of `HANDLE` objects, not integers. See
    this comment in the patch by @quark-zju for the reason why:
        ''' Make sure HANDLE on Windows has a correct size
        Previously, the type of various HANDLEs are native Python integer
        types. The ctypes library will treat them as 4-byte integer when used
        in function arguments. On 64-bit Windows, HANDLE is 8-byte and usually
        a small integer. Depending on whether the extra 4 bytes are zero-ed out
        or not, things can happen to work, or break. '''
    This function returns either `None` or one of the given `HANDLE` objects.
    (The return value can be tested with the `is` operator.)
    FN)r   lenr\   WaitForMultipleObjectsr
   r   WAIT_TIMEOUT)handlestimeoutarrtypehandle_arrayrets        r2   wait_for_handlesr      sY      s7|#GG$L..L<eeGnC ls|r1   c                  H     e Zd ZdZ	 	 	 	 	 	 	 	 	 	 d fdZddZddZ xZS )EventMonitorz5A thread to send key / window events to Textual loop.c                ^    || _         || _        || _        || _        t        |   d       y )Nztextual-input)name)loopapp
exit_eventprocess_eventsuper__init__)selfr   r   r   r   	__class__s        r2   r   zEventMonitor.__init__   s2     	$*o.r1   c                   | j                   j                  }t        t        j                        }	 t        j                  d      }t        t              }d}d}d}t        |z  } |       }	t        j                  }
g }|j                  } |       s|j                         D ]  }| j                  |        t        |gd      < |
|t!        |	      |t!        |             |	d |j"                   }|d d = d }|D ]  }|j$                  }||k(  r^|j&                  j(                  }|j*                  j,                  }|j.                  sM|j0                  r|j2                  dk(  ri ||       r||k(  sx|j&                  j4                  j6                  }|j8                  |j:                  f} |rU|j=                  dj?                  |      jA                  dd	      jC                  d            D ]  }| j                  |        | | jD                  |   |       sy y # tF        $ r0}| jH                  jJ                  jM                  d
|       Y d }~y d }~ww xY w)N)debugr   i   r$   r   d    zutf-16surrogatepasszEVENT MONITOR ERROR)'r   is_setr   r   DEBUGr	   r   GetStdHandleSTD_INPUT_HANDLErV   r\   ReadConsoleInputWappendtickr   r   r   rf   rW   r   rP   r4   r7   r:   r>   r<   rR   rF   r)   r*   feedjoinencodedecodeon_size_change	Exceptionr   logerror)r   exit_requestedparser
read_counthIn
MAX_EVENTS	KEY_EVENTWINDOW_BUFFER_SIZE_EVENTr~   input_recordsr   keys
append_keyeventread_input_recordsnew_sizeinput_record
event_type	key_eventkeysizer   s                         r2   runzEventMonitor.run   s8   //9??3B	=!*J/0CJI'-$"Z/G#IM ( : : DJ$&#[[] .E&&u-. $SE3/7 "}-z5;L &33EZ5E5E%F"G6:$6 4L!-!7!7J!Y.$0$6$6$?$?	'oo99$-- ) ; ;$-$=$=$B (&sO#'??+11GGNN$(FFDFF#3#4& 
 "(,,XGNNxX" 2 **512 ''D''2c %&&f  	=HHLL4e<<	=s%   DH  *H  3B)H   	I)&IIc                    t        ||      }t        ||      }t        | j                  j	                  |      | j
                         y)z"Called when terminal size changes.)r   N)r   r   r   r   _post_messager   )r   widthheightr   r   s        r2   r   zEventMonitor.on_size_change,  s7    E6"tT" !7!7!>TYYOr1   )
r   r   r   r   r   zthreading.Eventr   zCallable[[Event], None]rp   rq   ro   )r   intr   r   rp   rq   )r+   r,   r-   r.   r   r   r   __classcell__)r   s   @r2   r   r      sH    ?// / $	/
 // 
/F=PPr1   r   )r^   r   r_   r   rp   bool)r^   r   rp   r   )rp   zCallable[[], None]))r|   zList[HANDLE]r}   r   rp   zOptional[HANDLE])L
__future__r   re   rY   rr   	threadingasyncior   r   r   r   r   r	   ctypes.wintypesr
   r   r   r   r   r   r   r   typingr   r   r   r   r   textualr   textual._xterm_parserr   textual.eventsr   r   textual.geometryr   textual.appr   WinDLLr\   ENABLE_ECHO_INPUTENABLE_EXTENDED_FLAGSENABLE_INSERT_MODEENABLE_LINE_INPUTENABLE_MOUSE_INPUTENABLE_PROCESSED_INPUTENABLE_QUICK_EDIT_MODEENABLE_WINDOW_INPUTrv   ENABLE_PROCESSED_OUTPUTENABLE_WRAP_AT_EOL_OUTPUTru   DISABLE_NEWLINE_AUTO_RETURNENABLE_LVB_GRID_WORLDWIDEr   STD_OUTPUT_HANDLEr{   r   argtypesrestyper(   r4   r9   r@   rE   rH   rK   rN   rV   rb   rg   rw   r   Threadr   r0   r1   r2   <module>r      sw   "   
  ? 4 4 O O O > >  - ( !6==D9          &  ! " %+ "$ "   $$!(  I E 
y 
 #	 #'	 '% %	 	E9 E2:\P9## \Pr1   