
    fM&                         d dl Z d dlZd dlZd dl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 G d d      Zy)	    N)EventSource)GlobalKeyListenerHardwareSensorTracker)Configc                   v    e Zd ZdZdZdez   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   z7 Singleton class that keeps track of hardware sensors. )tablet-mode-changed)power-button-pressed))z#/sys/devices/platform/hp-wmi/tablet1)z6/sys/devices/platform/thinkpad_acpi/hotkey_tablet_moder
   c                     t        | d      s8t        j                  | g|i || _        | j                  j	                          | j                  S )z"
        Singleton magic.
        self)hasattrobject__new__r   	construct)clsargskwargss      ?/usr/lib/python3/dist-packages/Onboard/HardwareSensorTracker.pyr   zHardwareSensorTracker.__new__D   sA     sF#~~c;D;F;CHHH xx    c                      y)z8
        Called multiple times, don't use this.
        N r   s    r   __init__zHardwareSensorTracker.__init__M   s     	r   c                 n    t        j                  | | j                         d| _        d| _        d| _        y)z8
        Singleton constructor, runs only once.
        N)r   r   _event_names_acpid_listener_tablet_mode_key_listenerr   s    r   r   zHardwareSensorTracker.constructS   s2     	T4#4#45# !r   c                 P    t        j                  |        | j                  d       y )NF)r   cleanup_register_listenersr   s    r   r    zHardwareSensorTracker.cleanup\   s    D!  'r   c                 R    t        j                  | ||       | j                          y N)r   connectupdate_sensor_sources)r   
event_namecallbacks      r   r$   zHardwareSensorTracker.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 HardwareSensorTracker.disconnectd   sc    **4+<+<=tZ:""$ !3!3D4E4E!FLL56 "G=r   c                     | j                         }| j                  |       | j                  | j                        }| j                  |       y r#   )r)   _register_acpid_listeners_tablet_mode_event_names_register_hotkey_listenersr   registers     r   r%   z+HardwareSensorTracker.update_sensor_sourcesn   sB    %%'&&x0%%d&C&CD''1r   c                 H    | j                  |       | j                  |       y r#   )r/   r1   r2   s     r   r!   z)HardwareSensorTracker._register_listenersu   s    &&x0''1r   c                     t        | j                        |k7  r5|rt        |       | _        y | j                  j                          d | _        y y r#   )boolr   AcpidListenerstopr2   s     r   r/   z/HardwareSensorTracker._register_acpid_listenersy   sD    $$%1'4T':$$$))+'+$ 2r   c                 t   t         j                  j                  }t         j                  j                  }|s|sd}|rC| j                  s6t               | _        | j                  j                  d| j                         y y | j                  r&| j                  j                  d| j                         d | _        y )NFz	key-press)	config	auto_showtablet_mode_enter_keytablet_mode_leave_keyr   r   r$   _on_key_pressr*   )r   r3   	enter_key	leave_keys       r   r1   z0HardwareSensorTracker._register_hotkey_listeners   s    $$::	$$::	H%%%6%8"""**;8J8JK & !!""--k4;M;MN!%Dr   c                 6    || _         | j                  d|       y )Nr   )r   
emit_async)r   activs     r   set_tablet_modez%HardwareSensorTracker.set_tablet_mode   s    !-u5r   c                 B    | j                         }|| j                  S |S )z
        Return value:
            True = convertible is in tablet-mode
            False = convertible is not in tablet-mode
            None = mode unknown
        )_get_tablet_mode_stater   )r   states     r   get_tablet_modez%HardwareSensorTracker.get_tablet_mode   s(     ++-=$$$r   c                 \   t         j                  j                  }t         j                  j                  }|r||ff}n| j                  }|D ]  \  }}	 t        |dd      5 }|j                  d      }ddd       s2t        |t              rt        |      xr ||v }	nt        |j                  |            }	t        j                  dj                  |	||             |	c S  y# 1 sw Y   txY w# t        $ r1}t        j                  dj                  ||             d}Y d}~d}~ww xY w)	z
        Read the state from known system files, if available.
        Else return None.
        "sysfs" files are read from kernel memory, shouldn't be
        too expensive to do repeatedly.
        rUTF-8)encoding   NzOpening '{}' failed: {} z/read tablet_mode={} from '{}' with pattern '{}')r:   r;   tablet_mode_state_filetablet_mode_state_file_pattern_tablet_mode_state_filesopenreadIOErrorr+   debugformat
isinstancestrr6   searchr,   )
r   custom_state_filecustom_pattern
candidatesfnpatternfcontentexactives
             r   rF   z,HardwareSensorTracker._get_tablet_mode_state   s    #,,CC))HH,n=?J66J% 	KB"cG4 +ffTlG+
 gs+!']Aw'/AF!'.."9:FN$fVR9;	  + + 7>>r2FGs0   C1 C%2C1%C.	*C11	D+:'D&&D+c                 v   t         j                  j                  }t         j                  j                  }t        j                  t        j                        rT| j                  j                  |      }|dj                  ||      z  }t        j                  dj                  |             |rD|j                  |k(  r5t        j                  dj                  |             | j                  d       |rF|j                  |k(  r6t        j                  dj                  |             | j                  d       yyy)z Global hotkey press received z$, enter_keycode={}, leave_keycode={}z_on_key_press(): {}z(hotkey tablet_mode_enter_key {} receivedTz(hotkey tablet_mode_leave_key {} receivedFN)r:   r;   r<   r=   r+   isEnabledForloggingINFOr   get_key_event_stringrV   r,   keycoderD   )r   evententer_keycodeleave_keycodess        r   r>   z#HardwareSensorTracker._on_key_press   s    ((>>((>>-""77>A7>>}?LN NALL.55a89U]]m;LLC &/1  &U]]m;LLC &/1  ' <=r   N)__name__
__module____qualname____doc__r0   r   rQ   r   r   r   r    r$   r*   r%   r!   r/   r1   rD   rH   rF   r>   r   r   r   r   r   #   sg    A7-,-L ."(%722,&6
@(r   c                   4     e Zd ZdZ fdZd Zd Zd Z xZS )r7   z' Listen to events aggregated by acpid. c                 t    t         t        |           || _        d x| _        | _        | j                          y r#   )superr7   r   _sensor_tracker_exit_r_exit_wstart)r   sensor_tracker	__class__s     r   r   zAcpidListener.__init__   s/    mT+--&**t|

r   c           	      V   t        j                   t         j                  t         j                        | _        d}	 | j                  j	                  |       | j                  j                  d       t        j                         \  | _        | _        t        j                   | j"                  j$                  | j&                        | _        | j(                  j+                          y # t
        $ r8}t        j                  dj                  |t        |                   Y d }~y d }~ww xY w)Nz/var/run/acpid.socketzJFailed to connect to acpid, SW_TABLET_MODE detection disabled. ('{}': {}) F)nametarget)socketAF_UNIXSOCK_STREAM_socketr$   	Exceptionr+   warningrV   rX   setblockingospiperu   rv   	threadingThreadry   rm   _run_threadrw   )r   r]   ra   s      r   rw   zAcpidListener.start   s    }}V^^V5G5GH$	LL  $ 	  '%'WWY"dl ''T^^-D-D/3yy:  	OO * $VBB0	2
 	s   C' '	D(0.D##D(c                 (   | j                   rt        j                  | j                   dj                                | j                  j                  d       t        j                  dj                  | j                  j                                      y y )Nx   z*AcpidListener: thread stopped, is_alive={})
rv   r   writeencoder   joinr+   r,   rV   is_aliver   s    r   r8   zAcpidListener.stop   s^    <<HHT\\3::<0LLa LLE &!6!6!89; r   c                    t         j                  d       	 t        j                  | j                  | j                  gg | j                  g      \  }}}| j                  |v r| j                  j                  d      }n| j                  |v rnj                  dd      j                         D ]  }t         j                  dj                  |             |dk(  r1t         j                  d	       | j                  j                  d
       ]|dk(  r1t         j                  d       | j                  j                  d       |dk(  st         j                  d       | j                  j                  d        c| j                  j                          | j                  j                          t        j                  | j                         t        j                  | j                         t         j                  d       y )NzAcpidListener: thread startTrM   rK   replace)errorszAcpidListener: ACPI event: '{}'z#button/power PBTN 00000080 00000000zAcpidListener: power buttonr	   z'video/tabletmode TBLT 0000008A 00000001zAcpidListener: tablet_mode Truez'video/tabletmode TBLT 0000008A 00000000z AcpidListener: tablet_mode FalseFzAcpidListener: thread exit)r+   r,   selectru   r   recvdecode
splitlinesrV   rt   rB   rD   closer   rv   )r   rlwlxldatari   s         r   r   zAcpidListener._run   s   23dll'C')DLL>;JBB||r!||((.#WY?JJL @>$fUm- AALL!>?((334JKGGLL!BC((88>GGLL!CD((88?@ 2 	

12r   )	rm   rn   ro   rp   r   rw   r8   r   __classcell__)ry   s   @r   r7   r7      s    1(;!3r   r7   )r   r}   r   r   Onboard.utilsr   Onboard.GlobalKeyListenerr   re   	getLoggerr+   Onboard.Configr   r:   r   r7   r   r   r   <module>r      sT   ( 
    % 8 
'

3
4 !	p(K p(fF3 F3r   