xref: /haiku/src/add-ons/input_server/devices/virtio/VirtioInputDevice.h (revision cc818f35c42a181f8cf35ac3dcf2b4af5a3a83c0)
1 /*
2  * Copyright 2021, Haiku, Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef _VIRTIOINPUTDEVICE_H_
6 #define _VIRTIOINPUTDEVICE_H_
7 
8 
9 #include <add-ons/input_server/InputServerDevice.h>
10 #include <AutoDeleter.h>
11 #include <Handler.h>
12 #include <InterfaceDefs.h>
13 #include <MessageRunner.h>
14 
15 
16 struct VirtioInputPacket;
17 
18 
19 struct KeyboardState {
20 	bigtime_t when;
21 	uint8 keys[256 / 8];
22 	uint32 modifiers;
23 };
24 
25 struct TabletState {
26 	bigtime_t when;
27 	float x, y;
28 	float pressure;
29 	uint32 buttons;
30 	int32 clicks;
31 	int32 wheelX, wheelY;
32 };
33 
34 
35 class VirtioInputDevice : public BInputServerDevice
36 {
37 public:
38 							VirtioInputDevice();
39 	virtual					~VirtioInputDevice();
40 
41 	virtual	status_t		InitCheck();
42 
43 	virtual	status_t		Start(const char* name, void* cookie);
44 	virtual	status_t		Stop(const char* name, void* cookie);
45 
46 	virtual	status_t		Control(const char* name, void* cookie,
47 								uint32 command, BMessage* message);
48 };
49 
50 
51 class VirtioInputHandler
52 {
53 public:
54 							VirtioInputHandler(VirtioInputDevice* dev,
55 								const char* name, input_device_type type);
56 	virtual					~VirtioInputHandler();
57 	inline	VirtioInputDevice*
Device()58 							Device()
59 								{return fDev;}
60 	inline input_device_ref*
Ref()61 							Ref()
62 								{return &fRef;}
63 			void			SetFd(int fd);
64 
65 			status_t		Start();
66 			status_t		Stop();
67 
68 	static	status_t		Watcher(void* arg);
69 
70 	virtual	void			Reset() = 0;
71 	virtual	status_t		Control(uint32 command, BMessage* message);
72 	virtual	void			PacketReceived(const VirtioInputPacket &pkt) = 0;
73 
74 private:
75 			VirtioInputDevice*
76 							fDev;
77 			input_device_ref
78 							fRef;
79 			FileDescriptorCloser
80 							fDeviceFd;
81 			thread_id		fWatcherThread;
82 			bool			fRun;
83 };
84 
85 
86 class KeyboardHandler : public VirtioInputHandler
87 {
88 public:
89 							KeyboardHandler(VirtioInputDevice* dev,
90 								const char* name);
91 	virtual					~KeyboardHandler();
92 
93 	virtual	void			Reset();
94 	virtual	status_t		Control(uint32 command, BMessage* message);
95 	virtual	void			PacketReceived(const VirtioInputPacket &pkt);
96 
97 private:
98 	static	bool			_IsKeyPressed(const KeyboardState& state,
99 								uint32 key);
100 			void			_KeyString(uint32 code, char* str, size_t len);
101 			void			_StartRepeating(BMessage* msg);
102 			void			_StopRepeating();
103 	static	status_t		_RepeatThread(void* arg);
104 			void			_StateChanged();
105 
106 private:
107 			KeyboardState	fState;
108 			KeyboardState	fNewState;
109 			BPrivate::AutoDeleter<key_map, BPrivate::MemoryDelete>
110 							fKeyMap;
111 			BPrivate::AutoDeleter<char, BPrivate::MemoryDelete>
112 							fChars;
113 
114 			bigtime_t		fRepeatDelay;
115 			int32			fRepeatRate;
116 			thread_id		fRepeatThread;
117 			sem_id			fRepeatThreadSem;
118 			BMessage		fRepeatMsg;
119 };
120 
121 
122 class TabletHandler : public VirtioInputHandler
123 {
124 public:
125 							TabletHandler(VirtioInputDevice* dev,
126 								const char* name);
127 
128 	virtual	void			Reset();
129 	virtual	status_t		Control(uint32 command, BMessage* message);
130 	virtual	void			PacketReceived(const VirtioInputPacket &pkt);
131 
132 private:
133 	static	bool			_FillMessage(BMessage& msg, const TabletState& s);
134 
135 private:
136 			TabletState		fState;
137 			TabletState		fNewState;
138 			bigtime_t		fLastClick;
139 			int				fLastClickBtn;
140 
141 			bigtime_t		fClickSpeed;
142 };
143 
144 
145 extern "C" _EXPORT BInputServerDevice* instantiate_input_device();
146 
147 
148 #endif	// _VIRTIOINPUTDEVICE_H_
149