#pragma once #include #include #include "WaylandProtocol.hpp" #include "tablet-v2.hpp" #include "../helpers/math/Math.hpp" #include class CTablet; class CTabletTool; class CTabletPad; class CEventLoopTimer; class CTabletSeat; class CWLSurfaceResource; class CTabletPadStripV2Resource { public: CTabletPadStripV2Resource(SP resource_, uint32_t id); bool good(); uint32_t m_id = 0; private: SP m_resource; friend class CTabletSeat; friend class CTabletPadGroupV2Resource; friend class CTabletV2Protocol; }; class CTabletPadRingV2Resource { public: CTabletPadRingV2Resource(SP resource_, uint32_t id); bool good(); uint32_t m_id = 0; private: SP m_resource; friend class CTabletSeat; friend class CTabletPadGroupV2Resource; friend class CTabletV2Protocol; }; class CTabletPadGroupV2Resource { public: CTabletPadGroupV2Resource(SP resource_, size_t idx); bool good(); void sendData(SP pad, SP group); size_t m_idx = 0; private: SP m_resource; friend class CTabletSeat; friend class CTabletPadV2Resource; friend class CTabletV2Protocol; }; class CTabletPadV2Resource { public: CTabletPadV2Resource(SP resource_, SP pad_, SP seat_); bool good(); void sendData(); std::vector> m_groups; WP m_pad; WP m_seat; bool m_inert = false; // removed was sent private: SP m_resource; void createGroup(SP group, size_t idx); friend class CTabletSeat; friend class CTabletV2Protocol; }; class CTabletV2Resource { public: CTabletV2Resource(SP resource_, SP tablet_, SP seat_); bool good(); void sendData(); WP m_tablet; WP m_seat; bool m_inert = false; // removed was sent private: SP m_resource; friend class CTabletSeat; friend class CTabletV2Protocol; }; class CTabletToolV2Resource { public: CTabletToolV2Resource(SP resource_, SP tool_, SP seat_); ~CTabletToolV2Resource(); bool good(); void sendData(); void queueFrame(); void sendFrame(bool removeSource = true); bool m_current = false; WP m_lastSurf; WP m_tool; WP m_seat; wl_event_source* m_frameSource = nullptr; bool m_inert = false; // removed was sent private: SP m_resource; friend class CTabletSeat; friend class CTabletV2Protocol; }; class CTabletSeat { public: CTabletSeat(SP resource_); bool good(); void sendData(); std::vector> m_tools; std::vector> m_pads; std::vector> m_tablets; void sendTool(SP tool); void sendPad(SP pad); void sendTablet(SP tablet); private: SP m_resource; WP m_self; friend class CTabletV2Protocol; }; class CTabletV2Protocol : public IWaylandProtocol { public: CTabletV2Protocol(const wl_interface* iface, const int& ver, const std::string& name); virtual void bindManager(wl_client* client, void* data, uint32_t ver, uint32_t id); void registerDevice(SP tablet); void registerDevice(SP tool); void registerDevice(SP pad); void unregisterDevice(SP tablet); void unregisterDevice(SP tool); void unregisterDevice(SP pad); void recheckRegisteredDevices(); // Tablet tool events void pressure(SP tool, double value); void distance(SP tool, double value); void rotation(SP tool, double value); void slider(SP tool, double value); void wheel(SP tool, double value); void tilt(SP tool, const Vector2D& value); void up(SP tool); void down(SP tool); void proximityIn(SP tool, SP tablet, SP surf); void proximityOut(SP tool); void buttonTool(SP tool, uint32_t button, uint32_t state); void motion(SP tool, const Vector2D& value); // Tablet pad events void mode(SP pad, uint32_t group, uint32_t mode, uint32_t timeMs); void buttonPad(SP pad, uint32_t button, uint32_t timeMs, uint32_t state); void strip(SP pad, uint32_t strip, double position, bool finger, uint32_t timeMs); void ring(SP pad, uint32_t ring, double position, bool finger, uint32_t timeMs); private: void onManagerResourceDestroy(wl_resource* res); void destroyResource(CTabletSeat* resource); void destroyResource(CTabletToolV2Resource* resource); void destroyResource(CTabletV2Resource* resource); void destroyResource(CTabletPadV2Resource* resource); void destroyResource(CTabletPadGroupV2Resource* resource); void destroyResource(CTabletPadRingV2Resource* resource); void destroyResource(CTabletPadStripV2Resource* resource); void onGetSeat(CZwpTabletManagerV2* pMgr, uint32_t id, wl_resource* seat); // std::vector> m_managers; std::vector> m_seats; std::vector> m_tools; std::vector> m_tablets; std::vector> m_pads; std::vector> m_groups; std::vector> m_rings; std::vector> m_strips; // registered std::vector> m_tabletDevices; std::vector> m_toolDevices; std::vector> m_padDevices; // FIXME: rings and strips are broken, I don't understand how this shit works. // It's 2am. SP ringForID(SP pad, uint32_t id); SP stripForID(SP pad, uint32_t id); friend class CTabletSeat; friend class CTabletToolV2Resource; friend class CTabletV2Resource; friend class CTabletPadV2Resource; friend class CTabletPadGroupV2Resource; friend class CTabletPadRingV2Resource; friend class CTabletPadStripV2Resource; }; namespace PROTO { inline UP tablet; };