| 1 | // LAF OS Library |
| 2 | // Copyright (C) 2020-2022 Igara Studio S.A. |
| 3 | // |
| 4 | // This file is released under the terms of the MIT license. |
| 5 | // Read LICENSE.txt for more information. |
| 6 | |
| 7 | #ifndef OS_X11_XINPUT_INCLUDED |
| 8 | #define OS_X11_XINPUT_INCLUDED |
| 9 | #pragma once |
| 10 | |
| 11 | #include "base/dll.h" |
| 12 | #include "os/event.h" |
| 13 | #include "os/x11/keys.h" |
| 14 | #include "os/x11/mouse.h" |
| 15 | |
| 16 | #include <X11/Xlib.h> |
| 17 | #include <X11/extensions/XInput.h> |
| 18 | |
| 19 | #include <map> |
| 20 | #include <vector> |
| 21 | |
| 22 | namespace os { |
| 23 | |
| 24 | class XInput { |
| 25 | // To avoid depending on the libXi statically, we can load the |
| 26 | // libXi.so dynamically. |
| 27 | typedef XDeviceInfo* (*XListInputDevices_Func)(::Display*, int*); |
| 28 | typedef void (*XFreeDeviceList_Func)(XDeviceInfo*); |
| 29 | typedef XDevice* (*XOpenDevice_Func)(::Display*, XID); |
| 30 | typedef int (*XCloseDevice_Func)(::Display*, XDevice*); |
| 31 | typedef int (*XSelectExtensionEvent_Func)(::Display*, ::Window, XEventClass*, int); |
| 32 | |
| 33 | XListInputDevices_Func XListInputDevices; |
| 34 | XFreeDeviceList_Func XFreeDeviceList; |
| 35 | XOpenDevice_Func XOpenDevice; |
| 36 | XCloseDevice_Func XCloseDevice; |
| 37 | XSelectExtensionEvent_Func XSelectExtensionEvent; |
| 38 | |
| 39 | public: |
| 40 | ~XInput(); |
| 41 | |
| 42 | void load(::Display* display); |
| 43 | void unload(::Display* display); |
| 44 | |
| 45 | void selectExtensionEvents(::Display* display, ::Window window); |
| 46 | bool handleExtensionEvent(const XEvent& xevent); |
| 47 | void convertExtensionEvent(const XEvent& xevent, |
| 48 | Event& ev, |
| 49 | int scale, |
| 50 | Time& time); |
| 51 | |
| 52 | private: |
| 53 | void addEvent(int type, XEventClass eventClass, Event::Type ourEventype); |
| 54 | |
| 55 | struct Info { |
| 56 | PointerType pointerType; |
| 57 | int minPressure = 0; |
| 58 | int maxPressure = 1000; |
| 59 | }; |
| 60 | |
| 61 | base::dll m_xi = nullptr; |
| 62 | std::vector<XDevice*> m_openDevices; |
| 63 | std::map<XID, Info> m_info; |
| 64 | std::vector<XEventClass> m_eventClasses; |
| 65 | std::vector<Event::Type> m_eventTypes; |
| 66 | }; |
| 67 | |
| 68 | } // namespace os |
| 69 | |
| 70 | #endif |
| 71 | |