
    f                         d dl mZ d dlmZ d dlZ ej
                  d      Zd dlmZ  e       Z	 G d de      Z
 G d d      Zy)    )EventSourceNUDevTracker)Configc                   n    e 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d Zd Zd Zd Zd Zy)r   z3 Singleton class that keeps track of UDev devices. )keyboard-detection-changedc                     t        | d      s8t        j                  | g|i || _        | j                  j	                          | j                  S )z"
        Singleton magic.
        self)hasattrobject__new__r	   	construct)clsargskwargss      5/usr/lib/python3/dist-packages/Onboard/UDevTracker.pyr   zUDevTracker.__new__#   sA     sF#~~c;D;F;CHHH xx    c                      y)z8
        Called multiple times, don't use this.
        N r	   s    r   __init__zUDevTracker.__init__,   s     	r   c                 `    t        j                  | | j                         d| _        d| _        y)z8
        Singleton constructor, runs only once.
        N)r   r   _event_names_udev_keyboard_device_detectedr   s    r   r   zUDevTracker.construct2   s)     	T4#4#45
)-&r   c                 P    t        j                  |        | j                  d       y )NF)r   cleanup_register_listenersr   s    r   r   zUDevTracker.cleanup:   s    D!  'r   c                 R    t        j                  | ||       | j                          y N)r   connectupdate_event_sources)r	   
event_namecallbacks      r   r    zUDevTracker.connect>   s     D*h7!!#r   c                     | j                  | j                        }t        j                  | ||       | j	                          |r2| j                  | j                        st
        j                  d       y y y )Nzall listeners disconnected)has_listenersr   r   
disconnectr!   _loggerinfo)r	   r"   r#   had_listenerss       r   r&   zUDevTracker.disconnectB   sc    **4+<+<=tZ:!!# !3!3D4E4E!FLL56 "G=r   c                 F    | j                         }| j                  |       y r   )r%   _register_udev_listenersr	   registers     r   r!   z UDevTracker.update_event_sourcesL   s    %%'%%h/r   c                 &    | j                  |       y r   )r+   r,   s     r   r   zUDevTracker._register_listenersP   s    %%h/r   c                     t         j                        |k7  r|r	 t        j                          _         j                  r& j                  j	                  d j
                         t        j                  j                   fd        j                          y t        j                  j                   fd        j                  j                  d j
                         d  _        d  _        y y #  d  _        Y xY w)Nueventc                 $    j                         S r   _detect_keyboard_devicesxr	   s    r   <lambda>z6UDevTracker._register_udev_listeners.<locals>.<lambda>`       $"?"?"A r   c                 $    j                         S r   r2   r4   s    r   r6   z6UDevTracker._register_udev_listeners.<locals>.<lambda>f   r7   r   )boolr   oskUDevr    _on_udev_eventconfig	auto_show/keyboard_device_detection_exceptions_notify_add _update_keyboard_device_detected2keyboard_device_detection_exceptions_notify_remover&   r   r,   s   ` r   r+   z$UDevTracker._register_udev_listenersS   s    

x'&!$DJ ::JJ&&x1D1DE  CCAC 557  FFAC 

%%h0C0CD!
15.- (&!%DJs   C3 3	C>c                 l    t         j                  dj                  |             | j                          y )Nz_on_udev_event: {})r'   debugformatr3   )r	   r   s     r   r<   zUDevTracker._on_udev_eventl   s&    *11$78%%'r   c                     | j                         }| j                          | j                         }||k7  r7t        j                  dj	                  |             | j                  d|       y y )Nz_detect_keyboard_devices: {}r   )is_keyboard_device_detectedr@   r'   rC   rD   
emit_async)r	   keyboard_detected_beforekeyboard_detecteds      r   r3   z$UDevTracker._detect_keyboard_devicesp   sd    #'#C#C#E --/ <<> 88MM8!6"346OO8:KL 9r   c                 B   d }| j                   rf| j                         }t        j                  dj	                  |             d}|D ]+  }|j
                  t        j                  j                  vs*d}- t        j                  dj	                  |             || _	        y )Nz5_update_keyboard_device_detected: keyboard_devices={}FTz6_update_keyboard_device_detected: keyboard detected={})
r   get_keyboard_devicesr'   rC   rD   idr=   r>   $keyboard_device_detection_exceptionsr   )r	   detectedkeyboard_devicesdevices       r   r@   z,UDevTracker._update_keyboard_device_detectedz   s    ::#88:MM 0!6"235 H* $99##HHI#H$
 	Nvh'	))1&r   c                     | j                   S )z
        Return value:
            True = one or more keyboard devices detected
            False = no keyboard device detected
            None = unknown
        )r   r   s    r   rF   z'UDevTracker.is_keyboard_device_detected   s     ---r   c                    | j                   r| j                   j                         }t        j                  dj	                  |             g }t        |      D ]  \  }}t               }|d   j                  dd      }|d   j                  dd      }|d   dz   |d   z   dz   |r|n|j                  d	d
      z   |_        ||_	        	 t        |d         |_        | j                  ||        |S g S # t        $ r
 d|_        Y *w xY w)Nz$get_keyboard_devices: raw_devices={}NAME" 	ID_SERIALID_VENDOR_ID:ID_MODEL_ID _ID_USB_INTERFACE_NUMr   )r   rK   r'   rC   rD   	enumerate
UDevDevicereplacerL   nameintusb_interface_num
ValueErrorappend_unique)r	   raw_devicesdevicesidrP   r`   serials           r   rK   z UDevTracker.get_keyboard_devices   s   ::**99;KMM ++16++>@ G!+. 41#y((b1;//R8~.4}-.034(.f#'<<S#9;	 #1/215K3L/MF, ""7F34" N	 " 1/0F,1s   C22DDc                     t        |      D ]>  \  }}|j                  |j                  k(  s |j                  |j                  k  r|||<    y |j                  |       y)z
        For some devices osk_udev returns duplicate entries for different USB
        interfaces. Filter those out and keep only USB interface 0.
        N)r]   rL   rb   append)r	   rf   rP   rg   rh   s        r   rd   zUDevTracker.append_unique   sZ    
 g& 	DAqttvyy ++a.A.AA!'GAJ		 	vr   N)__name__
__module____qualname____doc__r   r   r   r   r   r    r&   r!   r   r+   r<   r3   r@   rF   rK   rd   r   r   r   r   r      sV    =2L.($70062(M2".8r   c                   $    e Zd ZdZdZdZd Zd Zy)r^   rU   r   c                     dj                  t        |       j                  | j                  | j                  | j
                        S )Nz&{}(id={} name={} usb_interface_num={}))rD   typerl   rL   r`   rb   r   s    r   __str__zUDevDevice.__str__   s9    'tDz**wwyy--	r   c                 "    | j                         S r   )rs   r   s    r   __repr__zUDevDevice.__repr__   s    ||~r   N)rl   rm   rn   rL   r`   rb   rs   ru   r   r   r   r^   r^      s    	BDr   r^   )Onboard.utilsr   Onboard.oskr:   logging	getLoggerr'   Onboard.Configr   r=   r   r^   r   r   r   <module>r{      sE   ( &  
'

M
* !	]+ ]@ r   