
    ^jNB                     <   d dl Z d dlZd dl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Zd dlmZ d dl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 dddddddZddddZi Z d Z! G d dej"                  Z#d Z$ e$            Z% ej&        dddddd ddd d d          Z' G d d e          Z(e()                    d!           e()                    d"           e()                    d#            e(            Z* G d$ d%e          Z+d+d&Z,d' Z-d( Z.d+d)Z/d+d*Z0dS ),    N)ListDictOptional)WM_DEVICECHANGEDBT_DEVICEARRIVALDBT_DEVICEREMOVECOMPLETEDBT_DEVTYP_DEVICEINTERFACEDEVICE_NOTIFY_WINDOW_HANDLE)EventDispatcher)base)win32)dinput_user32DEV_BROADCAST_DEVICEINTERFACEcomDEV_BROADCAST_HDR)	_kernel32)get_mapping)ControllerManagerxyzrxryrz)r                  wheel)r   r   r   c                 P   | j         }| j        }t          j        |          }|t          j        z  r2t
                              |          }t          j        |dd|          }n|t          j	        z  r0t                              |          }t          j        ||          }nw|t          j        z  r0t                              |          }t          j        ||          }n8|t          j        z  r't          j        t          j        j        dd|          }nd S | j        |_        |S )Nr   i  l    )tszNamedwTyper   DIDFT_GETINSTANCEDIDFT_ABSAXIS_abs_instance_namesgetr   AbsoluteAxisDIDFT_RELAXIS_rel_instance_namesRelativeAxisDIDFT_BUTTON_btn_instance_namesButton	DIDFT_POVHAT_type)object_instanceraw_name	ctrl_typeinstancenamecontrols         Y/home/agentuser/manim-venv/lib/python3.11/site-packages/pyglet/input/win32/directinput.py_create_controlr:   )   s   &H&I'	22H6'' "&&x00#D!VX>>	V)	) 	"&&x00#D(33	V(	( "&&x00+dH--	V%	% #D$5$91j(SS#*GMN    c                   \     e Zd Z fdZd Zd Zd Zd Zd Zdd	Z	d
 Z
d Zd Zd Z xZS )DirectInputDevicec                 X   |j         }t                                          ||           |j        dz  | _        |j        dz  | _        || _        |                                  |                                  |j	        | _
        t          |j        j        d          | _        || _        d S )N      08x)tszInstanceNamesuper__init__	dwDevTyper2   _subtype_device_init_controls_set_formattszProductNameid_nameformatguidProductData1id_product_guiddevice_instance)selfdisplaydevicerP   r7   	__class__s        r9   rD   zDirectInputDevice.__init__A   s    .$'''$.5
'1F:&5%o&A&GOO.r;   c                 8    | j                                          d S N)rG   ReleaserQ   s    r9   __del__zDirectInputDevice.__del__O   s    r;   c                     | j         dd         | j         dd         z   }| j         dd         | j         dd         z   }d| d| dS )	z2Generate an SDL2 style GUID from the product guid.      r   r   r   030000000000000000000000)rO   )rQ   firstseconds      r9   get_guidzDirectInputDevice.get_guidR   s_    $QqS)D,@1,EE%ac*T-A!A#-FF9%99V9999r;   c                     g | _         | j                            t          j        | j                  d t          j                   | j                             d            d S )Nc                     | j         S rV   )r2   )cs    r9   <lambda>z2DirectInputDevice._init_controls.<locals>.<lambda>[   s     r;   )key)controlsrG   EnumObjectsr   LPDIENUMDEVICEOBJECTSCALLBACK_object_enum	DIDFT_ALLsortrX   s    r9   rH   z DirectInputDevice._init_controlsX   sY      !EdFW!X!XZ^`f`pqqq0011111r;   c                 z    t          |j                  }|r| j                            |           t          j        S rV   )r:   contentsrh   appendr   DIENUM_CONTINUE)rQ   r3   argr8   s       r9   rk   zDirectInputDevice._object_enum]   s9    !/":;; 	*M  )))%%r;   c                    | j         sd S t          j        t          | j                   z              }d}t	          || j                   D ]\  }}||_        |j        |_        |dz  }t          j                    }t          j
        |          |_        t          j
        t          j                  |_        d|_        ||_        t          |          |_        t          j        t          j        |          t          j                  |_        | j                            |           t          j                    }t          j
        |          |j        _        t          j
        |j                  |j        _        d|j        _        t          j        |j        _        dt          j
        t          j                  z  |_        | j                            t          j        t          j        |j                             d S )Nr   r   @   ) rh   r   DIOBJECTDATAFORMATlenzipdwOfsr2   r$   DIDATAFORMATctypessizeofdwSize	dwObjSizedwFlags
dwDataSize	dwNumObjscastpointerLPDIOBJECTDATAFORMATrgodfrG   SetDataFormatDIPROPDWORDdiphdwHeaderSizedwObjDIPH_DEVICEdwHowdwDataSetPropertyDIPROP_BUFFERSIZEbyref)rQ   object_formatsoffsetobject_formatr8   fmtprops          r9   rI   zDirectInputDevice._set_formatc   s   } 	F 3c$-6H6HHKK&).$-&H&H 	 	"M7"(M#*=M aKFF!##]3''
f&?@@N++K~ > >@[\\	""3'''!##!=..	!'ty!9!9		 ,	6=)<===  !96<	;R;RSSSSSr;   NFc                    | j         sd S |%t          j        j        }t          j        j        D ]} t          j        }|r|t          j        z  }n|t          j	        z  }t          j        d ddd           | _        | j                            | j                   t          j        j                            | j        | j                   | j                            |j        |           | j                                         d S NF)rh   pygletgl_shadow_windowappwindowsr   DISCL_BACKGROUNDDISCL_EXCLUSIVEDISCL_NONEXCLUSIVEr   CreateEventW_wait_objectrG   SetEventNotificationplatform_event_loopadd_wait_object_dispatch_eventsSetCooperativeLevel_hwndAcquire)rQ   window	exclusiveflagss       r9   openzDirectInputDevice.open   s    } 	F> Y-F *,  ' 	/V++EEV..E%24tLL))$*;<<<
&66t7H$J_```((u===r;   c                    | j         sd S t          j        j                            | j                   | j                                         | j                            d            t          j
        | j                   d S rV   )rh   r   r   r   remove_wait_objectr   rG   	Unacquirer   r   CloseHandlerX   s    r9   closezDirectInputDevice.close   sq    } 	F
&99$:KLLL   ))$///d/00000r;   c                     | j         S rV   )rh   rX   s    r9   get_controlszDirectInputDevice.get_controls   s
    }r;   c                    | j         sd S t          j        dz              }t          j        t          |                    }	 | j                            t          j	        t          j                  t          j
        t          j        |          t          j                  t          j        |          d           n# t          $ r Y d S w xY w|d |j                 D ]#}|j        dz  }|j        | j         |         _        $d S )Nrt   r   r   )rh   r   DIDEVICEOBJECTDATAr   DWORDrv   rG   GetDeviceDatarz   r{   r   r   LPDIDEVICEOBJECTDATAr   OSErrorvaluerx   r   )rQ   eventsn_eventseventindexs        r9   r   z"DirectInputDevice._dispatch_events   s	   } 	F+b033;s6{{++	L&&v}V5N'O'O'-{6>&3I3I393N(P (P'-|H'='='(	* * * *
  	 	 	FF	 OX^O, 	6 	6EK1$E).DM% &&	6 	6s   A:B= =
C
Cc                     t          |j        j        j        d          }| j        |k    rG| j        |j        j        k    r2| j        |j        j        dz  k    r| j	        |j        j        dz  k    rdS dS )NrA   r?   r@   TF)
rL   ro   rM   rN   rO   rK   rJ   r2   rE   rF   )rQ   guid_idrP   s      r9   matcheszDirectInputDevice.matches   su    1=CUKK G++ 8 GGG
o6@4GGG!9!Cf!LLL4ur;   r   )__name__
__module____qualname__rD   rY   rb   rH   rk   rI   r   r   r   r   r   __classcell__)rT   s   @r9   r=   r=   @   s        / / / / /  : : :2 2 2
& & &T T T8   0	1 	1 	1  6 6 6&	 	 	 	 	 	 	r;   r=   c                      t          j                    } t          j        d           }t          j        |t           j        t           j        t          j        |           d            | S rV   )	r   IDirectInput8r   GetModuleHandleWDirectInput8CreateDIRECTINPUT_VERSIONIID_IDirectInput8Wrz   r   )	_i_dinputmodule_handles     r9   _init_directinputr      s[    $&&I.t44M
m$8$7$l955"	$ $ $ r;   iUMio  i           0   c                   H    e Zd Zd Zd ZddZd Zd Zd Zdd	Z	d
 Z
d ZdS )DIDeviceManagerc                     d| _         d | _        d | _        g | _        |                     d          r|                                  d S d S )NFT)skip_warning)
registeredr   
_devnotifydevicesregister_device_eventsset_current_devicesrX   s    r9   rD   zDIDeviceManager.__init__   sY    02&&D&99 	'$$&&&&&	' 	'r;   c                 B    |                                  \  }}|| _        dS )a  Sets all currently discovered devices in the devices list.
        Be careful when using this, as this creates new device objects. Should only be called on initialization of
        the manager and if for some reason the window connection event isn't registered.
        N)_get_devicesr   )rQ   new_devices_s      r9   r   z#DIDeviceManager.set_current_devices   s$    
 **,,Q"r;   FNc                    | j         s|s't          j        j        }|st          j        j        D ]} || _        | j        t                      }t          j	        |          |_
        t          |_        t          |_        t          j        | j        j        t          j        |          t&                    | _        | j        | j        j        t.          <   d| _         | j                            |            dS |st3          j        d           dS )zRegister the first OS Window to receive events of disconnect and connection of devices.
        Returns True if events were successfully registered.
        NTzQDirectInput Device Manager requires a window to receive device connection events.F)r   r   r   r   r   r   r   r   rz   r{   	dbcc_sizer	   dbcc_devicetypeGUID_DEVINTERFACE_HIDdbcc_classguidr   RegisterDeviceNotificationWr   r   r
   r   _event_devicechange_event_handlersr   push_handlerswarningswarn)rQ   r   r   dbis       r9   r   z&DIDeviceManager.register_device_events   s     	w 1 "(*"4   DK{&355 &c 2 2&@#%:" #*"EdkFWY_YefiYjYj  mH  #I  #I?C?W+O<"&))$///t# wM"uvvvur;   c                     t           | j        j        v r| j        j        t           = t          j        | j                   d| _        d | _        d S r   )r   r   r   r   UnregisterDeviceNotificationr   r   rX   s    r9   _unregister_device_eventsz)DIDeviceManager._unregister_device_events  sD    dk999+O<,T_===r;   c                     | j         r|                                  dd l}t          |j        j                  dk    r4|j        j        D ]'}|| j        k    r|                     d|            d S (d | _        d S )Nr   T)r   r   )r   r   
pyglet.apprv   r   r   r   r   )rQ   r   existing_windows      r9   on_closezDIDeviceManager.on_close  s    ? 	-**,,,vz!""a''#):#5  "dk11//T//ZZZFF 2 r;   c                 @    | j         r|                                  d S d S rV   )r   r   rX   s    r9   rY   zDIDeviceManager.__del__  s.    ? 	-**,,,,,	- 	-r;   c                 @   t          | j                  g g t          j        d         s"	 ddlm}  |            n# t          $ r Y nw xY wfd}t                              t          j
        t          j        |          dt          j                   fS )zaEnumerate all the devices on the system.
        Returns two values: new devices, missing deviceswin32_disable_xinputr   get_xinput_guidsc                    t          | j        j        j        d          }|v rt          j        S t                    D ];}|                    ||           r#                    |           t          j        c S <t	          j	                    }t                              | j        j        t          j        |          d            t          	|| j                  }                    |           t          j        S NrA   )rL   ro   rM   rN   r   rq   listr   removeIDirectInputDevice8r   CreateDeviceguidInstancerz   r   r=   rp   )
rP   rr   r   devrS   di_dev_missing_devices_new_devices_xinput_devicesrR   s
         r9   _device_enumz2DIDeviceManager._get_devices.<locals>._device_enum/  s    _5AGOOG/))-- ,-- 2 2;;w88 2$++C000!11112 /11F""?#;#H&,W]J^J^`deee&w8PQQF'''))r;   N)r   r   r   optionspyglet.input.win32.xinputr   ImportErrorr   EnumDevicesr   DI8DEVCLASS_ALLLPDIENUMDEVICESCALLBACKDIEDFL_ATTACHEDONLY)rQ   rR   r   r  r   r  r  s    `  @@@r9   r   zDIDeviceManager._get_devices!  s      --~45 	FFFFFF"2"2"4"4   	* 	* 	* 	* 	* 	* 	* 	*& 	f4$<\JJ"$8	: 	: 	: ---s   A 
AAc                    |                                  \  }}|r5| j                            |           |D ]}|                     d|           |r5|D ]4}| j                            |           |                     d|           3d S d S )N
on_connecton_disconnect)r   r   extenddispatch_eventr   )rQ   r   missing_devicesrS   s       r9   _recheck_devicesz DIDeviceManager._recheck_devicesH  s    '+'8'8':':$_ 	:L,,,% : :##L&9999 	=) = =##F+++##OV<<<<	= 	== =r;   c                    |dk    rd S |t           k    s|t          k    rjt          j        |t          j        t
                              }|j        j        t          k    r't          j
        j                            | d           d S d S d S )Nr   r  )r   r   rz   r   POINTERr   ro   dbch_devicetyper	   r   r   r   
post_event)rQ   msgwParamlParamhdr_ptrs        r9   r   z#DIDeviceManager._event_devicechangeT  s    Q;;F&&&&4L*L*Lk&&.9J*K*KLLG/3MMM
.99$@RSSSSS NM +M*Lr;   )FNrV   )r   r   r   rD   r   r   r   r   rY   r   r  r    r;   r9   r   r      s        ' ' '# # #   B    - - -%. %. %. %.N
= 
= 
=T T T T Tr;   r   r  r  r  c                   B    e Zd ZddZdedeej                 fdZd Z	dS )DIControllerManagerNc                      | _         i  _        t          j        D ]}                     |           t          j         fd            }t          j         fd            }d S )Nc                     | j         vrH                    |           r5t          j        j                            dj         |                     d S d S d S )Nr  )_controllers_add_controllerr   r   r   r  )	di_devicerQ   s    r9   r  z0DIControllerManager.__init__.<locals>.on_connecto  si     111''	22 pJ2==dLRVRcdmRnooooo 21p pr;   c                     | j         v r=j         |          }j         | = t          j        j                            d|           d S d S )Nr  )r  r   r   r   r  )r!  _controllerrQ   s     r9   r  z3DIControllerManager.__init__.<locals>.on_disconnectu  sU    D---"/	:%i0
.99$Q\]]]]] .-r;   )_displayr  _di_managerr   r   r   )rQ   rR   rS   r  r  s   `    r9   rD   zDIControllerManager.__init__h  s    FH!) 	) 	)F  ((((			p 	p 	p 	p 
		p
 
		^ 	^ 	^ 	^ 
		^ 	^ 	^r;   rS   returnc                 @    t          |          }|r|| j        |<   |S d S rV   )_create_controllerr  )rQ   rS   
controllers      r9   r   z#DIControllerManager._add_controller|  s/    '//
 	(2Df%tr;   c                     t           j        s2t                                            t                                            t	          | j                                                  S rV   )r%  r   r   r   r   r  valuesrX   s    r9   get_controllersz#DIControllerManager.get_controllers  sN    % 	...000++---D%,,..///r;   rV   )
r   r   r   rD   r=   r   r   
Controllerr   r,  r  r;   r9   r  r  f  se        ^ ^ ^ ^(&7 HT_<U    0 0 0 0 0r;   r  c                 ,    t                       g g t          j        d         s"	 ddlm}  |            n# t
          $ r Y nw xY w fd}t                              t          j	        t          j
        |          d t          j                   S )Nr   r   r   c                 b   t          | j        j        j        d          }|v rt          j        S t	          j                    }t                              | j        j	        t          j        |          d                                t          || j                             t          j        S r   )rL   ro   rM   rN   r   rq   r   r   r   r   rz   r   rp   r=   )rP   rr   r   rS   _devicesr  rR   s       r9   r  z!get_devices.<locals>._device_enum  s    1=CUKKo%%))+--7DflSYFZFZ\`aaa)'6?;STTUUU%%r;   )r   r   r  r  r   r  r   r  r   r  r	  r
  )rR   r   r  r0  r  s   `  @@r9   get_devicesr1    s    HO>01 	BBBBBB..00OO 	 	 	D	
& 
& 
& 
& 
& 
& 
& &0 8FF 46 6 6 Os   : 
AAc                 (   t          |                                           }| j        t          j        t          j        t          j        fv rF|t          j        | |          S t          j
        d|  d|                                  d           d S d S )Nz	Warning: z (GUID: zG) has no controller mappings. Update the mappings in the Controller DB.)r   rb   r2   r   DI8DEVTYPE_JOYSTICKDI8DEVTYPE_1STPERSONDI8DEVTYPE_GAMEPADr   r-  r   r   )rS   mappings     r9   r(  r(    s    &//++,,G|2F4OQWQjkkk?67333M cf c cfoo6G6G c c c d d d d d	 lkr;   c                     | j         t          j        t          j        t          j        t          j        fv rt          j        |           S d S rV   )r2   r   r3  r4  r5  DI8DEVTYPE_SUPPLEMENTALr   Joystick)rS   s    r9   _create_joystickr:    sI    |23168 8 8 }V$$$	8 8r;   c                     t           j        s2t                                            t                                            d d t           j        D             D             S )Nc                     g | ]}||S rV   r  ).0joysticks     r9   
<listcomp>z!get_joysticks.<locals>.<listcomp>  s'     % % %# ###r;   c                 ,    g | ]}t          |          S r  )r:  r=  rS   s     r9   r?  z!get_joysticks.<locals>.<listcomp>  s!    HHH&f%%HHHr;   r%  r   r   r   r   rR   s    r9   get_joysticksrD    sc    ! ***,,,'')))% %HHK4GHHH% % % %r;   c                     t           j        s2t                                            t                                            d d t           j        D             D             S )Nc                     g | ]}||S rV   r  )r=  r)  s     r9   r?  z#get_controllers.<locals>.<listcomp>  s'     ' ' ':% %%%r;   c                 ,    g | ]}t          |          S r  )r(  rA  s     r9   r?  z#get_controllers.<locals>.<listcomp>  s!    JJJF''JJJr;   rB  rC  s    r9   r,  r,    sc    ! ***,,,'')))' 'JJk6IJJJ' ' ' 'r;   rV   )1rz   r   typingr   r   r   pyglet.libs.win32.constantsr   r   r   r	   r
   pyglet.eventr   r   pyglet.inputr   pyglet.libsr   pyglet.libs.win32r   r   r   r   r   r   pyglet.input.controllerr   pyglet.input.baser   r'   r+   r.   r:   Devicer=   r   r   GUIDr   r   register_event_typer%  r  r1  r(  r:  rD  r,  r  r;   r9   <module>rS     s     ' ' ' ' ' ' ' ' ' '< < < < < < < < < < < < < < ) ( ( ( ( (              d d d d d d d d d d d d d d ' ' ' ' ' ' / / / / / / / / / / / / 

   
      .A A A A A A A AH	 	 	 	 VVT4tUY[_aegkll GT GT GT GT GTo GT GT GTT  # #L 1 1 1  # #O 4 4 4  # #$6 7 7 7o#0 #0 #0 #0 #0+ #0 #0 #0L   >d d d% % %% % % %' ' ' ' ' 'r;   