• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef _LIBINPUT_INPUT_TRANSPORT_H
18 #define _LIBINPUT_INPUT_TRANSPORT_H
19 
20 /**
21  * Native input transport.
22  *
23  * The InputChannel provides a mechanism for exchanging InputMessage structures across processes.
24  *
25  * The InputPublisher and InputConsumer each handle one end-point of an input channel.
26  * The InputPublisher is used by the input dispatcher to send events to the application.
27  * The InputConsumer is used by the application to receive events from the input dispatcher.
28  */
29 
30 #include <input/Input.h>
31 #include <utils/Errors.h>
32 #include <utils/Timers.h>
33 #include <utils/RefBase.h>
34 #include <utils/String8.h>
35 #include <utils/Vector.h>
36 #include <utils/BitSet.h>
37 
38 namespace android {
39 
40 /*
41  * Intermediate representation used to send input events and related signals.
42  *
43  * Note that this structure is used for IPCs so its layout must be identical
44  * on 64 and 32 bit processes. This is tested in StructLayout_test.cpp.
45  */
46 struct InputMessage {
47     enum {
48         TYPE_KEY = 1,
49         TYPE_MOTION = 2,
50         TYPE_FINISHED = 3,
51     };
52 
53     struct Header {
54         uint32_t type;
55         // We don't need this field in order to align the body below but we
56         // leave it here because InputMessage::size() and other functions
57         // compute the size of this structure as sizeof(Header) + sizeof(Body).
58         uint32_t padding;
59     } header;
60 
61     // Body *must* be 8 byte aligned.
62     union Body {
63         struct Key {
64             uint32_t seq;
65             nsecs_t eventTime __attribute__((aligned(8)));
66             int32_t deviceId;
67             int32_t source;
68             int32_t action;
69             int32_t flags;
70             int32_t keyCode;
71             int32_t scanCode;
72             int32_t metaState;
73             int32_t repeatCount;
74             nsecs_t downTime __attribute__((aligned(8)));
75 
sizeInputMessage::Body::Key76             inline size_t size() const {
77                 return sizeof(Key);
78             }
79         } key;
80 
81         struct Motion {
82             uint32_t seq;
83             nsecs_t eventTime __attribute__((aligned(8)));
84             int32_t deviceId;
85             int32_t source;
86             int32_t action;
87             int32_t actionButton;
88             int32_t flags;
89             int32_t metaState;
90             int32_t buttonState;
91             int32_t edgeFlags;
92             nsecs_t downTime __attribute__((aligned(8)));
93             float xOffset;
94             float yOffset;
95             float xPrecision;
96             float yPrecision;
97             uint32_t pointerCount;
98             // Note that PointerCoords requires 8 byte alignment.
99             struct Pointer {
100                 PointerProperties properties;
101                 PointerCoords coords;
102             } pointers[MAX_POINTERS];
103 
getActionIdInputMessage::Body::Motion104             int32_t getActionId() const {
105                 uint32_t index = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
106                         >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
107                 return pointers[index].properties.id;
108             }
109 
sizeInputMessage::Body::Motion110             inline size_t size() const {
111                 return sizeof(Motion) - sizeof(Pointer) * MAX_POINTERS
112                         + sizeof(Pointer) * pointerCount;
113             }
114         } motion;
115 
116         struct Finished {
117             uint32_t seq;
118             bool handled;
119 
sizeInputMessage::Body::Finished120             inline size_t size() const {
121                 return sizeof(Finished);
122             }
123         } finished;
124     } __attribute__((aligned(8))) body;
125 
126     bool isValid(size_t actualSize) const;
127     size_t size() const;
128 };
129 
130 /*
131  * An input channel consists of a local unix domain socket used to send and receive
132  * input messages across processes.  Each channel has a descriptive name for debugging purposes.
133  *
134  * Each endpoint has its own InputChannel object that specifies its file descriptor.
135  *
136  * The input channel is closed when all references to it are released.
137  */
138 class InputChannel : public RefBase {
139 protected:
140     virtual ~InputChannel();
141 
142 public:
143     InputChannel(const String8& name, int fd);
144 
145     /* Creates a pair of input channels.
146      *
147      * Returns OK on success.
148      */
149     static status_t openInputChannelPair(const String8& name,
150             sp<InputChannel>& outServerChannel, sp<InputChannel>& outClientChannel);
151 
getName()152     inline String8 getName() const { return mName; }
getFd()153     inline int getFd() const { return mFd; }
154 
155     /* Sends a message to the other endpoint.
156      *
157      * If the channel is full then the message is guaranteed not to have been sent at all.
158      * Try again after the consumer has sent a finished signal indicating that it has
159      * consumed some of the pending messages from the channel.
160      *
161      * Returns OK on success.
162      * Returns WOULD_BLOCK if the channel is full.
163      * Returns DEAD_OBJECT if the channel's peer has been closed.
164      * Other errors probably indicate that the channel is broken.
165      */
166     status_t sendMessage(const InputMessage* msg);
167 
168     /* Receives a message sent by the other endpoint.
169      *
170      * If there is no message present, try again after poll() indicates that the fd
171      * is readable.
172      *
173      * Returns OK on success.
174      * Returns WOULD_BLOCK if there is no message present.
175      * Returns DEAD_OBJECT if the channel's peer has been closed.
176      * Other errors probably indicate that the channel is broken.
177      */
178     status_t receiveMessage(InputMessage* msg);
179 
180     /* Returns a new object that has a duplicate of this channel's fd. */
181     sp<InputChannel> dup() const;
182 
183 private:
184     String8 mName;
185     int mFd;
186 };
187 
188 /*
189  * Publishes input events to an input channel.
190  */
191 class InputPublisher {
192 public:
193     /* Creates a publisher associated with an input channel. */
194     explicit InputPublisher(const sp<InputChannel>& channel);
195 
196     /* Destroys the publisher and releases its input channel. */
197     ~InputPublisher();
198 
199     /* Gets the underlying input channel. */
getChannel()200     inline sp<InputChannel> getChannel() { return mChannel; }
201 
202     /* Publishes a key event to the input channel.
203      *
204      * Returns OK on success.
205      * Returns WOULD_BLOCK if the channel is full.
206      * Returns DEAD_OBJECT if the channel's peer has been closed.
207      * Returns BAD_VALUE if seq is 0.
208      * Other errors probably indicate that the channel is broken.
209      */
210     status_t publishKeyEvent(
211             uint32_t seq,
212             int32_t deviceId,
213             int32_t source,
214             int32_t action,
215             int32_t flags,
216             int32_t keyCode,
217             int32_t scanCode,
218             int32_t metaState,
219             int32_t repeatCount,
220             nsecs_t downTime,
221             nsecs_t eventTime);
222 
223     /* Publishes a motion event to the input channel.
224      *
225      * Returns OK on success.
226      * Returns WOULD_BLOCK if the channel is full.
227      * Returns DEAD_OBJECT if the channel's peer has been closed.
228      * Returns BAD_VALUE if seq is 0 or if pointerCount is less than 1 or greater than MAX_POINTERS.
229      * Other errors probably indicate that the channel is broken.
230      */
231     status_t publishMotionEvent(
232             uint32_t seq,
233             int32_t deviceId,
234             int32_t source,
235             int32_t action,
236             int32_t actionButton,
237             int32_t flags,
238             int32_t edgeFlags,
239             int32_t metaState,
240             int32_t buttonState,
241             float xOffset,
242             float yOffset,
243             float xPrecision,
244             float yPrecision,
245             nsecs_t downTime,
246             nsecs_t eventTime,
247             uint32_t pointerCount,
248             const PointerProperties* pointerProperties,
249             const PointerCoords* pointerCoords);
250 
251     /* Receives the finished signal from the consumer in reply to the original dispatch signal.
252      * If a signal was received, returns the message sequence number,
253      * and whether the consumer handled the message.
254      *
255      * The returned sequence number is never 0 unless the operation failed.
256      *
257      * Returns OK on success.
258      * Returns WOULD_BLOCK if there is no signal present.
259      * Returns DEAD_OBJECT if the channel's peer has been closed.
260      * Other errors probably indicate that the channel is broken.
261      */
262     status_t receiveFinishedSignal(uint32_t* outSeq, bool* outHandled);
263 
264 private:
265     sp<InputChannel> mChannel;
266 };
267 
268 /*
269  * Consumes input events from an input channel.
270  */
271 class InputConsumer {
272 public:
273     /* Creates a consumer associated with an input channel. */
274     explicit InputConsumer(const sp<InputChannel>& channel);
275 
276     /* Destroys the consumer and releases its input channel. */
277     ~InputConsumer();
278 
279     /* Gets the underlying input channel. */
getChannel()280     inline sp<InputChannel> getChannel() { return mChannel; }
281 
282     /* Consumes an input event from the input channel and copies its contents into
283      * an InputEvent object created using the specified factory.
284      *
285      * Tries to combine a series of move events into larger batches whenever possible.
286      *
287      * If consumeBatches is false, then defers consuming pending batched events if it
288      * is possible for additional samples to be added to them later.  Call hasPendingBatch()
289      * to determine whether a pending batch is available to be consumed.
290      *
291      * If consumeBatches is true, then events are still batched but they are consumed
292      * immediately as soon as the input channel is exhausted.
293      *
294      * The frameTime parameter specifies the time when the current display frame started
295      * rendering in the CLOCK_MONOTONIC time base, or -1 if unknown.
296      *
297      * The returned sequence number is never 0 unless the operation failed.
298      *
299      * Returns OK on success.
300      * Returns WOULD_BLOCK if there is no event present.
301      * Returns DEAD_OBJECT if the channel's peer has been closed.
302      * Returns NO_MEMORY if the event could not be created.
303      * Other errors probably indicate that the channel is broken.
304      */
305     status_t consume(InputEventFactoryInterface* factory, bool consumeBatches,
306             nsecs_t frameTime, uint32_t* outSeq, InputEvent** outEvent);
307 
308     /* Sends a finished signal to the publisher to inform it that the message
309      * with the specified sequence number has finished being process and whether
310      * the message was handled by the consumer.
311      *
312      * Returns OK on success.
313      * Returns BAD_VALUE if seq is 0.
314      * Other errors probably indicate that the channel is broken.
315      */
316     status_t sendFinishedSignal(uint32_t seq, bool handled);
317 
318     /* Returns true if there is a deferred event waiting.
319      *
320      * Should be called after calling consume() to determine whether the consumer
321      * has a deferred event to be processed.  Deferred events are somewhat special in
322      * that they have already been removed from the input channel.  If the input channel
323      * becomes empty, the client may need to do extra work to ensure that it processes
324      * the deferred event despite the fact that the input channel's file descriptor
325      * is not readable.
326      *
327      * One option is simply to call consume() in a loop until it returns WOULD_BLOCK.
328      * This guarantees that all deferred events will be processed.
329      *
330      * Alternately, the caller can call hasDeferredEvent() to determine whether there is
331      * a deferred event waiting and then ensure that its event loop wakes up at least
332      * one more time to consume the deferred event.
333      */
334     bool hasDeferredEvent() const;
335 
336     /* Returns true if there is a pending batch.
337      *
338      * Should be called after calling consume() with consumeBatches == false to determine
339      * whether consume() should be called again later on with consumeBatches == true.
340      */
341     bool hasPendingBatch() const;
342 
343 private:
344     // True if touch resampling is enabled.
345     const bool mResampleTouch;
346 
347     // The input channel.
348     sp<InputChannel> mChannel;
349 
350     // The current input message.
351     InputMessage mMsg;
352 
353     // True if mMsg contains a valid input message that was deferred from the previous
354     // call to consume and that still needs to be handled.
355     bool mMsgDeferred;
356 
357     // Batched motion events per device and source.
358     struct Batch {
359         Vector<InputMessage> samples;
360     };
361     Vector<Batch> mBatches;
362 
363     // Touch state per device and source, only for sources of class pointer.
364     struct History {
365         nsecs_t eventTime;
366         BitSet32 idBits;
367         int32_t idToIndex[MAX_POINTER_ID + 1];
368         PointerCoords pointers[MAX_POINTERS];
369 
initializeFromHistory370         void initializeFrom(const InputMessage* msg) {
371             eventTime = msg->body.motion.eventTime;
372             idBits.clear();
373             for (uint32_t i = 0; i < msg->body.motion.pointerCount; i++) {
374                 uint32_t id = msg->body.motion.pointers[i].properties.id;
375                 idBits.markBit(id);
376                 idToIndex[id] = i;
377                 pointers[i].copyFrom(msg->body.motion.pointers[i].coords);
378             }
379         }
380 
getPointerByIdHistory381         const PointerCoords& getPointerById(uint32_t id) const {
382             return pointers[idToIndex[id]];
383         }
384     };
385     struct TouchState {
386         int32_t deviceId;
387         int32_t source;
388         size_t historyCurrent;
389         size_t historySize;
390         History history[2];
391         History lastResample;
392 
initializeTouchState393         void initialize(int32_t deviceId, int32_t source) {
394             this->deviceId = deviceId;
395             this->source = source;
396             historyCurrent = 0;
397             historySize = 0;
398             lastResample.eventTime = 0;
399             lastResample.idBits.clear();
400         }
401 
addHistoryTouchState402         void addHistory(const InputMessage* msg) {
403             historyCurrent ^= 1;
404             if (historySize < 2) {
405                 historySize += 1;
406             }
407             history[historyCurrent].initializeFrom(msg);
408         }
409 
getHistoryTouchState410         const History* getHistory(size_t index) const {
411             return &history[(historyCurrent + index) & 1];
412         }
413     };
414     Vector<TouchState> mTouchStates;
415 
416     // Chain of batched sequence numbers.  When multiple input messages are combined into
417     // a batch, we append a record here that associates the last sequence number in the
418     // batch with the previous one.  When the finished signal is sent, we traverse the
419     // chain to individually finish all input messages that were part of the batch.
420     struct SeqChain {
421         uint32_t seq;   // sequence number of batched input message
422         uint32_t chain; // sequence number of previous batched input message
423     };
424     Vector<SeqChain> mSeqChains;
425 
426     status_t consumeBatch(InputEventFactoryInterface* factory,
427             nsecs_t frameTime, uint32_t* outSeq, InputEvent** outEvent);
428     status_t consumeSamples(InputEventFactoryInterface* factory,
429             Batch& batch, size_t count, uint32_t* outSeq, InputEvent** outEvent);
430 
431     void updateTouchState(InputMessage* msg);
432     void rewriteMessage(const TouchState& state, InputMessage* msg);
433     void resampleTouchState(nsecs_t frameTime, MotionEvent* event,
434             const InputMessage *next);
435 
436     ssize_t findBatch(int32_t deviceId, int32_t source) const;
437     ssize_t findTouchState(int32_t deviceId, int32_t source) const;
438 
439     status_t sendUnchainedFinishedSignal(uint32_t seq, bool handled);
440 
441     static void initializeKeyEvent(KeyEvent* event, const InputMessage* msg);
442     static void initializeMotionEvent(MotionEvent* event, const InputMessage* msg);
443     static void addSample(MotionEvent* event, const InputMessage* msg);
444     static bool canAddSample(const Batch& batch, const InputMessage* msg);
445     static ssize_t findSampleNoLaterThan(const Batch& batch, nsecs_t time);
446     static bool shouldResampleTool(int32_t toolType);
447 
448     static bool isTouchResamplingEnabled();
449 };
450 
451 } // namespace android
452 
453 #endif // _LIBINPUT_INPUT_TRANSPORT_H
454