U
    Pec:                     @   s  d Z dZddlZddlmZ ddlmZ G dd deZdejkrJdZ	n2d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Z.dZ/dZ0dZ1dZ2dZ3dZ4d Z5d!Z6d"Z7d#Z8d$Z9d%Z:d&Z;d'Z<d(Z=d)Z>e?d*Z@e?d+ZAe?d,ZBG d-d. d.eZ	eCd/e	 dS )0a  
Native support of Wacom tablet from linuxwacom driver
=====================================================

To configure LinuxWacom, add this to your configuration::

    [input]
    pen = linuxwacom,/dev/input/event2,mode=pen
    finger = linuxwacom,/dev/input/event3,mode=touch

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

You can use a custom range for the X, Y and pressure values.
On 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 minimum
* max_position_x : X maximum
* min_position_y : Y minimum
* max_position_y : Y maximum
* min_pressure : pressure minimum
* max_pressure : pressure maximum
)LinuxWacomMotionEventProviderLinuxWacomMotionEvent    N)MotionEvent)	ShapeRectc                       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__ C/tmp/pip-unpacked-wheel-xzebddm3/kivy/input/providers/linuxwacom.pyr	   %   s    zLinuxWacomMotionEvent.__init__c                    s   |d | _ |d | _dg| _d|krXd|krXt | _|d | j_|d | j_| jd d|krv|d | _| jd t	 
| d S )NxyposZsize_wZsize_hshapepressure)sxsyZprofiler   r   widthheightappendr   r   depack)r
   r   r   r   r   r   *   s    


zLinuxWacomMotionEvent.depackc                 C   s   d| j | j| j| jf S )Nz4<LinuxWacomMotionEvent id=%d pos=(%f, %f) device=%s>)idr   r   devicer
   r   r   r   __str__8   s    zLinuxWacomMotionEvent.__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  LLHHiiiiiiiQc                       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invert_xinvert_yc              	      sP  t t| || d | _t | _d| _|d}|sLt	d t	d d S |d | _t
d| j  |dd  D ]}|dkrqr|d	}t|d
krd| }t	| qr|\}}|dkr|| _qr|tjkrt	d|  qrzt|| j|< W n0 tk
r   d||f }t	| Y qrY nX d|t|f }t
| qrt
d| j  d S )Nr   ,z'LinuxWacom: No filename given in configz-LinuxWacom: Use /dev/input/event0 for exampler   z LinuxWacom: Read event from <%s>r'    =r(   z5LinuxWacom: Bad parameter%s: Not in key=value format.modezLinuxWacom: unknown %s optionz#LinuxWacom: value %s invalid for %szLinuxWacom: Set custom %s to %dzLinuxWacom: mode is <%s>)r   r   r	   input_fndictdefault_rangesrO   splitr&   errorinfolenoptionsint
ValueError)r
   r   r   argerrkeyvaluemsgr   r   r   r	      sJ    








z&LinuxWacomMotionEventProvider.__init__c                 C   sZ   | j d krd S d| _t | _tj| jt| j| j | j	| j
dd| _d| j_| j  d S )Nr   )queuerP   r   rR   )targetr   T)rP   uidcollectionsdequer_   	threadingThread_thread_runrQ   r   rR   threaddaemonstartr   r   r   r   ri      s    

z#LinuxWacomMotionEventProvider.startc           ,   	      s  | d}| d| d | dj }i g i }d}d}d}d}d}	d}
tt|dd}tt|d	d}d
} fdd}dd }zt|d}W n$ tk
r   td|  Y d S X t|t	d d
dd }td|  t|ttd>  dt }td|\}ttD ]X}|tkr2q|d|> @ dkrHqt|t| td>  dt }td|\}ttD ]}|d|> @ dkrq|t|t| td>  dt }td|\}}}}}}|tkr|d|}|d|}tdd|||f   nn|tkr<|d|}|d|}tdd |||f   n6|tkr||d!|}	|d"|}
tdd#|||f   q|qd
}d}d}d} d}!|r|t}"t|"tk rqtt|"t D ]}#|"|#t d  }$td$|$d t \}%}&}'}(})|'tkr|(tkr||kr|| }*nt }*|*||< ||*d%< |sP||*d&< | |*d'< |!|*d(< | jd)krr|!dkrr|sr||= |rd&|*krd
}q|| d
}|r|   d
}|| n|'t!kr|(t"kr|)}n|'tkr|(tkr||)||}+|rd*|+ }+|+}d+}n|'tkr@|(tkr@d*||)|| }+|r6d*|+ }+|+} d+}nH|'tkrf|(tkrf||)|	|
}!d+}n"|'tkr|(t#kr|)dkrd+}qqd S ),NrP   r_   r   rR   r   i      rJ   rK   Fc              	      s  t |  }|  D ]}|d }z| }W n* tk
rV   t ||}||j< Y nX |j|d kr~|j|d kr~|kr~q|| |kr	d|f 	| 	d|f qt  d d  D ]D}||kr̈| }|kr
|
  	d|f | |= qd S )Nr   r   r   beginupdateend)listkeysvaluesKeyErrorr   r   r   r   mover   Zupdate_time_endremove)ZpointsZactivesr   tidr   r   r_   ZtouchesZtouches_sentr   r   process   s6    



z:LinuxWacomMotionEventProvider._thread_run.<locals>.processc                 S   s   | | t ||  S N)float)r]   ZvminZvmaxr   r   r   	normalize  s    z<LinuxWacomMotionEventProvider._thread_run.<locals>.normalizerbzUnable to open %si   a                                                                                                                                                                                                                                                                    zLinuxWacom: using <%s>    rC   r'   rB   rD   rE   zLinuxWacom: z <%s> range position X is %d - %drF   rG   z <%s> range position Y is %d - %drH   rI   z<%s> range pressure is %d - %drA   r   r   r   r   Zpeng      ?T)$getrX   boolopenIOErrorr&   	exceptionfcntlZioctl
EVIOCGNAMErS   rU   	EVIOCGBITEV_MAXsz_lstructunpackrangeEV_ABSKEY_MAX	EVIOCGABSstruct_input_absinfo_szABS_XABS_YABS_PRESSUREreadstruct_input_event_szrV   EV_SYN
SYN_REPORTrQ   rO   clearEV_MSC
MSC_SERIALABS_MISC),r
   r   rP   ZdrsZl_pointsZrange_min_position_xZrange_max_position_xZrange_min_position_yZrange_max_position_yZrange_min_pressureZrange_max_pressurerJ   rK   Zreset_touchrv   ry   fdZdevice_namebitr   Zsbitr   ZabsinfoZ	abs_valueZabs_minZabs_maxZabs_fuzzZabs_flatZabs_reschangedZtouch_idZtouch_xZtouch_yZtouch_pressuredataiZevZtv_secZtv_usecZev_typeZev_codeZev_valuepvalr   ru   r   rf      s0   





 


  


  


  





z)LinuxWacomMotionEventProvider._thread_runc                 C   s0   z| j  \}}||| qW n   Y nX d S rw   )r_   popleft)r
   Zdispatch_fnZ
event_typer   r   r   r   rl     s
    z$LinuxWacomMotionEventProvider.update)	r    r!   r"   rW   r	   ri   rf   rl   r#   r   r   r   r   r      s   5 1r   Z
linuxwacom)D__doc____all__osZkivy.input.motioneventr   Zkivy.input.shaper   r   environr   rd   rb   r   r   Zkivy.input.providerr$   Zkivy.input.factoryr%   Zkivy.loggerr&   r   ZEV_KEYZEV_RELr   r   ZEV_SWZEV_LEDZEV_SNDZEV_REPZEV_FFZEV_PWRZEV_FF_STATUSr   ZEV_CNTr   r   Z
SYN_CONFIGZSYN_MT_REPORTr   ZMSC_PULSELEDZMSC_GESTUREZMSC_RAWZMSC_SCANZMSC_MAXZMSC_CNTr   r   r   r   ZABS_MT_TOUCH_MAJORZABS_MT_TOUCH_MINORZABS_MT_WIDTH_MAJORZABS_MT_WIDTH_MINORZABS_MT_ORIENTATIONZABS_MT_POSITION_XZABS_MT_POSITION_YZABS_MT_TOOL_TYPEZABS_MT_BLOB_IDZABS_MT_TRACKING_IDZABS_MT_PRESSUREr   r   r   calcsizer   r   r   registerr   r   r   r   <module>   s   



  