1 /* 2 * Copyright (C) 2017-2018 Team Kodi 3 * This file is part of Kodi - https://kodi.tv 4 * 5 * SPDX-License-Identifier: GPL-2.0-or-later 6 * See LICENSES/README.md for more information. 7 */ 8 9 #pragma once 10 11 #include "Seat.h" 12 #include "input/XBMC_keysym.h" 13 #include "utils/Geometry.h" 14 #include "windowing/XBMC_events.h" 15 16 #include <cstdint> 17 18 #include <wayland-client-protocol.hpp> 19 20 namespace KODI 21 { 22 namespace WINDOWING 23 { 24 namespace WAYLAND 25 { 26 27 class IInputHandlerPointer 28 { 29 public: OnPointerEnter(std::uint32_t seatGlobalName,std::uint32_t serial)30 virtual void OnPointerEnter(std::uint32_t seatGlobalName, std::uint32_t serial) {} OnPointerLeave()31 virtual void OnPointerLeave() {} 32 virtual void OnPointerEvent(XBMC_Event& event) = 0; 33 protected: 34 ~IInputHandlerPointer() = default; 35 }; 36 37 class CInputProcessorPointer final : public IRawInputHandlerPointer 38 { 39 public: 40 CInputProcessorPointer(wayland::surface_t const& surface, IInputHandlerPointer& handler); SetCoordinateScale(std::int32_t scale)41 void SetCoordinateScale(std::int32_t scale) { m_coordinateScale = scale; } 42 43 void OnPointerEnter(CSeat* seat, 44 std::uint32_t serial, 45 const wayland::surface_t& surface, 46 double surfaceX, 47 double surfaceY) override; 48 void OnPointerLeave(CSeat* seat, 49 std::uint32_t serial, 50 const wayland::surface_t& surface) override; 51 void OnPointerMotion(CSeat* seat, std::uint32_t time, double surfaceX, double surfaceY) override; 52 void OnPointerButton(CSeat* seat, std::uint32_t serial, std::uint32_t time, std::uint32_t button, wayland::pointer_button_state state) override; 53 void OnPointerAxis(CSeat* seat, std::uint32_t time, wayland::pointer_axis axis, double value) override; 54 55 private: 56 CInputProcessorPointer(CInputProcessorPointer const& other) = delete; 57 CInputProcessorPointer& operator=(CInputProcessorPointer const& other) = delete; 58 59 std::uint16_t ConvertMouseCoordinate(double coord) const; 60 void SetMousePosFromSurface(CPointGen<double> position); 61 void SendMouseMotion(); 62 void SendMouseButton(unsigned char button, bool pressed); 63 64 wayland::surface_t m_surface; 65 IInputHandlerPointer& m_handler; 66 67 bool m_pointerOnSurface{}; 68 69 // Pointer position in *scaled* coordinates 70 CPointGen<std::uint16_t> m_pointerPosition; 71 std::int32_t m_coordinateScale{1}; 72 }; 73 74 } 75 } 76 } 77