U
    Peq                  l   @   s  d Z ddlZddlmZ ddlmZ dZdadaG dd deZ	dej
krRdZn:ddl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 dZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"e"d Z#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-e-d Z.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6d Z7d!Z8d"Z9d#Z:d$Z;d%Z<d&Z=d'Z>d(Z?d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]dSd^d_d`dadbdcd`dddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddkZ@ddddddddddddddddddddddZAeBdZCeBdZDeBdZEG dd deZeFde dS )a  
Native support for HID input from the linux kernel
==================================================

Support starts from 2.6.32-ubuntu, or 2.6.34.

To configure HIDInput, add this to your configuration::

    [input]
    # devicename = hidinput,/dev/input/eventXX
    # example with Stantum MTP4.3" screen
    stantum = hidinput,/dev/input/event2

.. note::
    You must have read access to the input event.

You can use a custom range for the X, Y and pressure values.
For some drivers, the range reported is invalid.
To fix that, you can add these options to the argument line:

* invert_x : 1 to invert X axis
* invert_y : 1 to invert Y axis
* min_position_x : X relative minimum
* max_position_x : X relative maximum
* min_position_y : Y relative minimum
* max_position_y : Y relative maximum
* min_abs_x : X absolute minimum
* min_abs_y : Y absolute minimum
* max_abs_x : X absolute maximum
* max_abs_y : Y absolute maximum
* min_pressure : pressure minimum
* max_pressure : pressure maximum
* rotation : rotate the input coordinate (0, 90, 180, 270)

For example, on the Asus T101M, the touchscreen reports a range from 0-4095 for
the X and Y values, but the real values are in a range from 0-32768. To correct
this, you can add the following to the configuration::

    [input]
    t101m = hidinput,/dev/input/event7,max_position_x=32768,max_position_y=32768

.. versionadded:: 1.9.1

    `rotation` configuration token added.

    N)MotionEvent)	ShapeRect)HIDInputMotionEventProviderHIDMotionEventc                       s0   e Zd Z fddZ fddZdd Z  ZS )r   c                    s*   | dd | dd t j|| d S )NZis_touchTZtype_idtouch)
setdefaultsuper__init__)selfargskwargs	__class__ A/tmp/pip-unpacked-wheel-xzebddm3/kivy/input/providers/hidinput.pyr	   >   s    zHIDMotionEvent.__init__c                    s   |d | _ |d | _dg| _d|krXd|krXt | _|d | j_|d | j_| jd d|krv|d | _| jd d|kr|d | _	| jd t
 | d S )	Nxypossize_wsize_hshapepressurebutton)sxsyZprofiler   r   widthheightappendr   r   r   depack)r
   r   r   r   r   r   C   s    



zHIDMotionEvent.depackc                 C   s   d| j | j| j| jf S )Nz-<HIDMotionEvent id=%d pos=(%f, %f) device=%s>)idr   r   devicer
   r   r   r   __str__T   s    zHIDMotionEvent.__str__)__name__
__module____qualname__r	   r   r"   __classcell__r   r   r   r   r   <   s   r   ZKIVY_DOC)MotionEventProvider)MotionEventFactory)Logger                                    i        0   1   2   3   4   5   6   7   8   9   :   l   E   l    E   l   @E0  )`~)1!)2@)3#)4$)5%)6^)7&)8*)9()0))-_)=+)Z	backspace)tab)qQ)wW)eE)rR)tT)r   Y)uU)iI)oO)pP)[{)]})\|)Zcapslock)aA)sS)dD)fF)gG)hH)jJ)kK)lL);:)'")znon-US-1)Zenter)shift)zZ)r   X)cC)vV)bB)nN)mM),<).>)/?)pipe)Zlctrl)r   )alt)spacebar)zalt-gr)Zcompose)Zrctrl)Znumlock)numpad7home)numpad4left)numpad1end)numpad8up)numpad5)numpad2down)numpad0insert)	numpadmul)numpaddivide)numpad9pageup)numpad6right)numpad3pagedown)numpaddecimaldelete)numpadsubstract)	numpadadd)Znumpadenter)escape)f1)f2)Zf3)Zf4)Zf5)Zf6)Zf7)Zf8)Zf9)Zf10)Zf11)Zf12)z	Alt+SysRq)Z
Screenlock)r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )print)pause)k)   r+   r,   r-   r.      r6      	   
                     r/   r0      r1   r2   r3   r4   r7            +   rB      r5       !   "   #   $   %   &   '   (         *   ,   -   .   /   r8   r9   r:   r;   r<   r=   r>   V      }   r@   rA   d   ~      a   E   G   K   O   H   L   P   R   r?   b   I   M   Q   S   J   N   `   r*   ;   <   =   >   ?   @   A   B   C   D   W   X   T   F   g   l   i   j   n   o   f   k   h   m   c   w    	 rE   rG   rI   rK   rM   rO   rQ   rS   rU   rW   rT   r   r\   r   rY   )r   r]   r   r   ctrlr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   LLHHiiiiiiir_   c                       s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
r   )min_position_xmax_position_xmin_position_ymax_position_ymin_pressuremax_pressure	min_abs_x	max_abs_x	min_abs_y	max_abs_yinvert_xinvert_yrotationc              	      s  t t| || td kr&ddlma td kr:ddlma d | _t | _|	d}|snt
d t
d d S |d | _t
d| j  |dd  D ]}|d	krq|	d
}t|dkrt
d|  q|\}}|tjkrt
d|  qzt|| j|< W n0 tk
r,   d||f }t
| Y qY nX t
d|t|f  qd| jkr^d| jd< n0| jd dkrt
d| jd  d| jd< d S )Nr   )Window)Keyboardr   z+HIDInput: Filename missing in configurationz+HIDInput: Use /dev/input/event0 for examplezHIDInput: Read event from <%s>r*   r  r[   r+   z8HIDInput: invalid parameter %s, not in key=value format.zHIDInput: unknown %s optionz%HIDInput: invalid value "%s" for "%s"zHIDInput: Set custom %s to %dr&  )r   Z        z%HIDInput: invalid rotation value ({}))r   r   r	   r'  Zkivy.core.windowr(  input_fndictdefault_rangessplitr)   errorinfolenoptionsint
ValueErrorformat)r
   r    r   argkeyvalueerrr   r   r   r	   L  s^    





 

 
z$HIDInputMotionEventProvider.__init__c              	   C   sf   | j d krd S d| _t | _g | _tj| jj	| j
t| j| j | j| jdd| _d| j_| j  d S )Nr   )queuer,  r    r.  )nametargetr   T)r,  uidcollectionsdequer;  dispatch_queue	threadingThreadr   r#   _thread_runr-  r    r.  threaddaemonstartr!   r   r   r   rG    s"    

z!HIDInputMotionEventProvider.startc                    s&  | d}| j| j| d| dj }i g i 	g ddddddddddddtt|ddtt|dd	|d
dfdd fdd 	
fdd} 	
fdd}fdd
dd t|d}t|td d	 
 }td|  t|ttd>  dt }td|\}dttD ]}	|	tkrq|d	|	> @ dkrqt|t|	 td>  dt }
td|
\}
ttD ]}|
d	|> @ dkrqt|t| td>  dt }td|\}}}}}}|tkrnd |d!||d"|td#d$|||f   q|tkrd |d%||d&|td#d'|||f   n|tkr|d(||d)|td#d*|||f   n|tkr|d+||d,|td#d-|||f   nn|tkrR|d.||d/|td#d0|||f   n6|tkr|d1||d2|td#d3|||f   qސqsd4d4dd d5	|r"|t}t|tk rƐq"ttt|t D ]B}||t d  }td6|d t }r||  n||  qڐqd S )7Nr,  r    r.  r   i   r   r$  r%  r*   r&  c                    sf   |\}}|rd| } dkr&|| |< n< dkr8|| |< n* dkrNd| | |< n dkrbd| | |< d S )N      ?r   r)  r*  r+  r   pointr9  invertZcoordsZcxcyr&  r   r   assign_coord  s    

z=HIDInputMotionEventProvider._thread_run.<locals>.assign_coordc                    s   |\}}|rd| } dkr.| |  |7  < nP dkrH| |  |7  < n6 dkrd| |  | 7  < n dkr~| |  | 7  < t dtd| d | d< t dtd| d	 | d	< d S )
Nr   r)  r*  r+  rH  g        r   r   )minmaxrI  rM  r   r   assign_rel_coord  s    zAHIDInputMotionEventProvider._thread_run.<locals>.assign_rel_coordc                    s.  |t krH|tkr,dkrd S   n|tkrF d d = n|tkr^|ttfkr^n|tkrx	  |d< n|t
kr|
} |d n|tkrd| } |d nf|tkr|d< nT|tkr|d< nB|tkr|	d< n&|tkr|d< n|tkr*|d	< d S )
Nr   xyrH  yxZorientationZblobidr   r   r   )EV_SYNSYN_MT_REPORTr   copy
SYN_REPORTEV_MSCMSC_RAWMSC_SCANABS_MT_TRACKING_IDclearABS_MT_POSITION_XABS_MT_POSITION_YABS_MT_ORIENTATIONABS_MT_BLOB_IDABS_MT_PRESSUREABS_MT_TOUCH_MAJORABS_MT_TOUCH_MINOR)tv_sectv_usecev_typeev_codeev_valueval)rN  r$  r%  l_points	normalizerJ  processrange_max_position_xrange_max_position_yrange_max_pressurerange_min_position_xrange_min_position_yrange_min_pressurer   r   process_as_multitouch  sL    







zFHIDInputMotionEventProvider._thread_run.<locals>.process_as_multitouchc           
         s  |t kr\|tkrXg dkrXd drXd= d  d7  < dd< g n*|tkr|dkrtdtd	|d
 d nn|dkrtdtd	|d
 d nF|dkr|dk rdnd}dkr|d< d  d7  < dkrd= n|tkrv|tkr.|	} |d nD|tkrXd|
 } |d n|t	kr|d< nddddddddddd
}||
 kr|rdkr|| d< d  d7  < dkrd= n:dkrd || krd= d  d7  < dd< nld|  kr2dks8n d S |tkrVtd| d S t| dtjkrldnd }| tjkrtd| d S tj|  }	|dkr
|dks|d krtj| n|d!rtjd! d"|	|t||tjff n||dkrd#|	|t||tjff |dksH|d krb|tjkrbtj| n$|d!rd!tjkrtjd! d S )$Nr   Zscrollr   r*   T_avoidr   rH  g      g     @@rS  rT  r   ZscrollupZ
scrolldownr   r   r   ZmiddleZsideextraZforwardbackZtaskr   Zpen)
i  i  i  i  i  i  i  i  iJ  i@  z HIDInput: unhandled HID code: {}r   rO  z!HIDInput: unhandled character: {}r   r  key_downkey_up)rU  rX  
startswithEV_RELrP  rQ  EV_KEYABS_XABS_YABS_PRESSUREkeyskeyboard_keysr)   warnr6  r'  Z
_modifierslowerr(  Zkeycodesr   endswithkeys_strgetremove)
re  rf  rg  rh  ri  r   rj  Zbuttonsr   Zkeycode)rN  rR  rA  r$  r%  rl  rJ  rm  range_max_abs_pressurerange_max_abs_xrange_max_abs_yrange_min_abs_pressurerange_min_abs_xrange_min_abs_yr   r   process_as_mouse_or_keyboard  s    
  










 
 

 
 zMHIDInputMotionEventProvider._thread_run.<locals>.process_as_mouse_or_keyboardc              	      sr  s2 d| d d tj | d d tj ff dd | D }| D ]}|d }zd| }|j|d krz|j|d krzW qD|| |kr d|f  |  d	|f W qD tk
r   d
|krt ||}||j	< |kr d|f  | Y qDX qDt
 d d  D ]H}||kr$| }|krd|   d|f | |= q$d S )N	mouse_posr   r   r   c                 S   s$   g | ]}d |krd|kr|d  qS )r   ru  r   ).0r   r   r   r   
<listcomp>t  s    zLHIDInputMotionEventProvider._thread_run.<locals>.process.<locals>.<listcomp>r   beginupdateru  r   )r   r'  r   r   r   r   moveKeyErrorr   r   listr  Zupdate_time_endr  )ZpointsZactivesr   tidr   )r    rA  is_multitouchr;  touchestouches_sentr   r   rm  n  sD    







z8HIDInputMotionEventProvider._thread_run.<locals>.processc                 S   s   | | t ||  S )N)float)r9  ZvminZvmaxr   r   r   rl    s    z:HIDInputMotionEventProvider._thread_run.<locals>.normalizerbi   a                                                                                                                                                                                                                                                                   zHIDMotionEvent: using <%s>r   r  r_   Fr  Tr  r  zHIDMotionEvent: z <%s> range position X is %d - %dr  r  z <%s> range position Y is %d - %dr  r  z<%s> range pressure is %d - %dr   r!  z$<%s> range ABS X position is %d - %dr"  r#  z$<%s> range ABS Y position is %d - %dZmin_abs_pressureZmax_abs_pressurez"<%s> range ABS pressure is %d - %dg      ?)r   r   r   ru  r  ) r  r;  rA  r4  boolopenfcntlZioctl
EVIOCGNAMEdecodestripr)   r1  	EVIOCGBITEV_MAXsz_lstructunpackrangeEV_ABSKEY_MAX	EVIOCGABSstruct_input_absinfo_szr^  r_  rb  r}  r~  r  readstruct_input_event_szr2  )r
   r   r,  Zdrsrt  r  fdZdevice_namebitr   Zsbitr   ZabsinfoZ	abs_valueZabs_minZabs_maxZabs_fuzzZabs_flatZabs_resdatark   ZevZinfosr   )rN  rR  r    rA  r$  r%  r  rk  rl  rJ  rm  r;  r  r  r  rn  ro  rp  r  r  r  rq  rr  rs  r&  r  r  r   rD    s   


$+&o%



 


  



  


  


  


  
    

z'HIDInputMotionEventProvider._thread_runc                 C   s   | j }t|}|d | D ]T\}}|dkr2|t_q|dkrXtjd| sntjd|  q|dkrtjd	|  q|d |= z| j \}}||| q|W n   Y nX d S )
Nr  rx  on_key_downon_keyboardry  	on_key_up)r  )r  )r  )rA  r2  r'  r  dispatchr;  popleft)r
   Zdispatch_fnrA  r   r<  r   Z
event_typer   r   r   r   r    s     
z"HIDInputMotionEventProvider.update)	r#   r$   r%   r3  r	   rG  rD  r  r&   r   r   r   r   r   C  s   =  ]r   Zhidinput)G__doc__osZkivy.input.motioneventr   Zkivy.input.shaper   __all__r'  r(  r   environr   rB  r?  r  r  Zkivy.input.providerr'   Zkivy.input.factoryr(   Zkivy.loggerr)   rU  r|  r{  r  rY  ZEV_SWZEV_LEDZEV_SNDZEV_REPZEV_FFZEV_PWRZEV_FF_STATUSr  ZEV_CNTr  rX  Z
SYN_CONFIGrV  Z
MSC_SERIALZMSC_PULSELEDZMSC_GESTURErZ  r[  ZMSC_MAXZMSC_CNTr}  r~  r  rc  rd  ZABS_MT_WIDTH_MAJORZABS_MT_WIDTH_MINORr`  r^  r_  ZABS_MT_TOOL_TYPEra  r\  rb  r  r  r  r  r  calcsizer  r  r  registerr   r   r   r   <module>   s  /
 



   J