a
    V$c                     @   s  d dl mZ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mZmZmZm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 d dlmZmZmZ d dlZd dlZdd Z d	d
 Z!i Z"i Z#dZ$dZ%dd Z&dd Z'dd Z(dd Z)G dd de*Z+i Z,dd Z-dd Z.dd Z/dS )    )divisionabsolute_importwith_statementprint_functionunicode_literals)PY2
basestringbchrbordchropenpystrrangeroundstrtobytesunicodeN)CONTROLLERDEVICEADDEDCONTROLLERDEVICEREMOVED)CONTROLLERAXISMOTIONCONTROLLERBUTTONDOWNCONTROLLERBUTTONUP)
Controllerget_string_for_axisget_string_for_buttonc                  C   s  z>t jdd} tj|  W d    n1 s20    Y  W n tyP   Y n0 z>t jdd} tj|  W d    n1 s0    Y  W n ty   Y n0 zHttj	
t jjdd} tj|  W d    n1 s0    Y  W n ty   Y n0 d S )Nzrenpycontrollerdb.txtFzgamecontrollerdb.txtrb)renpyloaderloadpygame_sdl2
controlleradd_mappings	Exceptionr   ospathjoinconfig
renpy_base)f r)   renpy/display\controller.pyload_mappings%   s    ...r+   c                  C   s   t jjjsdS ztj  t  W n ty@   t j	j
  Y n0 t j	jjsz ttj D ]} t|  q\W n ty   t j	j
  Y n0 dS )z%
    Initialize gamepad support.
    N)r   gamepreferencespad_enabledr   r    initr+   r"   displaylog	exception	interface	safe_moder   	get_countstart)ir)   r)   r*   r/   :   s    



r/   i @  Fc                 C   s   t jjjsdS trdS d| |}|r.d| }|g}t jjrP|t j| n|t jj	
|d tjt jjj||dd}tj| dS )zf
    Creates an EVENTNAME event for the given state and name, and post it
    to the event queue.
    Nz	pad_{}_{}repeat_r)   F)
eventnamesr    up)r   r0   r3   keyboard_focusedignoreformatr&   map_pad_eventextendpad_bindingsgetr   eventEventcore	EVENTNAMEpygamepost)controlstaterepeatnamenamesevr)   r)   r*   
post_event]   s     

rN   c                   C   s   t rdS dS dS )zC
    Returns true if a controller exists, and False otherwise.
    TFN)controllersr)   r)   r)   r*   exists|   s    rP   c                 C   s(   | t v r$t |    t | = tj  dS )z(
    Quits the controller at index.
    N)rO   quitr   exportsrestart_interaction)indexr)   r)   r*   rQ      s    rQ   c                 C   s   t |  t| }| sdS tjd| | | f  tjj	j
dkrztjjD ]$}| |rTtjd  dS qTz|  |t| < W n ty   tjj  Y n0 tj  dS )z)
    Starts the controller at index.
    Nzcontroller: %r %r %rallz)Controller found in blocklist, not using.)rQ   r   is_controllerr   rR   	write_logget_guid_stringget_namer,   r-   r.   r&   controller_blocklist
startswithr/   rO   r"   r0   r1   r2   rS   )rT   cprefixr)   r)   r*   r6      s     "r6   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	PadEventzK
    This stores the information about a PadEvent, to trigger repeats.
    c                 C   s   || _ d | _d| _d S )Nr   )rH   rI   repeat_time)selfrH   r)   r)   r*   __init__   s    zPadEvent.__init__c                 C   sH   || _ tjj tjj | _t| j	| j d tjj
d urDtjj
  d S )NF)rI   r   r0   rD   get_timer&   controller_first_repeatr_   rN   rH   r3   
hide_mouse)r`   rI   r)   r)   r*   rB      s
    zPadEvent.eventc                 C   sh   | j tjjvrd S tjj }|| jk r,d S | jtjj | _| j|k rT|tjj | _t	| j
| j d d S )NT)rI   r   r&   controller_repeat_statesr0   rD   rb   r_   controller_repeatrN   rH   )r`   nowr)   r)   r*   rJ      s    

zPadEvent.repeatN)__name__
__module____qualname____doc__ra   rB   rJ   r)   r)   r)   r*   r^      s   
r^   c                 C   s2   t | d }|d u r$t|  }t | < || d S N)
pad_eventsrA   r^   rB   )rH   rI   per)   r)   r*   controller_event   s    ro   c                  C   s   t  D ]} |   qd S rl   )rm   valuesrJ   )rn   r)   r)   r*   periodic   s    rq   c                 C   s  | j tkrt| j dS | j tkr0t| j dS | j tkr| jtkrJd}n| jt k r\d}nd}t	
| j| jfd}||krdS |t	| j| jf< tt| j| dS | j ttfv r| j tkrd}nd}tt| j| dS | j tjtjtjtjtjtjtjfv rtjjsdS | S )z
    Processes an event and returns the same event, a new event, or None if
    the event has been processed and should be ignored.
    Nposnegzeropressrelease)typer   r6   whichr   rQ   r   value	THRESHOLDaxis_positionsrA   axisro   r   r   r   r   buttonrF   JOYAXISMOTIONJOYHATMOTIONJOYBALLMOTIONJOYBUTTONDOWNJOYBUTTONUPJOYDEVICEADDEDJOYDEVICEREMOVEDr   r&   pass_joystick_events)rM   rr   old_posprr)   r)   r*   rB      sH    








rB   )0
__future__r   r   r   r   r   renpy.compatr   r   r	   r
   r   r   r   r   r   r   r   r   r#   r   r   r   r   r   r   pygame_sdl2.controllerr   r   r   rF   r   r+   r/   rO   r{   rz   r<   rN   rP   rQ   r6   objectr^   rm   ro   rq   rB   r)   r)   r)   r*   <module>   s.   8-	