
    f                        d Z 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 ddlmZ ddlmZ dd	lmZmZmZmZ ddlZ ej.                  d
      Ze
j2                  j4                  e
j2                  j6                  z  e
j2                  j8                  z  ZdZ ed      \  Z Z!Z"Z#dZ$ G d dee      Z% G d d
e%      Z& G d d      Z'y)zi
Touch input

Unify pointer and touch events and translate them into multi-touch
capable InputSequences.
    )divisionprint_functionunicode_literalsN)require_gi_versions)Gdk)EventSource)Timer)TouchInputEnum)XIDeviceManagerXIEventTypeXIEventMaskXIDeviceEventLogger
TouchInputi@     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dZd Zd Zd Zd Zd Zd Zd Zd Zed        Zed        Zy)InputEventSourcez7
    Setup and handle GTK or XInput device events.
    c                 h   t        j                  | dg       t        j                  |        d | _        d | _        d | _        d | _        d | _        d | _        d| _	        d| _
        d| _        t               | _        | j                  d| j                         | j                  d| j                          y )Nbutton-releaseFrealize	unrealize)r   __init__r   _gtk_handler_ids_device_manager_master_device_master_device_id_slave_devices_slave_device_ids_xi_grab_active_xi_grab_events_selected_xi_event_handledset_touch_activeconnect_on_realize_event_on_unrealize_eventselfs    4/usr/lib/python3/dist-packages/Onboard/TouchInput.pyr   zInputEventSource.__init__E   s     	T$4#56$$T* $#"!%"!%$(-%!& U 	YT-C-CD[T-E-EF    c                 H    | j                  d       | j                  d       y NF)_register_gtk_events_register_xinput_eventsr&   s    r(   cleanupzInputEventSource.cleanupa   s    !!%($$U+r)   c                 "    t               | _        y N)r!   r"   r&   s    r(   _clear_touch_activez$InputEventSource._clear_touch_activee   s     Ur)   c                 L    | j                   j                  t        |             y)7 Mark source device as actively receiving touch events N)r"   addidr'   devices     r(   set_device_touch_activez(InputEventSource.set_device_touch_activeh   s    r&z*r)   c                 0    t        |      | j                  v S )r3   )r5   r"   r6   s     r(   is_device_touch_activez'InputEventSource.is_device_touch_activel   s    &zT////r)   c                 $    | j                          y r0   )handle_realize_eventr'   	user_datas     r(   r$   z"InputEventSource._on_realize_eventp   s    !!#r)   c                 $    | j                          y r0   )handle_unrealize_eventr=   s     r(   r%   z$InputEventSource._on_unrealize_events   s    ##%r)   c                      y r0    r&   s    r(   r<   z%InputEventSource.handle_realize_eventv       r)   c                 &    | j                  d       y r+   )register_input_eventsr&   s    r(   r@   z'InputEventSource.handle_unrealize_eventz   s    ""5)r)   c                 n    || _         |s,| j                  r| j                  r| j                  d       yyyy)z
        Tell the xi event source a drag operation has started (ended)
        and we want to receive events of the whole screen.
        FN)r   r   r   _select_xi_grab_events)r'   actives     r(   grab_xi_pointerz InputEventSource.grab_xi_pointer}   s@    
  & ((''.   ) r)   c                     || _         y)zq
        Tell the xi event source to stop/continue processing of handlers for
        the current event.
        N)r    )r'   handleds     r(   set_xi_event_handledz%InputEventSource.set_xi_event_handled   s    
 ")r)   c                    | j                  d       | j                  d       | j                          |rM|r| j                  d       y | j                  d      s't        j	                  d       | j                  d       y y y )NFTz>XInput event source failed to initialize, falling back to GTK.)r,   r-   r1   _loggerwarning)r'   registeruse_gtks      r(   rE   z&InputEventSource.register_input_events   su    !!%($$U+  "))$/33D9OO %; <--d3 :	 r)   c           	      J   |rjt         j                  j                  t         j                  j                  z  t         j                  j                  z  t         j                  j
                  z  t         j                  j                  z  }| j                  r|t         j                  j                  z  }| j                  |       | j                  d| j                        | j                  d| j                        | j                  d| j                        | j                  d| j                        | j                  d| j                        | j                  d| j                         g| _        y| j"                  r*| j"                  D ]  }| j%                  |        d| _        yy)z Setup GTK event handling zbutton-press-eventbutton_release_eventzmotion-notify-eventzenter-notify-eventzleave-notify-eventztouch-eventN)r   	EventMaskBUTTON_PRESS_MASKBUTTON_RELEASE_MASKPOINTER_MOTION_MASKLEAVE_NOTIFY_MASKENTER_NOTIFY_MASK_touch_events_enabled
TOUCH_MASK
add_eventsr#   _on_button_press_event_on_button_release_event_on_motion_event_on_enter_notify_on_leave_notify_on_touch_eventr   
disconnect)r'   rP   
event_maskr5   s       r(   r,   z%InputEventSource._register_gtk_events   sa   88!mm??@!mm??@ "mm==> "mm==	>J
 ))cmm666
OOJ' 1!88:3!::<2!2241!2241!224]!113%D!" $$// (BOOB'((,% %r)   c                    d}|rt               | _        | j                  j                         r| j                  j                  d| j                         | j                  j                  d| j
                         | j                  j                  d| j                         | j                          |S d}d| _        |S | j                  rr| j                  j                  d| j                         | j                  j                  d| j
                         | j                  j                  d| j                         | j                  r7| j                  }	 | j                  j                  | |       d| _	        d| _        | j"                  r<| j"                  D ]  }	 | j                  j                  | |       ! d| _        d| _        |S # t        $ r:}t        j                  dj                  |j                  |             Y d}~d}~ww xY w# t        $ r:}t        j                  dj                  |j                  |             Y d}~d}~ww xY w)	z Setup XInput event handling Tzdevice-eventzdevice-grabzdevices-updatedFNz/Failed to unselect events for device {id}: {ex}r5   ex)r   r   is_validr#   _on_device_event_on_device_grab_on_devices_updatedselect_xinput_devicesrc   r   unselect_events	ExceptionrN   rO   formatr5   r   r   r   )r'   rP   successr7   rg   s        r(   r-   z(InputEventSource._register_xinput_events   s2   #2#4D ##,,.$$,,^-1-B-BD$$,,]-1-A-AC$$,,->-1-E-EG**,H E  '+$B = ##$$//040E0EG$$//040D0DF$$//0A040H0HJ "",,E((88vF
 '+#)-&"""11 IFI,,<<T6JI '+#)-&% ! EOO %0$*F		F$CE EE % I )4(.FIIB(GI IIs0   G H	H0HH	I0IIc                    t         j                  t         j                  z  }| j                  j	                         }t
        j                  dj                  |j                  |j                  |j                         f             	 | j                  j                  | ||       || _        |j                  | _        t         j                   t         j"                  z  t         j                  z  t         j                  z  t         j$                  z  }| j&                  r|t         j(                  z  }| j                  j+                         }t
        j                  dj                  |D cg c])  }|j                  |j                  |j                         f+ c}             |D ]   }	 | j                  j                  | ||       " || _        |D cg c]  }|j                   c}| _        y# t        $ r;}t
        j                  dj                  |j                  |             Y d}~d}~ww xY wc c}w # t        $ r:}t
        j                  dj                  |j                  |             Y d}~d}~ww xY wc c}w )z? Select pointer devices and their events we want to listen to. zlistening to XInput master: {}z-Failed to select events for device {id}: {ex}rf   Nzlistening to XInput slaves: {})r   	EnterMask	LeaveMaskr   get_client_pointerrN   inforo   namer5   get_config_stringselect_eventsrn   rO   r   r   ButtonPressMaskButtonReleaseMask
MotionMaskrZ   	TouchMask"get_client_pointer_attached_slavesr   r   )r'   rd   r7   rg   devicesds         r(   rl   z&InputEventSource.select_xinput_devices   s+   
 !** **+
%%88:5ffkk699#5579 :	;	>  ..tVZH %!' !00 223 **+ !**+ !++	,

 %%+///J&&IIK5f'.0"#  !vvqttQ-@-@-BC 0 1	2  	BFB$$224L	B &07!81!$$!8=  	>OO )#VV<> >	>&0
  B !-!'VYYR!@B BB "9s<   G+ &.H2%H7I=+	H/40H**H/7	I: 0I55I:c                 :   |rXt         j                  t         j                  z  }| j                  D ]   }	 | j                  j                  d||       " || _        y| j                  D ]  }	 | j                  j                  d|       ! || _        y# t        $ r:}t        j                  dj                  |j                  |             Y d}~d}~ww xY w# t        $ r:}t        j                  dj                  |j                  |             Y d}~d}~ww xY w)z
        Select root window events for simulating a pointer grab.
        Only called when a drag was initiated, e.g. when moving/resizing
        the keyboard.
        Nz2Failed to select root events for device {id}: {ex}rf   z4Failed to unselect root events for device {id}: {ex})r   rz   r{   r   r   rx   rn   rN   rO   ro   r5   rm   r   )r'   selectrd   r7   rg   s        r(   rG   z'InputEventSource._select_xi_grab_events"  s    $66$//0J -- FF((66tVZPF  )/% -- EE((88vFE )/% ! FOO %1%+VV%DF FF ! EOO %0$*F		F$CE EEs/   B+C	C0CC	D 0DDc                 $    | j                          y r0   )rl   )r'   r7   events      r(   rj   z InputEventSource._on_device_grab>  s    ""$r)   c                 $    | j                          y r0   )r1   r&   s    r(   rk   z$InputEventSource._on_devices_updatedA  s      "r)   c                 r   |j                   }|j                  }| j                  }t        j	                  t
        j                        rC|t        j                  k7  r0|t        j                  k7  r| j                  |       | j                  }|t        j                  v s|t        j                  k(  r| j                          y |d       |t        j                  k(  s|t        j                   k(  ry|t        j"                  k(  s|t        j$                  k(  r, |d|| j&                         || j&                  k(  sH |d       y |d|j                  | j(                         |j                  | j(                  vr	 |d       y| j+                         }|s	 |d       y	 |j-                         } |d|       |rZ|d	k7  rUd	|z  }|j.                  |z  |_        |j0                  |z  |_        |j2                  |z  |_        |j4                  |z  |_         |d
| j8                         | j8                  r|t        j                  k(  s|t        j:                  k(  rc| j<                  s| j?                  d        |d       |jA                  dd      \  }}|j2                  |z
  |_        |j4                  |z
  |_        n9|jB                  }	| jE                         }
 |d|	|
       |	dk7  r|	|
k7  r	 |d       yd| _#        |t        j                  k(  r| jI                  | |       y|t        j                  k(  s&|t        jJ                  k(  s|t        jL                  k(  r| jO                  | |       y|t        jP                  k(  r| jS                  | |       y|t        j:                  k(  r7| jU                  | |       | jF                  stW        jX                  | d|       yy|t        j"                  k(  r| j[                  | |       y|t        j$                  k(  r| j]                  | |       yy# t6        $ r Y #w xY w)z)
        Handler for XI2 events.
        N_on_device_event1z_on_device_event2 {} {}_on_device_event3z_on_device_event4 {} {}_on_device_event5_on_device_event6z_on_device_event7 {}g      ?z_on_device_event8 {}T_on_device_event9r   z_on_device_event10 {} {}_on_device_event11Fr   )/xi_type	device_id_log_event_stubrN   isEnabledForloggingDEBUGr   MotionTouchUpdate_log_device_event	log_eventHierarchyEventsDeviceChangedrl   KeyPress
KeyReleaseEnterLeaver   r   
get_windowget_scale_factorxyx_rooty_rootAttributeErrorr   ButtonReleaser   rG   get_root_coords	xid_eventget_xidr    r_   
TouchBeginTouchEndrb   ButtonPressr]   r^   r   emitr`   ra   )r'   r   
event_typer   logwinscalerxryr   xid_wins              r(   ri   z!InputEventSource._on_device_eventD  s    ]]
__	"".+,,,+111""5)..C 444222&&( ---/// ******)9d6L6LM 6 66'( )5??D<R<RS??d&<&<<'( oo#$
	((*E&.#e''E/''E/$||e3$||e3 	"D$8$89+,,,+33300++D1#$ ((A.FBllR'EGllR'EG IllnG*Iw?A~G#() "'+++!!$.;222;111;///  u-;222''e4;444))$6 ))  '7? * ;,,,!!$.;,,,!!$. -{  		s   A5P) )	P65P6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   ro   r   	source_idr   r   r   r   r   r   buttonstatesequenceget_source_devicestr)r'   r   r7   s      r(   r   z"InputEventSource._log_device_event  s    }}+"9"9"-"4"4!6 6NN  $VEOO$)OO$)MM$)OO$(LLN$)GGUWW$)LL%,,$)LL%++$)NN	% ,,.FNN,s6{:;%6r)   c                 H    t         j                   | j                  |        y r0   )rN   r   ro   msgargss     r(   r   zInputEventSource.log_event  s    jcjj$'(r)   c                      y r0   rB   r   s     r(   r   z InputEventSource._log_event_stub  rC   r)   N)F)__name__
__module____qualname____doc__r   r.   r1   r8   r:   r$   r%   r<   r@   rI   rL   rE   r,   r-   rl   rG   rj   rk   ri   r   staticmethodr   r   rB   r)   r(   r   r   @   s    G8,#+0$&*/)4!-F1f+9Z/8%#z/x<* ) )  r)   r   c                       e 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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   zS
    Unified handling of multi-touch sequences and conventional pointer input.
    d   i  Tc                     t         j                  |        i | _        d| _        d| _        d| _        d| _        d| _        t        | _	        d| _
        d| _        d| _        d| _        d| _        t               | _        y )NFr   )r   r   )r   r   _input_sequencesrZ   _multi_touch_enabled_gestures_enabled_last_event_was_touch_last_sequence_time
NO_GESTURE_gesture_gesture_begin_point_gesture_begin_time_gesture_detected_gesture_cancelled_num_tap_sequencesr	   _gesture_timerr&   s    r(   r   zTouchInput.__init__  sy    !!$' "%*"%*!%*%*"#$ "$*!#$ !&"'"##gr)   c                 \   |t         j                  k7  | _        |t         j                  k(  | _        | j                  | _        | j                  r| j                  j                          t        j                  dj                  || j                  | j                  | j
                               y)z( Call this to enable single/multi-touch zasetting touch input mode {}: touch_events_enabled={}, multi_touch_enabled={}, gestures_enabled={}N)r
   NONErZ   MULTIr   r   r   update_devicesrN   debugro   )r'   touch_inputs     r(   set_touch_input_modezTouchInput.set_touch_input_mode  s    %0N4G4G%G"%0N4H4H%H!%)%?%?  //1 , vk"88"77"446		7r)   c                 ,    t        | j                        S )z' Are any clicks/touches still ongoing? )boolr   r&   s    r(   has_input_sequenceszTouchInput.has_input_sequences  s    D))**r)   c                     | j                   S )z Was there just a touch event? )r   r&   s    r(   last_event_was_touchzTouchInput.last_event_was_touch  s    )))r)   c                 B    | j                         }|j                         S r0   )r   
get_source)r   r7   s     r(   _get_event_sourcezTouchInput._get_event_source  s    ((*  ""r)   c                     |j                         }|j                         }| j                   xs1 |t        j                  j
                  k7  xs | j                  |       S )z{
        Rely on pointer events? True for non-touch devices
        and wacom touch-screens with gestures enabled.
        )r   r   rZ   r   InputSourceTOUCHSCREENr:   )r'   r   r7   sources       r(   _can_handle_pointer_eventz$TouchInput._can_handle_pointer_event  s^    
 ((*""$--- 74447..v66	7r)   c                 &    | j                  |       S )zv
        Rely on touch events? True for touch devices
        and wacom touch-screens with gestures disabled.
        )r   r'   r   s     r(   _can_handle_touch_eventz"TouchInput._can_handle_touch_event&  s    
 11%888r)   c                 $   | j                  d| j                  | j                  |      | j                  |             | j                  |      s| j                  d       y | j                  d|j                  |j
                         |j                  t        j                  j                  k(  rcd|j
                  cxk  rdk  rNn yt               }|j                  |       d|_        d| _        | j                  d       | j                  |       y)	Nz!_on_button_press_event1 {} {} {} z_on_button_press_event2 abortz_on_button_press_event3 {} {}      TF_on_button_press_event4)r   rZ   r   r   typer   r   	EventTypeBUTTON_PRESSInputSequenceinit_from_button_eventprimaryr   _input_sequence_beginr'   widgetr   r   s       r(   r]   z!TouchInput._on_button_press_event-  s    :1155e<--e4	6
 --e4NN:;
 	6zz5<<	1::333!!  %H++E2#H).D&NN45&&x0r)   c                 *   | j                   j                  t              }| j                  d|       |`|j                  |j
                  f|_        |j                  |j                  f|_	        |j                         |_        | j                  |       y)Nr^   T)r   getPOINTER_SEQUENCEr   r   r   pointr   r   
root_pointget_timetime_input_sequence_endr   s       r(   r^   z#TouchInput._on_button_release_eventH  sv    ((,,-=>18<#(77EGG"4HN#(<<">H"'.."2HM$$X.r)   c                    | j                  |      sy | j                  j                  t              }|$|j                  t
        z  st               }d|_        |r)|j                  |       d| _	        | j                  |       yNTF)r   r   r   r   r   BUTTON123_MASKr   r   init_from_motion_eventr   _input_sequence_updater   s       r(   r_   zTouchInput._on_motion_eventT  su    --e4((,,-=>{{^+$H#H++E2).D&''1r)   c                 (    | j                  ||       yNT)on_enter_notifyr'   r   r   s      r(   r`   zTouchInput._on_enter_notifyf      VU+r)   c                 (    | j                  ||       yr  )on_leave_notifyr  s      r(   ra   zTouchInput._on_leave_notifyj  r  r)   c                    | j                  d| j                  |             |j                  }|j                         }| j	                  |       | j                  |      s| j                  d       y t        |d      r|j                  n|}t        |j                        }d| _
        |t        j                  j                  k(  rMt               }|j                  ||       t!        | j"                        dk(  rd|_        | j'                  |       y|t        j                  j(                  k(  r| j"                  j+                  |      }|y|j,                  |j.                  f|_        |j2                  |j4                  f|_        |j9                         |_        t;        j:                         |_        | j?                  |       y|t        j                  j@                  k(  rn|t        j                  jB                  k(  r	 | j"                  j+                  |      }|&|j9                         |_        | jE                  |       y)Nz_on_touch_event1 {}z_on_touch_event2 aborttouchTr   )#r   r   r   r   r8   r   hasattrr  r   r   r   r   r   TOUCH_BEGINr   init_from_touch_eventlenr   r   r   TOUCH_UPDATEr   r   r   r   r   r   r   r   r   update_timer  	TOUCH_ENDTOUCH_CANCELr   )r'   r   r   r   r7   r  r5   r   s           r(   rb   zTouchInput._on_touch_eventn  s   ,d.D.DU.KLZZ
 ((*$$V,++E2NN34&ug6E %)"222$H**5"54(()Q.#' &&x00 - 3==555,,004H#(-'9(-ell'C#',~~'7'+yy{$++H5  S]]444s}}999,,004H# % 0((2r)   c                 F   | j                  d|       | j                  |       t        | j                        dk(  }|s| j                  r|| j                  |j
                  <   | j                  s|r| j                  r| j                  rw|j                  | j                  z
  | j                  kD  rQ| j                  |      r@| j                  j                  | j                  dz  | j                  ||j                          n| j#                  |       |j                  | _	        y)z Button press/touch begin z_input_sequence_begin1 {}r   g     @@N)r   _gesture_sequence_beginr  r   r   r5   r   DELAY_SEQUENCE_BEGINr   r   GESTURE_DELAY_PAUSEcan_delay_sequence_beginr   startGESTURE_DETECTION_SPANon_delayed_sequence_beginr   deliver_input_sequence_begin)r'   r   first_sequences      r(   r   z TouchInput._input_sequence_begin  s    2H=$$X.T223q8$$19D!!(++.))!,,,,==4#;#;;#'#;#;<00: ''--d.I.IF.R.2.L.L.6H 55h?#+== r)   c                      y)z: Overloaded in LayoutView to veto delay for move buttons. TrB   r'   r   s     r(   r  z#TouchInput.can_delay_sequence_begin  s    r)   c                 Z    | j                   s||_        | j                  |       d| _        yr   )r   r   r  r   )r'   r   r   s      r(   r  z$TouchInput.on_delayed_sequence_begin  s+    %%"HN--h7&*D#r)   c                 X    | j                  d|       | j                  |       d|_        y )Nzdeliver_input_sequence_begin {}T)r   on_input_sequence_begin	deliveredr   s     r(   r  z'TouchInput.deliver_input_sequence_begin  s'    8(C$$X.!r)   c                     | j                  |       |j                  t        z  r| j                  |      s,| j                  j                          | j                  |       yy)z Pointer motion/touch update N)_gesture_sequence_updater   r  in_gesture_detection_delayr   finishon_input_sequence_updater   s     r(   r  z!TouchInput._input_sequence_update  sO    %%h/~~...x8&&())(3 9r)   c                    | j                  d|       | j                  |       | j                  j                          |j                  | j
                  v rF| j
                  |j                  = |j                  r#| j                  d|       | j                  |       | j
                  r| j                          |j                  | _
        y)z Button release/touch end z_input_sequence_end1 {}z_input_sequence_end2 {}N)r   _gesture_sequence_endr   r(  r5   r   r$  on_input_sequence_end_discard_stuck_input_sequencesr   r   r   s     r(   r   zTouchInput._input_sequence_end  s    0(;""8,""$;;$///%%hkk2!!8(C**84  //1#+== r)   c                    t        j                          dz
  }t        | j                  j                               D ]C  \  }}|j                  |k  st
        j                  dt        |      z          | j                  |= E y)a  
        Input sequence handling requires guaranteed balancing of
        begin, update and end events. There is no indication yet this
        isn't always the case, but still, at this time it seems like a
        good idea to prepare for the worst.
        -> Clear out aged input sequences, so Onboard can start from a
        fresh slate and not become terminally unresponsive.
           z"discarding expired input sequence N)r   listr   itemsr  rN   rO   r   )r'   expired_timer5   r   s       r(   r-  z)TouchInput._discard_stuck_input_sequences  sm     yy{R' !6!6!<!<!>? 	.LB##l2 Ds2w NO))"-	.r)   c                 R    |j                   | j                  z
  }|| j                  k  S )z
        Are we still in the time span where sequence begins aren't delayed
        and can't be undone after gesture detection?
        )r   r   r  )r'   r   spans      r(   r'  z%TouchInput.in_gesture_detection_delay  s)    
 }}t777d1111r)   c                 @   | j                   dk(  r<t        | _        d| _        d| _        |j
                  | _        |j                  | _        n>| j                  |      r-| j                  s!| j                  j                          d| _        | xj                   dz  c_         y )Nr   FTr   )r   r   r   r   r   r   r   r   r   r'  r   stopr   s     r(   r  z"TouchInput._gesture_sequence_begin  s    ""a'&DM%*D"&+D#(0D%'/}}D$..x8**##((*)-&1$r)   c                 ^   | j                   r|j                  t        z  r| j                  t        k(  r{|j
                  }| j                  d   |d   z
  }| j                  d   |d   z
  }||z  ||z  z   }|t        k\  r1t        | j                        }t        | _        | j                  |       y)Nr   r   T)r   r   r  r   r   r   r   DRAG_GESTURE_THRESHOLD2r  r   DRAG_GESTUREon_drag_gesture_begin)r'   r   r   dxdyd2num_touchess          r(   r&  z#TouchInput._gesture_sequence_update  s    !!>>N*==J&NNE**1-a8B**1-a8Bb27"B ,,!$"7"78 ,**;7r)   c                 .   t        | j                        dk(  r}| j                  ri| j                  }|t        k(  r:|j
                  | j                  z
  }|dk  r6| j                  | j                         n|t        k(  r| j                  d       d| _        y y )Nr   i,  r   )r  r   r   r   r   r   r   on_tap_gesturer   r9  on_drag_gesture_end)r'   r   gestureelapseds       r(   r+  z TouchInput._gesture_sequence_end!  s    t$$%*%%--j(&mmd.F.FFG#~++D,C,CD,,,Q/&'D# +r)   c                      yr+   rB   r'   r>  s     r(   r@  zTouchInput.on_tap_gesture1      r)   c                      yr+   rB   rE  s     r(   r:  z TouchInput.on_drag_gesture_begin4  rF  r)   c                      yr+   rB   rE  s     r(   rA  zTouchInput.on_drag_gesture_end7  rF  r)   c                 6    | j                  |      } ||       y)z) redirect input sequence update to self. N)_get_redir_sequencer'   r   funcs      r(   redirect_sequence_updatez#TouchInput.redirect_sequence_update:  s    ++H5Xr)   c                     | j                  |      }|j                  | j                  v r| j                  |j                  =  ||       y)z& Redirect input sequence end to self. N)rJ  r5   r   rK  s      r(   redirect_sequence_endz TouchInput.redirect_sequence_end?  s?    ++H5 ;;$///%%hkk2Xr)   c                 >   | j                   j                  |j                        }|>|j                         }d|_        d|_        d|_        || j                   |j                  <   | j                         }|j                  }|d   |d   z
  |d   |d   z
  f|_	        |S )z< Return a copy of <sequence>, managed in the target window. NFr   r   )
r   r   r5   copyinitial_active_key
active_keycancel_key_actionget_positionr   r   )r'   r   redir_sequenceposrps        r(   rJ  zTouchInput._get_redir_sequenceJ  s    ..228;;?!%]]_N04N-(,N%/4N,7ED!!."3"34 !   "1A1A?r)   N)&r   r   r   r   r  r  r  r   r   r   r   r   r   r   r   r]   r^   r_   r`   ra   rb   r   r  r  r  r  r   r-  r'  r  r&  r+  r@  r:  rA  rM  rO  rJ  rB   r)   r(   r   r     s     !&(7"+* # #
796
$5n1:"
41".2% ( 
	r)   c                   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d Zd Zd	 Zd
 Zy)r   z
    State of a single click- or touch sequence.
    On a multi-touch capable touch screen any number of
    InputSequences may be in flight simultaneously.
    NFc                    t         | _        |j                  |j                  f| _        |j
                  |j                  f| _        |j                  | _        |j                         | _
        t        j                         | _        y r0   )r   r5   r   r   r   r   r   r   r   r   r   r  r   s     r(   r   z$InputSequence.init_from_button_events  sX    +!GGUWW-
!LL%,,7 << >>+	99;r)   c                    t         | _        |j                  |j                  f| _        |j
                  |j                  f| _        |j                  | _        |j                         | _
        t        j                         | _        y r0   )r   r5   r   r   r   r   r   r   r   r   r   r  r   s     r(   r  z$InputSequence.init_from_motion_event{  sX    +!GGUWW-
!LL%,,7 ;;
 >>+	99;r)   c                 &   || _         |j                  |j                  f| _        |j                  |j
                  f| _        d| _        t        j                  j                  | _        |j                  | _        t        j                         | _        y )Nr   )r5   r   r   r   r   r   r   r   r   ModifierTypeBUTTON1_MASKr   r   r  )r'   r   r5   s      r(   r  z#InputSequence.init_from_touch_event  sd    !GGUWW-
!LL%,,7++88
 ::	99;r)   c                 (    | j                   t        k7  S r0   )r5   r   r&   s    r(   is_touchzInputSequence.is_touch  s    ww***r)   c                 ,    t        j                   |       S r0   )rQ  r&   s    r(   rQ  zInputSequence.copy  s    yyr)   c                 r    dj                  t        |       j                  t        | j                              S )Nz{}({}))ro   r   r   reprr5   r&   s    r(   __repr__zInputSequence.__repr__  s*    tDz22#DGG}. 	.r)   c                 j   dj                  t        |       j                  | j                  | j                  d   | j                  d   | j
                  d   | j
                  d   | j                  | j                  | j                  | j                  | j                  | j                  | j                        S )Nz{}(id={} point=({:.2f}, {:.2f}) root_point=({:.2f}, {:.2f}) button={} state={} event_type={} time={} primary={} delivered={} active_key={})r   r   )ro   r   r   r5   r   r   r   r   r   r   r   r$  rS  r&   s    r(   __str__zInputSequence.__str__  s      T
++

1tzz!}*DOOA,>

			r)   )r   r   r   r   r5   r   r   r   r   r   r   r  r   r$  rS  rR  rT  r   r  r  r`  rQ  rd  rf  rB   r)   r(   r   r   ]  so    
 BEJFJEDKGIJ'''+.r)   r   )(r   
__future__r   r   r   r   rQ  Onboard.Versionr   gi.repositoryr   Onboard.utilsr   Onboard.Timerr	   Onboard.definitionsr
   Onboard.XInputr   r   r   r   r   	getLoggerrN   r]  r^  BUTTON2_MASKBUTTON3_MASKr  r8  ranger   TAP_GESTUREr9  FLICK_GESTUREr   r   r   r   rB   r)   r(   <module>rt     s   ( B A   /   % - ' 06 6 
'

L
) !!..!!../!!../    
!H  [{$7 [||! |~H Hr)   