
    fWM                     2   d dl mZmZmZ d dlZd dlZd dlmZ  e        d dlm	Z	 d dl
mZmZ d dlmZ d dlmZ d dlZ ej$                  e      Z G d d      Z G d	 d
      Z G d d      Z G d d      Z G d de      Z G d de      Z G d d      Zy)    )divisionprint_functionunicode_literalsN)require_gi_versions)Gdk)EventSourceunicode_str)UINPUT_DEVICE_NAMEc                       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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eeefZ y)XIEventTypez enum of XInput events                         	   
                                             iL  iM  iN  iO  N)!__name__
__module____qualname____doc__DeviceChangedKeyPress
KeyReleaseButtonPressButtonReleaseMotionEnterLeaveFocusInFocusOutHierarchyChangedPropertyEventRawKeyPressRawKeyReleaseRawButtonPressRawButtonRelease	RawMotion
TouchBeginTouchUpdateTouchEndTouchOwnershipRawTouchBeginRawTouchUpdateRawTouchEndDeviceAddedDeviceRemovedSlaveAttachedSlaveDetachedHierarchyEvents     0/usr/lib/python3/dist-packages/Onboard/XInput.pyr   r   &   s    !MHJKMFEEGHMKMNIJKHNMNK KMMM"M=-POrG   r   c                       e Zd ZdZdej
                  z  Zdej                  z  Zdej                  z  Z
dej                  z  Zdej                  z  Zdej                  z  Zdej"                  z  Zdej&                  z  Zdej*                  z  Zdej.                  z  Zdej2                  z  Zdej6                  z  Zdej:                  z  Zdej>                  z  Z dejB                  z  Z"dejF                  z  Z$dejJ                  z  Z&dejN                  z  Z(dejR                  z  Z*dejV                  z  Z,dejZ                  z  Z.dej^                  z  Z0dejb                  z  Z2dejf                  z  Z4e(e*z  e,z  Z5e0e2z  e4z  Z6y)XIEventMaskz enum of XInput event masks r   N)7r%   r&   r'   r(   r   r)   DeviceChangedMaskr*   KeyPressMaskr+   KeyReleaseMaskr,   ButtonPressMaskr-   ButtonReleaseMaskr.   
MotionMaskr/   	EnterMaskr0   	LeaveMaskr1   FocusInMaskr2   FocusOutMaskr3   HierarchyChangedMaskr4   PropertyEventMaskr5   RawKeyPressMaskr6   RawKeyReleaseMaskr7   RawButtonPressMaskr8   RawButtonReleaseMaskr9   RawMotionMaskr:   TouchBeginMaskr;   TouchUpdateMaskr<   TouchEndMaskr=   TouchOwnershipMaskr>   RawTouchBeginMaskr?   RawTouchUpdateMaskr@   RawTouchEndMask	TouchMaskRawTouchMaskrF   rG   rH   rJ   rJ   J   s   &!:!::!5!55L!7!77N!8!88O!:!::!3!33J!2!22I!2!22I!4!44K!5!55L!=!==!:!::!8!88O!:!::!;!;;!=!==!6!66M!7!77N!8!88O!5!55L!;!;;!:!::!;!;;!8!88O*+,()I ../+,LrG   rJ   c                   $    e Zd ZdZdZdZdZdZdZy)XIDeviceTypez enum of XInput device types r   r   r   r   r   N)	r%   r&   r'   r(   MasterPointerMasterKeyboardSlavePointerSlaveKeyboardFloatingSlaverF   rG   rH   rf   rf   m   s    'MNLMMrG   rf   c                       e Zd ZdZdZy)XITouchModer   r   N)r%   r&   r'   DirectTouchDependentTouchrF   rG   rH   rm   rm   v   s    KNrG   rm   c                       e Zd ZdZdedf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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&d$Z&y%)'XIDeviceManagerz*
    XInput device manager singleton.
    zVirtual core XTEST keyboardzPower ButtonzVirtual core XTEST pointerc                     t        | d      s8t        j                  | g|i || _        | j                  j	                          | j                  S )z"
        Singleton magic.
        self)hasattrobject__new__rs   	construct)clsargskwargss      rH   rv   zXIDeviceManager.__new__   sA     sF#~~c;D;F;CHHH xxrG   c                      y)zs
        Called multiple times, do not use. In particular don't
        call base class constructors here.
        NrF   rs   s    rH   __init__zXIDeviceManager.__init__   s    
 	rG   c                    t        j                  | g d       i | _        d| _        	 t	        j
                  | j                        | _        d| _        d| _        g | _        t               | _        | j!                         r| j#                          yy# t        $ r+}t        j                  dt        |      z          Y d}~ud}~ww xY w)z8
        Singleton constructor, runs only once.
        )device-eventdevice-grabdevices-updatedN)event_handlerzFailed to create osk.Devices: )r   r}   _devices_osk_devicesoskDevices_on_device_event	Exception_loggerwarningr	   _last_motion_device_id_last_click_device_id_last_device_blacklist_idsset_grabbed_devices_idsis_validupdate_devices)rs   exs     rH   rw   zXIDeviceManager.construct   s     	T $7 	8  	- #,0,A,A!CD '+#%)"*,'$'E!==?!   	-OO<'O, - -	-s   %B 	C!CCc                     | j                   d uS N)r   r|   s    rH   r   zXIDeviceManager.is_valid   s    $$,,rG   c                 8    | j                   j                  |      S r   )r   getrs   	device_ids     rH   lookup_device_idz XIDeviceManager.lookup_device_id   s    }}  ++rG   c                 \    | j                         D ]  }|j                         |k(  s|c S  y r   )get_pointer_devicesget_config_string)rs   device_config_stringdevices      rH   lookup_config_stringz$XIDeviceManager.lookup_config_string   s1    ..0 	F'')-AA	rG   c                 X    | j                   j                         }| j                  |      S )z Return client pointer device )r   get_client_pointerr   r   s     rH   r   z"XIDeviceManager.get_client_pointer   s'    %%88:	$$Y//rG   c                 \    | j                         }|j                  }| j                  |      S )z Return client keyboard device )r   
attachmentr   )rs   client_pointerr   s      rH   get_client_keyboardz#XIDeviceManager.get_client_keyboard   s,    002"--	$$Y//rG   c                 6    | j                   j                         S r   )r   valuesr|   s    rH   get_deviceszXIDeviceManager.get_devices   s    }}##%%rG   c                 |    | j                   j                         D cg c]  }|j                         r| c}S c c}w r   )r   r   
is_pointerrs   r   s     rH   r   z#XIDeviceManager.get_pointer_devices   s:    %)]]%9%9%; (6$$&  ( 	( (   9c                     | j                         }| j                         D cg c]-  }|j                         s|j                  |j                  k(  r|/ c}S c c}w )zR
        All slaves of the client pointer, with and without device grabs.
        )r   r   	is_masterr   id)rs   r   r   s      rH   get_client_pointer_slavesz)XIDeviceManager.get_client_pointer_slaves   sZ     002%)%=%=%? ;6'')$$(9(99  ; 	; ;   2Ac                     | j                         }|D cg c]&  }|j                         r| j                  |      s|( }}|S c c}w )zK
        Slaves that are currently attached to the client pointer.
        )r   is_floating
is_grabbedrs   devicesds      rH   "get_client_pointer_attached_slavesz2XIDeviceManager.get_client_pointer_attached_slaves   sP     002% AQ]]_-1__Q-?  A AA
   AAc                 |    | j                   j                         D cg c]  }|j                         r| c}S c c}w r   )r   r   is_keyboardr   s     rH   get_keyboard_devicesz$XIDeviceManager.get_keyboard_devices   s:    %)]]%9%9%; )6%%'  ) 	) )r   c                     | j                         }| j                         D cg c]-  }|j                         s|j                  |j                  k(  r|/ c}S c c}w )zs
        All slaves of the keyboard paired with the client pointer,
        with and without device grabs.
        )r   r   r   r   r   )rs   client_keyboardr   s      rH   get_client_keyboard_slavesz*XIDeviceManager.get_client_keyboard_slaves   sZ    
 224%)%>%>%@ <6'')$$(:(::  < 	< <r   c                     | j                         }|D cg c]&  }|j                         r| j                  |      s|( }}|S c c}w )zl
        Slaves that are currently attached to the keyboard paired
        with the client pointer.
        )r   r   r   r   s      rH   #get_client_keyboard_attached_slavesz3XIDeviceManager.get_client_keyboard_attached_slaves   sP    
 113% AQ]]_-1__Q-?  A AAr   c                 h    | j                         D cg c]  }|j                         r| c}S c c}w r   )r   r   r   s     rH   get_master_pointer_devicesz*XIDeviceManager.get_master_pointer_devices   s6    %)%=%=%? '6##%  ' 	' 's   /c           
         i }g | _         | j                  j                         D ]  }t               }| |_        |\  |_        |_        |_        |_        |_	        |_
        |_        |_        t        j                  |j
                  |j                  |j                        |_        t        j                   j"                  dk(  rt%        |j
                        |_        |j
                  | j&                  vr|||j                  <   |j
                  | j(                  v s| j                   j+                  |j                           || _        d | _        d | _        | j3                  d       y )Nr   r   )r   r   listXIDevice_device_managernamer   user   enabledvendorproduct
touch_modeclassify_sourcesourcesysversion_infomajorr	   	blacklistlast_device_blacklistappendr   r   r   emit)rs   r   infor   s       rH   r   zXIDeviceManager.update_devices   s0   *,'%%**, 	BDZF%)F" 		
!!$44V[[&**5;5F5FHFM %%*)&++6;;$..0%+		"{{d888//66vyyA/	B2  %)"&*# 			#$rG   c                     |d}n|j                         }|sy| j                  j                  ||j                  |       yNr   FT)get_xidr   select_eventsr   )rs   windowr   maskxids        rH   r   zXIDeviceManager.select_events  s=    >C.."C''VYY=rG   c                     |d}n|j                         }|sy| j                  j                  ||j                         yr   )r   r   unselect_eventsr   )rs   r   r   r   s       rH   r   zXIDeviceManager.unselect_events)  s;    >C.."C))#vyy9rG   c                 <    | j                  |j                  |       y r   )attach_device_idr   )rs   r   	master_ids      rH   attach_devicezXIDeviceManager.attach_device4  s    fii3rG   c                 :    | j                  |j                         y r   )detach_device_idr   r   s     rH   detach_devicezXIDeviceManager.detach_device7  s    fii(rG   c                 <    | j                   j                  ||       y r   )r   attach)rs   r   r   s      rH   r   z XIDeviceManager.attach_device_id:  s      I6rG   c                 :    | j                   j                  |       y r   )r   detachr   s     rH   r   z XIDeviceManager.detach_device_id=  s      +rG   c                 `    | j                  |j                         | j                  d|d       y )Nr   T)grab_device_idr   r   r   s     rH   grab_devicezXIDeviceManager.grab_device@  s$    FII&		-.rG   c                 `    | j                  |j                         | j                  d|d       y )Nr   F)ungrab_device_idr   r   r   s     rH   ungrab_devicezXIDeviceManager.ungrab_deviceD  s$    fii(		-/rG   c                 2    |j                   | j                  v S r   )r   r   r   s     rH   r   zXIDeviceManager.is_grabbedH  s    yyD5555rG   c                     | j                   j                  |d       || j                  vsJ | j                  j                  |       y )Nr   )r   r   r   addr   s     rH   r   zXIDeviceManager.grab_device_idK  s@    %%i3 9 99:9!!%%i0rG   c                 p    | j                   j                  |       | j                  j                  |       y r   )r   discardr   r   r   s     rH   r   z XIDeviceManager.ungrab_device_idQ  s*    !!)))4''	2rG   c                 B    | j                   }|y | j                  |      S r   )r   r   rs   r   s     rH   get_last_click_devicez%XIDeviceManager.get_last_click_deviceU  s&    '':$$R((rG   c                 B    | j                   }|y | j                  |      S r   )r   r   r   s     rH   get_last_motion_devicez&XIDeviceManager.get_last_motion_device[  s&    ((:$$R((rG   c                    |j                   }|j                  }|j                  }|t        j                  v s|t        j
                  k(  r| j                          |r| j                  |      }|syd}|j                  |       	 || j                  vrH|t        j                  k(  r|| _        n-|t        j                  k(  s|t        j                  k(  r|| _        | j                   d   D ]  }t#        j"                  |      } ||       ! y)z)
        Handler for XI2 events.
        Nr   )xi_typer   	source_idr   rE   r)   r   r   set_source_device_disguise_as_touch_eventr   r.   r   r,   r:   r   
_callbackscopy)rs   event
event_typer   r   source_devicecallbackevs           rH   r   z XIDeviceManager._on_device_eventa  s     ]]
OO	OO	 444222!  11)<M  M.  D;;;[///.7+{666{555-6* 7 	H5!BRL	rG   c                    | j                  |j                        }d|_        t        j                  j
                  |_        t        j                  |_	        |j                  t        j                  k(  r^|j                  t        j                  j                  t        j                  j                   z  t        j                  j"                  z  z  sy|s|j                  t        j$                  k(  r4t        j&                  |_
        t        j(                  j*                  |_        |j                  t        j.                  k(  r4t        j0                  |_
        t        j(                  j2                  |_        |j                  t        j                  k(  r4t        j4                  |_
        t        j(                  j6                  |_        d|_        d|_        y)aT  
        Disguise a pointer event as touch event.
        For debugging purposes only.

        Set wacom_mode=True to simulate pointer events coming
        from a "touch screen" device that only sends pointer events.
        This is the default case for wacom touch screens due to
        gestures being enabled, see LP #1297692.
        zTouch-ScreenFr   r   T)r   r   r   r   InputSourceTOUCHSCREENr   rm   rn   r   r   r   r.   stateModifierTypeBUTTON1_MASKBUTTON2_MASKBUTTON3_MASKr,   r:   	EventTypeTOUCH_BEGINtyper-   r<   	TOUCH_ENDr;   TOUCH_UPDATEsequencebutton)rs   r  
wacom_moder   s       rH   r   z(XIDeviceManager._disguise_as_touch_event  s;    &&u7,!oo99)55==K...{{c..;; # 0 0 = => # 0 0 = => ? }} 7 77 + 6 6 ]]66
}} 9 99 + 4 4 ]]44
}} 2 22 + 7 7 ]]77
ENrG   N)F)'r%   r&   r'   r(   r
   r   r   rv   r}   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rF   rG   rH   rq   rq   {   s     /#!I :"2-,
0
0&(;)<'#%J		4)7,/0613))(T$rG   rq   c                   ~    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ed        Zd Zd Zd	 Zd
 Zd Zd Zy)r   z 
    XInput device wrapper.
    Nc           	          dj                  t        |       j                  t        | j                        t        | j
                        t        | j                        t        | j                              S )Nz-{}(id={}, attachment={}, name={}, source={} ))formatr  r%   reprr   r   r   r   r|   s    rH   __repr__zXIDevice.__repr__  sN    >T
++TWWT__-TYYT[[)		rG   c                 ,   dj                  t        |       j                  | j                  | j                  | j
                  | j                  | j                         j                  | j                  | j                  | j                  | j                  
      S )Nzj{}(id={} attachment={} use={} touch_mode={} source={} name={} vendor=0x{:04x} product=0x{:04x} enabled={}))r  r  r%   r   r   r   r   
get_source
value_namer   r   r   r   r|   s    rH   __str__zXIDevice.__str__  sj    >T
++)44		
	rG   c                     | j                   S )zS
        Return Gdk.InputSource for compatibility with Gtk event handling.
        )r   r|   s    rH   r  zXIDevice.get_source  s     {{rG   c                 x   |t         j                  k(  s|t         j                  k(  rt        j                  j
                  }|S |t         j                  k(  rM|rK|t        j                  k(  rt        j                  j                  }|S t        j                  j                  }|S t        | j                               } d| v rt        j                  j                  }|S d| v rt        j                  j                  }|S d| v sd| v rt        j                  j                  }|S t        j                  j                   }|S )z
        Determine the source type (Gdk.InputSource) of the device.
        Logic taken from GDK, gdk/x11/gdkdevicemanager-xi2.c
        erasercursorwacompen)rf   rh   rj   r   r	  KEYBOARDri   rm   rn   r
  TOUCHPADr	   lowerERASERCURSORPENMOUSE)r   r   r   input_sources       rH   r   zXIDevice.classify_source  s    ,---,,,,??33L$ # L---[444"::   #77  tzz|,D4"55  T!"55  D$"22   #44rG   c                 P    | j                   t        j                  j                  k(  S )z&
        Touch screen device?
        )r   r   r	  r
  r|   s    rH   is_touch_screenzXIDevice.is_touch_screen  s     {{coo9999rG   c                 z    | j                   t        j                  k(  xs | j                   t        j                  k(  S )z*
        Is this a master device?
        )r   rf   rg   rh   r|   s    rH   r   zXIDevice.is_master  s2     xx<555 7xx<666	7rG   c                 z    | j                   t        j                  k(  xs | j                   t        j                  k(  S )z+
        Is this device a pointer?
        )r   rf   rg   ri   r|   s    rH   r   zXIDevice.is_pointer
  s2     xx<555 5xx<444	5rG   c                 z    | j                   t        j                  k(  xs | j                   t        j                  k(  S )z,
        Is this device a keyboard?
        )r   rf   rh   rj   r|   s    rH   r   zXIDevice.is_keyboard  s2     xx<666 6xx<555	6rG   c                 <    | j                   t        j                  k(  S )z*
        Is this device detached?
        )r   rf   rk   r|   s    rH   r   zXIDevice.is_floating  s     xx<5555rG   c                 d    dj                  | j                  | j                  | j                        S )zY
        Get a configuration string for the device.
        Format: VID:PID:USE

        z{:04X}:{:04X}:{!s})r  r   r   r   r|   s    rH   r   zXIDevice.get_config_string  s+     $**4;;+/<<+/885 	5rG   )r%   r&   r'   r(   r   r   r   r   r   r   r   r   r   r   r  r   r  staticmethodr   r0  r   r   r   r   r   rF   rG   rH   r   r     s|     DBCJGFGFJO  6:75665rG   r   c                   <    e Zd ZdZd Zd Zed        Zed        Zy)XIDeviceEventLoggerza
    Facilities for logging device events.
    Has little overhead when logging is disabled.
    c                 n    t         j                  t        j                        s| j                  | _        y y r   )r   isEnabledForloggingDEBUG_log_event_stub	log_eventr|   s    rH   r}   zXIDeviceEventLogger.__init__.  s&    ##GMM2!11DN 3rG   c                    |j                   t        j                  t        j                  fvr| j	                  dj                  |j                  |j                  |j                   |j                  | j                         |j                  |j                  |j                  |j                  |j                  |j                  |j                                |j#                         }| j	                  dt%        |      z          y y )NzzDevice event: dev_id={} src_id={} xi_type={} xid_event={}({}) x={} y={} x_root={} y_root={} button={} state={} sequence={}zSource device: )r   r   r;   r.   r>  r  r   r   	xid_eventr   xyx_rooty_rootr  r  r  get_source_devicestr)rs   r  r   s      rH   _log_device_eventz%XIDeviceEventLogger._log_device_event2  s    }}+"9"9"-"4"4!6 6NN  $VEOO$)OO$)MM$)OO$(LLN$)GGUWW$)LL%,,$)LL%++$)NN	% ,,.FNN,s6{:;%6rG   c                 H    t         j                   | j                  |        y r   )r   r  r  msgry   s     rH   r>  zXIDeviceEventLogger.log_eventG  s    jcjj$'(rG   c                      y r   rF   rI  s     rH   r=  z#XIDeviceEventLogger._log_event_stubK  s    rG   N)	r%   r&   r'   r(   r}   rG  r6  r>  r=  rF   rG   rH   r8  r8  (  s9    
2<* ) )  rG   r8  )
__future__r   r   r   r   r  Onboard.Versionr   gi.repositoryr   Onboard.utilsr   r	   Onboard.definitionsr
   Onboard.oskr   r;  	getLoggerr%   r   r   rJ   rf   rm   rq   ru   r   r8  rF   rG   rH   <module>rS     s   ( B A 
  6   & ; 5  
'

H
%!Q !QH!, !,F  
tk tn	t5v t5l% %rG   