
    foJ                         d dl mZmZmZ d dlZ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 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y)    )divisionprint_functionunicode_literalsN)AtspiStateTracker)HardwareSensorTracker)UDevTracker)Rect)	TimerOnce)RepositionMethodEnumAutoShow)Configc                       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#dZd Zd Zd Zd Zd Zd Z d Z!d Z"d$dZ#d$dZ$d Z%	 d%d Z&	 d%d!Z'	 d%d"Z(y)&r   z%
    Auto-show and hide Onboard.
    g        g333333?NFc                 p    || _         t               | _        d | _        t	        j
                         | _        y N)	_keyboardr
   _auto_show_timer_active_accessiblecollectionsOrderedDict_locks)selfkeyboards     2/usr/lib/python3/dist-packages/Onboard/AutoShow.py__init__zAutoShow.__init__;   s+    ! )"&!--/    c                 X    | j                   j                          | j                          y r   )r   stop
unlock_allr   s    r   resetzAutoShow.resetA   s    ""$r   c                 F    | j                          | j                  d       y NF)r    enabler   s    r   cleanupzAutoShow.cleanupE   s    

Er   c                 J    | j                  t        j                                y r   )enable_configis_auto_show_enabledr   s    r   updatezAutoShow.updateI   s    V0023r   c                    |rh| j                   st               | _         | j                   j                  d| j                         | j                   j                  d| j                         nf| j                   rL| j                   j                  d| j                         | j                   j                  d| j                         d | _         d | _        |r!d| _        | j                  j                          | j                  |xr t        j                                | j                  |xr t        j                                y )Nztext-entry-activatedztext-caret-movedF)_atspi_state_trackerr   connect_on_text_entry_activated_on_text_caret_moved
disconnectr   _lock_visibler   clearenable_tablet_mode_detectionr'    is_tablet_mode_detection_enabled enable_keyboard_device_detection$is_keyboard_device_detection_enabledr   r#   s     r   r#   zAutoShow.enableL   s   ,,,=,?)))11*D,I,IK))11&(A(AC (())44*D,I,IK))44&(A(AC(,D%&*D#!&DKK))@v>>@	B 	--DvBBD	Fr   c                    |r\| j                   s5t               | _         | j                   j                  d| j                         | j                   j	                          n9| j                   r&| j                   j                  d| j                         d | _         t        j                  dj                  || j                                y )Nztablet-mode-changedz"enable_tablet_mode_detection {} {})	_hw_sensor_trackerr   r,   _on_tablet_mode_changedupdate_sensor_sourcesr/   _loggerdebugformatr6   s     r   r2   z%AutoShow.enable_tablet_mode_detectiong   s    ***?*A'''//)4+G+GI
 ##99;&&''22)4+G+GI&*D#:vfd&=&=>	@r   c                 \   |rB| j                   sot               | _         | j                   j                  d| j                         n9| j                   r&| j                   j	                  d| j                         d| _         t
        j                  dj                  || j                                y)z|
        Detect if physical keyboard devices are present in the system.
        When detected, auto-show is locked.
        zkeyboard-detection-changedNz&enable_keyboard_device_detection {} {})_udev_trackerr   r,   %_on_keyboard_device_detection_changedr/   r;   r<   r=   r6   s     r   r4   z)AutoShow.enable_keyboard_device_detectionz   s    
 %%%0]"""**0>>@ !!""--0>>@ "&D>vfd&8&89	;r   c           	          G d d      }| j                   j                          | j                  j                  | |             }|j                  r|j                  j                          |d|_        n6t               |_        |j                  j                  || j                  |       ||_        ||_	        t        j                  dj                  t        |      t        | j                  j                                            y)z
        Lock showing and/or hiding the keyboard window.
        There is a separate, independent lock for each unique "reason".
        If duration is specified, automatically unlock after these number of
        seconds.
        c                       e Zd ZdZdZdZdZy)#AutoShow.lock.<locals>.AutoShowLockNT)__name__
__module____qualname__timer	lock_show	lock_hidevisibility_change r   r   AutoShowLockrC      s    EII $r   rL   Nzlock({}): {})r   r   r   
setdefaultrG   r
   start_on_lock_timerrH   rI   r;   r<   r=   reprlistkeys)r   reasondurationrH   rI   rL   locks          r   rU   zAutoShow.lock   s    	% 	% 	""${{%%fln=::JJOODJ"DJJJXt':':FC""nvd6lD1A1A1C,DE	Gr   c           	      `   d}| j                   j                  |      }|r?|j                  }|j                  r|j                  j	                          | j                   |= t
        j                  dj                  t        |      t        | j                   j                                            |S )z
        Remove a specific lock named by "reason".
        Returns the change in visibility that occurred while this lock was
        active. None for no change.
        Nzunlock({}) {})r   getrJ   rG   r   r;   r<   r=   rP   rQ   rR   )r   rS   resultrU   s       r   unlockzAutoShow.unlock   s     {{v&++Fzz

!F#ovd6lD1A1A1C,DE	G r   c                     | j                   j                         D ])  }|j                  s|j                  j                          + | j                   j	                          y)z#
        Remove all locks.
        N)r   valuesrG   r   r1   r   rU   s     r   r   zAutoShow.unlock_all   sG     KK&&( 	"Dzz

!	" 	r   c                 &    | j                  |       yr"   )rY   r   rS   s     r   rO   zAutoShow._on_lock_timer   s    Fr   c                     || j                   v S r   )r   r^   s     r   	is_lockedzAutoShow.is_locked   s    $$r   c                 ^    | j                   j                         D ]  }|j                  s y yNTF)r   r[   rH   r\   s     r   is_show_lockedzAutoShow.is_show_locked   -    KK&&( 	D~~	 r   c                 ^    | j                   j                         D ]  }|j                  s y yrb   )r   r[   rI   r\   s     r   is_hide_lockedzAutoShow.is_hide_locked   rd   r   c                     t         j                  dj                  ||f             || _        |r| j	                  d|dd       | j
                  j                          |r| j                  j                          yy)z
        Lock window permanently visible in response to the user showing it.
        Optionally freeze hiding/showing for a limited time.
        zlock_visible{} lock_visibleTN)	r;   r<   r=   r0   rU   r   r   r   stop_auto_positioning)r   rU   	thaw_times      r   rh   zAutoShow.lock_visible   sp    
 	'..i/@AB " IInit< 	""$ NN002 r   c                 ,    t        | j                        S r   )boolr   r   s    r   is_text_entry_activezAutoShow.is_text_entry_active   s    D++,,r   c                 6   t         j                  t        j                        r`dj	                  | j
                  j                         D cg c]  \  }}|j                  r| c}}      }t         j                  d|z          | j                          S c c}}w )N	locks={} zcan_hide_keyboard: )
r;   isEnabledForloggingINFOr=   r   itemsrI   inforf   )r   rS   rU   msgs       r   can_hide_keyboardzAutoShow.can_hide_keyboard   s}    -DKK4E4E4G +LFD>>   + ,  LL.45&&(((+s   B
c           	         d}d}t         j                  t        j                        rK|dj	                  | j
                  j                         D cg c]  \  }}|j                  r| c}}      z  }| j
                  rd}nt        j                         rD| j                  r| j                  j                         nd }|dj	                  |      z  }|xr |du}t        j                         rD| j                  r| j                  j                         nd }|dj	                  |      z  }|xr |du}t         j                  d|z          |S c c}}w )NT ro   Fztablet_mode={} zkeyboard_device_detected={} zcan_show_keyboard: )r;   rp   rq   rr   r=   r   rs   rH   r'   r3   r8   get_tablet_moder5   r?   is_keyboard_device_detectedrt   )r   rX   ru   rS   rU   tablet_modedetecteds          r   can_show_keyboardzAutoShow.can_show_keyboard  sJ   -;DKK4E4E4G +LFD>>   + ,,C ;;F668.. #55EEG48  (//<< -u,  ::<))  --IIK/3  5<<XFF )D(  	*S015+s   Ec                     t         j                  j                  rM| j                  j	                         s2| j
                  }|r#|j                         r| j                  |       yyyyy)z
        Show the keyboard on click of an already focused text entry
        (LP: 1078602). Do this only for single line text entries to
        still allow clicking longer documents without having onboard show up.
        N)r'   	auto_showenabledr   
is_visibler   is_single_liner-   )r   event
accessibles      r   r.   zAutoShow._on_text_caret_moved$  s_     ##~~((*00J,,.11*= /  + $r   c                 J    || _         t        |      }| j                  |       y r   )r   rl   request_keyboard_visible)r   r   actives      r   r-   z!AutoShow._on_text_entry_activated2  s"    ",j!%%f-r   c                 &    | j                  |       y r   _handle_tablet_mode_changed)r   r   s     r   r9   z AutoShow._on_tablet_mode_changed8  s    ((0r   c                 (    | j                  |        y r   r   )r   r|   s     r   r@   z.AutoShow._on_keyboard_device_detection_changed;  s    ((X6r   c                 v    |r| j                         }n| j                  dd       d}| j                  |       y )NFr   )rj   )rm   rh   r   )r   tablet_mode_activeshows      r   r   z$AutoShow._handle_tablet_mode_changed>  s;    ,,.D eq1D%%d+r   c                 ~   | j                   j                         D ]	  }||_         | j                  rd}| j	                         }| j                         }t        j                  dj                  || j                  ||             |du r|s|du r|r| j                  ||       | j                  j                          y )NTzErequest_keyboard_visible({}): lock_visible={} can_hide={} can_show={}F)r   r[   rJ   r0   rv   r}   r;   r<   r=   show_keyboardr   ri   )r   visibledelayrU   can_hidecan_shows         r   r   z!AutoShow.request_keyboard_visibleH  s     KK&&( 	-D%,D"	- G))+))+ 0vgt'9'98XN	P ed?w.
 	,,.r   c                     ||r| j                   n| j                  }|dk(  r,| j                  j                          | j	                  |       y| j                  j                  || j                  |       y)z) Begin AUTO_SHOW or AUTO_HIDE transition Nr   )SHOW_REACTION_TIMEHIDE_REACTION_TIMEr   r   _begin_transitionrN   )r   r   r   s      r   r   zAutoShow.show_keyboardd  si    = 15T,,,,  A:!!&&(""4(!!''t/E/EtLr   c                     | j                   j                  |       |r| j                   j                          | j                   j                          yr"   )r   transition_visible_toauto_positioncommit_transition)r   r   s     r   r   zAutoShow._begin_transitions  s:    ,,T2NN((*((*r   c                    | j                   }|sy|j                          |j                         }	|	j                         s| j                  ryt
        j                         }
d}d}|j                         }|j                         }|r@|j                         }|xj                  |d   z  c_
        |xj                  |d   z  c_        |
t        j                  k(  rH|j                         }|r|j                         n	t               }| j!                  ||||	|||||	      \  }}|
t        j"                  k(  r| j%                  |||	|||||      \  }}|"t        |||j                  |j                        S y)zy
        Get the alternative window rect suggested by auto-show or None if
        no repositioning is required.
        Nr      )r   invalidate_extentsget_extentsis_emptyr0   r'   get_auto_show_reposition_methodcopyget_kbd_windowget_client_offsetwhr   REDUCE_POINTER_TRAVEL	get_framer	   _find_close_positionPREVENT_OCCLUSION_find_non_occluding_position)r   viewhomelimit_rectstest_clearancemove_clearance
horizontalverticalr   acc_rectmethodxyrhwindowoffsetframeapp_rects                     r   get_repositioned_window_rectz%AutoShow.get_repositioned_window_rectz  so    ,,
%%'))+779 YY[$$&--/FDDF1IDDDF1ID )???((*E ((*"f ,,T2-5x-;^-7CDAq );;;44T208+0>0:HFDAq y1dffdff--r   c
           
         |}
t        dddd      } |j                  | }|j                         s |j                  | }g }|	rM|j                         d   |
j                  dz  z
  }|j                  |
j                  kD  rAt        ||j                               }t        ||j                         |
j                  z
        }|j                         sQ|j                  |j                         |g       |j                  ||j                         |
j                  z
  |g       |j                  ||j                  |g       |j                  ||j                         |g       |j                  ||j                         |
j                  z
  |g       d }|D ]o  }|j                  |d   |d   |j                  |      }t        |d   |d   |
j                  |
j                        |d   }||g}t!        fd|D              rm} n |Ft        |d   d   |d   d   |j                  |j                        }| j#                  ||||||||	      S |j%                         S )N
   r      r   c              3   @   K   | ]  }j                  |        y wr   )
intersects).0rcrs     r   	<genexpr>z0AutoShow._find_close_position.<locals>.<genexpr>  s     6Bq||B'6s   )r	   apply_borderr   
get_centerr   maxleftminrightappendbottomtopr   r   limit_positioncanvas_rectanyr   get_position)r   r   r   r   r   r   r   r   r   r   r   move_clearance_framerarpvpxcrresultpplrircsrhtmpr   s                         @r   r   zAutoShow._find_close_position  sG      $BB3 #X""N3  "&&&(<=B $$&q)BDD1H4BzzBDD X]]_-X^^-45$$&		2ryy{H56 		2rvvx"$$9: IIr4668,- IIr299;12 IIr2668bdd?H56  		A$$QqT1Q4%)%5%5%02B RUBqE244.A1Bx.C6#66		 ?Aq2a58TVVTVV<E44T408+0>0:HF F
 ''))r   c	                    |}	 |j                   | }
|	j                  |
      r |j                   | }
|	j                         \  }}g }|rO|j                  |
j	                         |	j
                  z
  |g       |j                  |
j                         |g       |rO|j                  ||
j                         |	j                  z
  g       |j                  ||
j                         g       g }|D ]q  }|j                  |d   |d   |j                  |      }t        |d   |d   |	j
                  |	j                        }|j                  |
      ra|j                  |       s |	j                         \  }}d }d }|D ]6  }|j                         \  }}||z
  ||z
  }}||z  ||z  z   }|||kD  s3|}|}8 ||j                         S y)Nr   r   )NN)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   vrr   r   r   chxchydminrmincxcydxdyd2s                              r   r   z%AutoShow._find_non_occluding_position  s     #X""N3== '&&7B??$DAq B		2779rtt+Q/0		288:q/*		1bffho./		1biik*+ B !((1qt)-)9)9)46 A1rttRTT2||B'IIaL! }}HCDD Bc28B"WrBw&<4"9DD <((**r   )g      ?r   )TT))rD   rE   rF   __doc__r   r   r   r0   r   r+   r8   r?   r   r    r$   r)   r#   r2   r4   rU   rY   r   rO   r`   rc   rf   rh   rm   rv   r}   r.   r-   r9   r@   r   r   r   r   r   r   r   rK   r   r   r   r   '   s     IMFM04F6@&;*GB&%3,-) D>.17,/8M @D1l 8<<*B DH3r   )
__future__r   r   r   r   Onboard.AtspiStateTrackerr   Onboard.HardwareSensorTrackerr   Onboard.UDevTrackerr   Onboard.utilsr	   Onboard.Timerr
   Onboard.definitionsr   rq   	getLoggerr;   Onboard.Configr   r'   objectr   rK   r   r   <module>r      sP   * B A  7 ? 1 * / : 
'

J
' !	wv wr   