
nc                 @   s   d  d l  m Z m Z d  d l Z d  d l Z y d  d l m Z Wn" e k
 rf d  d l m Z Yn XGd d   d e  Z	 d S)    )ThreadLockN)Queuec               @   sm   e  Z d  Z e   Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z	 d d   Z
 d d   Z d S)GenericListenerc             C   s"   g  |  _  d |  _ t   |  _ d  S)NF)handlers	listeningr   queue)self r
   'C:\Python Projects\keyboard\_generic.py__init__   s    		zGenericListener.__init__c             C   s^   xW |  j  D]L } y | |  r# d SWq
 t k
 rU } z t j   WYd  d  } ~ Xq
 Xq
 Wd  S)N   )r   	Exception	traceback	print_exc)r	   eventhandlerer
   r
   r   invoke_handlers   s    zGenericListener.invoke_handlersc          
   C   s   |  j  j   z |  j s |  j   d |  _ t d |  j  |  _ d |  j _ |  j j   t d |  j	  |  _
 d |  j
 _ |  j
 j   n  Wd |  j  j   Xd S)zC
        Starts the listening thread if it wasn't already.
        TtargetN)lockacquirer   initr   listenZlistening_threaddaemonstartprocessZprocessing_threadrelease)r	   r
   r
   r   start_if_necessary   s    	
	z"GenericListener.start_if_necessaryc             C   s   t  d   d  S)Nz5This method should be implemented in the child class.)NotImplementedError)r	   r   r
   r
   r   pre_process_event0   s    z!GenericListener.pre_process_eventc             C   s[   |  j  d k	 s t  x? |  j  j   } |  j |  rF |  j |  n  |  j  j   q Wd S)zX
        Loops over the underlying queue of events and processes them in order.
        N)r   AssertionErrorgetr    r   	task_done)r	   r   r
   r
   r   r   3   s    zGenericListener.processc             C   s   |  j    |  j j |  d S)zv
        Adds a function to receive each event captured, starting the capturing
        process if necessary.
        N)r   r   append)r	   r   r
   r
   r   add_handler>   s    
zGenericListener.add_handlerc             C   s*   x# | |  j  k r% |  j  j |  q Wd S)z+ Removes a previously added event handler. N)r   remove)r	   r   r
   r
   r   remove_handlerF   s    zGenericListener.remove_handlerN)__name__
__module____qualname__r   r   r   r   r   r    r   r%   r'   r
   r
   r
   r   r      s   		r   )
	threadingr   r   r   	functoolsr   r   ImportErrorobjectr   r
   r
   r
   r   <module>   s   