Home | History | Annotate | Download | only in virtual_touchpad
      1 #ifndef ANDROID_DVR_VIRTUAL_TOUCHPAD_EVDEV_H
      2 #define ANDROID_DVR_VIRTUAL_TOUCHPAD_EVDEV_H
      3 
      4 #include "EvdevInjector.h"
      5 #include "VirtualTouchpad.h"
      6 
      7 namespace android {
      8 namespace dvr {
      9 
     10 class EvdevInjector;
     11 
     12 // VirtualTouchpadEvdev implements a VirtualTouchpad by injecting evdev events.
     13 //
     14 class VirtualTouchpadEvdev : public VirtualTouchpad {
     15  public:
     16   static std::unique_ptr<VirtualTouchpad> Create();
     17   ~VirtualTouchpadEvdev() override {}
     18 
     19   // VirtualTouchpad implementation:
     20   status_t Attach() override;
     21   status_t Detach() override;
     22   status_t Touch(int touchpad, float x, float y, float pressure) override;
     23   status_t ButtonState(int touchpad, int buttons) override;
     24   status_t Scroll(int touchpad, float x, float y) override;
     25   void dumpInternal(String8& result) override;
     26 
     27  protected:
     28   static constexpr int kTouchpads = 2;
     29 
     30   VirtualTouchpadEvdev() {}
     31   void Reset();
     32 
     33   // Must be called only between construction (or Detach()) and Attach().
     34   inline void SetEvdevInjectorForTesting(int touchpad,
     35                                          EvdevInjector* injector) {
     36     touchpad_[touchpad].injector = injector;
     37   }
     38 
     39  private:
     40   // Per-touchpad state.
     41   struct Touchpad {
     42     // Except for testing, the |EvdevInjector| used to inject evdev events.
     43     std::unique_ptr<EvdevInjector> owned_injector;
     44 
     45     // Active pointer to |owned_injector_| or to a testing injector.
     46     EvdevInjector* injector = nullptr;
     47 
     48     // Previous (x, y) position in device space, to suppress redundant events.
     49     int32_t last_device_x;
     50     int32_t last_device_y;
     51 
     52     // Records current touch state (0=up 1=down) in bit 0, and previous state
     53     // in bit 1, to track transitions.
     54     int touches;
     55 
     56     // Previous injected button state, to detect changes.
     57     int32_t last_motion_event_buttons;
     58   };
     59   Touchpad touchpad_[kTouchpads];
     60 
     61   VirtualTouchpadEvdev(const VirtualTouchpadEvdev&) = delete;
     62   void operator=(const VirtualTouchpadEvdev&) = delete;
     63 };
     64 
     65 }  // namespace dvr
     66 }  // namespace android
     67 
     68 #endif  // ANDROID_DVR_VIRTUAL_TOUCHPAD_EVDEV_H
     69