widget/gonk/libui/InputTransport.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     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  */
    17 #ifndef _ANDROIDFW_INPUT_TRANSPORT_H
    18 #define _ANDROIDFW_INPUT_TRANSPORT_H
    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  */
    30 #include "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>
    38 namespace android {
    40 /*
    41  * Intermediate representation used to send input events and related signals.
    42  */
    43 struct InputMessage {
    44     enum {
    45         TYPE_KEY = 1,
    46         TYPE_MOTION = 2,
    47         TYPE_FINISHED = 3,
    48     };
    50     struct Header {
    51         uint32_t type;
    52         uint32_t padding; // 8 byte alignment for the body that follows
    53     } header;
    55     union Body {
    56         struct Key {
    57             uint32_t seq;
    58             nsecs_t eventTime;
    59             int32_t deviceId;
    60             int32_t source;
    61             int32_t action;
    62             int32_t flags;
    63             int32_t keyCode;
    64             int32_t scanCode;
    65             int32_t metaState;
    66             int32_t repeatCount;
    67             nsecs_t downTime;
    69             inline size_t size() const {
    70                 return sizeof(Key);
    71             }
    72         } key;
    74         struct Motion {
    75             uint32_t seq;
    76             nsecs_t eventTime;
    77             int32_t deviceId;
    78             int32_t source;
    79             int32_t action;
    80             int32_t flags;
    81             int32_t metaState;
    82             int32_t buttonState;
    83             int32_t edgeFlags;
    84             nsecs_t downTime;
    85             float xOffset;
    86             float yOffset;
    87             float xPrecision;
    88             float yPrecision;
    89             size_t pointerCount;
    90             struct Pointer {
    91                 PointerProperties properties;
    92                 PointerCoords coords;
    93             } pointers[MAX_POINTERS];
    95             int32_t getActionId() const {
    96                 uint32_t index = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
    97                         >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
    98                 return pointers[index].properties.id;
    99             }
   101             inline size_t size() const {
   102                 return sizeof(Motion) - sizeof(Pointer) * MAX_POINTERS
   103                         + sizeof(Pointer) * pointerCount;
   104             }
   105         } motion;
   107         struct Finished {
   108             uint32_t seq;
   109             bool handled;
   111             inline size_t size() const {
   112                 return sizeof(Finished);
   113             }
   114         } finished;
   115     } body;
   117     bool isValid(size_t actualSize) const;
   118     size_t size() const;
   119 };
   121 /*
   122  * An input channel consists of a local unix domain socket used to send and receive
   123  * input messages across processes.  Each channel has a descriptive name for debugging purposes.
   124  *
   125  * Each endpoint has its own InputChannel object that specifies its file descriptor.
   126  *
   127  * The input channel is closed when all references to it are released.
   128  */
   129 class InputChannel : public RefBase {
   130 protected:
   131     virtual ~InputChannel();
   133 public:
   134     InputChannel(const String8& name, int fd);
   136     /* Creates a pair of input channels.
   137      *
   138      * Returns OK on success.
   139      */
   140     static status_t openInputChannelPair(const String8& name,
   141             sp<InputChannel>& outServerChannel, sp<InputChannel>& outClientChannel);
   143     inline String8 getName() const { return mName; }
   144     inline int getFd() const { return mFd; }
   146     /* Sends a message to the other endpoint.
   147      *
   148      * If the channel is full then the message is guaranteed not to have been sent at all.
   149      * Try again after the consumer has sent a finished signal indicating that it has
   150      * consumed some of the pending messages from the channel.
   151      *
   152      * Returns OK on success.
   153      * Returns WOULD_BLOCK if the channel is full.
   154      * Returns DEAD_OBJECT if the channel's peer has been closed.
   155      * Other errors probably indicate that the channel is broken.
   156      */
   157     status_t sendMessage(const InputMessage* msg);
   159     /* Receives a message sent by the other endpoint.
   160      *
   161      * If there is no message present, try again after poll() indicates that the fd
   162      * is readable.
   163      *
   164      * Returns OK on success.
   165      * Returns WOULD_BLOCK if there is no message present.
   166      * Returns DEAD_OBJECT if the channel's peer has been closed.
   167      * Other errors probably indicate that the channel is broken.
   168      */
   169     status_t receiveMessage(InputMessage* msg);
   171     /* Returns a new object that has a duplicate of this channel's fd. */
   172     sp<InputChannel> dup() const;
   174 private:
   175     String8 mName;
   176     int mFd;
   177 };
   179 /*
   180  * Publishes input events to an input channel.
   181  */
   182 class InputPublisher {
   183 public:
   184     /* Creates a publisher associated with an input channel. */
   185     explicit InputPublisher(const sp<InputChannel>& channel);
   187     /* Destroys the publisher and releases its input channel. */
   188     ~InputPublisher();
   190     /* Gets the underlying input channel. */
   191     inline sp<InputChannel> getChannel() { return mChannel; }
   193     /* Publishes a key event to the input channel.
   194      *
   195      * Returns OK on success.
   196      * Returns WOULD_BLOCK if the channel is full.
   197      * Returns DEAD_OBJECT if the channel's peer has been closed.
   198      * Returns BAD_VALUE if seq is 0.
   199      * Other errors probably indicate that the channel is broken.
   200      */
   201     status_t publishKeyEvent(
   202             uint32_t seq,
   203             int32_t deviceId,
   204             int32_t source,
   205             int32_t action,
   206             int32_t flags,
   207             int32_t keyCode,
   208             int32_t scanCode,
   209             int32_t metaState,
   210             int32_t repeatCount,
   211             nsecs_t downTime,
   212             nsecs_t eventTime);
   214     /* Publishes a motion event to the input channel.
   215      *
   216      * Returns OK on success.
   217      * Returns WOULD_BLOCK if the channel is full.
   218      * Returns DEAD_OBJECT if the channel's peer has been closed.
   219      * Returns BAD_VALUE if seq is 0 or if pointerCount is less than 1 or greater than MAX_POINTERS.
   220      * Other errors probably indicate that the channel is broken.
   221      */
   222     status_t publishMotionEvent(
   223             uint32_t seq,
   224             int32_t deviceId,
   225             int32_t source,
   226             int32_t action,
   227             int32_t flags,
   228             int32_t edgeFlags,
   229             int32_t metaState,
   230             int32_t buttonState,
   231             float xOffset,
   232             float yOffset,
   233             float xPrecision,
   234             float yPrecision,
   235             nsecs_t downTime,
   236             nsecs_t eventTime,
   237             size_t pointerCount,
   238             const PointerProperties* pointerProperties,
   239             const PointerCoords* pointerCoords);
   241     /* Receives the finished signal from the consumer in reply to the original dispatch signal.
   242      * If a signal was received, returns the message sequence number,
   243      * and whether the consumer handled the message.
   244      *
   245      * The returned sequence number is never 0 unless the operation failed.
   246      *
   247      * Returns OK on success.
   248      * Returns WOULD_BLOCK if there is no signal present.
   249      * Returns DEAD_OBJECT if the channel's peer has been closed.
   250      * Other errors probably indicate that the channel is broken.
   251      */
   252     status_t receiveFinishedSignal(uint32_t* outSeq, bool* outHandled);
   254 private:
   255     sp<InputChannel> mChannel;
   256 };
   258 /*
   259  * Consumes input events from an input channel.
   260  */
   261 class InputConsumer {
   262 public:
   263     /* Creates a consumer associated with an input channel. */
   264     explicit InputConsumer(const sp<InputChannel>& channel);
   266     /* Destroys the consumer and releases its input channel. */
   267     ~InputConsumer();
   269     /* Gets the underlying input channel. */
   270     inline sp<InputChannel> getChannel() { return mChannel; }
   272     /* Consumes an input event from the input channel and copies its contents into
   273      * an InputEvent object created using the specified factory.
   274      *
   275      * Tries to combine a series of move events into larger batches whenever possible.
   276      *
   277      * If consumeBatches is false, then defers consuming pending batched events if it
   278      * is possible for additional samples to be added to them later.  Call hasPendingBatch()
   279      * to determine whether a pending batch is available to be consumed.
   280      *
   281      * If consumeBatches is true, then events are still batched but they are consumed
   282      * immediately as soon as the input channel is exhausted.
   283      *
   284      * The frameTime parameter specifies the time when the current display frame started
   285      * rendering in the CLOCK_MONOTONIC time base, or -1 if unknown.
   286      *
   287      * The returned sequence number is never 0 unless the operation failed.
   288      *
   289      * Returns OK on success.
   290      * Returns WOULD_BLOCK if there is no event present.
   291      * Returns DEAD_OBJECT if the channel's peer has been closed.
   292      * Returns NO_MEMORY if the event could not be created.
   293      * Other errors probably indicate that the channel is broken.
   294      */
   295     status_t consume(InputEventFactoryInterface* factory, bool consumeBatches,
   296             nsecs_t frameTime, uint32_t* outSeq, InputEvent** outEvent);
   298     /* Sends a finished signal to the publisher to inform it that the message
   299      * with the specified sequence number has finished being process and whether
   300      * the message was handled by the consumer.
   301      *
   302      * Returns OK on success.
   303      * Returns BAD_VALUE if seq is 0.
   304      * Other errors probably indicate that the channel is broken.
   305      */
   306     status_t sendFinishedSignal(uint32_t seq, bool handled);
   308     /* Returns true if there is a deferred event waiting.
   309      *
   310      * Should be called after calling consume() to determine whether the consumer
   311      * has a deferred event to be processed.  Deferred events are somewhat special in
   312      * that they have already been removed from the input channel.  If the input channel
   313      * becomes empty, the client may need to do extra work to ensure that it processes
   314      * the deferred event despite the fact that the input channel's file descriptor
   315      * is not readable.
   316      *
   317      * One option is simply to call consume() in a loop until it returns WOULD_BLOCK.
   318      * This guarantees that all deferred events will be processed.
   319      *
   320      * Alternately, the caller can call hasDeferredEvent() to determine whether there is
   321      * a deferred event waiting and then ensure that its event loop wakes up at least
   322      * one more time to consume the deferred event.
   323      */
   324     bool hasDeferredEvent() const;
   326     /* Returns true if there is a pending batch.
   327      *
   328      * Should be called after calling consume() with consumeBatches == false to determine
   329      * whether consume() should be called again later on with consumeBatches == true.
   330      */
   331     bool hasPendingBatch() const;
   333 private:
   334     // True if touch resampling is enabled.
   335     const bool mResampleTouch;
   337     // The input channel.
   338     sp<InputChannel> mChannel;
   340     // The current input message.
   341     InputMessage mMsg;
   343     // True if mMsg contains a valid input message that was deferred from the previous
   344     // call to consume and that still needs to be handled.
   345     bool mMsgDeferred;
   347     // Batched motion events per device and source.
   348     struct Batch {
   349         Vector<InputMessage> samples;
   350     };
   351     Vector<Batch> mBatches;
   353     // Touch state per device and source, only for sources of class pointer.
   354     struct History {
   355         nsecs_t eventTime;
   356         BitSet32 idBits;
   357         int32_t idToIndex[MAX_POINTER_ID + 1];
   358         PointerCoords pointers[MAX_POINTERS];
   360         void initializeFrom(const InputMessage* msg) {
   361             eventTime = msg->body.motion.eventTime;
   362             idBits.clear();
   363             for (size_t i = 0; i < msg->body.motion.pointerCount; i++) {
   364                 uint32_t id = msg->body.motion.pointers[i].properties.id;
   365                 idBits.markBit(id);
   366                 idToIndex[id] = i;
   367                 pointers[i].copyFrom(msg->body.motion.pointers[i].coords);
   368             }
   369         }
   371         const PointerCoords& getPointerById(uint32_t id) const {
   372             return pointers[idToIndex[id]];
   373         }
   374     };
   375     struct TouchState {
   376         int32_t deviceId;
   377         int32_t source;
   378         size_t historyCurrent;
   379         size_t historySize;
   380         History history[2];
   381         History lastResample;
   383         void initialize(int32_t deviceId, int32_t source) {
   384             this->deviceId = deviceId;
   385             this->source = source;
   386             historyCurrent = 0;
   387             historySize = 0;
   388             lastResample.eventTime = 0;
   389             lastResample.idBits.clear();
   390         }
   392         void addHistory(const InputMessage* msg) {
   393             historyCurrent ^= 1;
   394             if (historySize < 2) {
   395                 historySize += 1;
   396             }
   397             history[historyCurrent].initializeFrom(msg);
   398         }
   400         const History* getHistory(size_t index) const {
   401             return &history[(historyCurrent + index) & 1];
   402         }
   403     };
   404     Vector<TouchState> mTouchStates;
   406     // Chain of batched sequence numbers.  When multiple input messages are combined into
   407     // a batch, we append a record here that associates the last sequence number in the
   408     // batch with the previous one.  When the finished signal is sent, we traverse the
   409     // chain to individually finish all input messages that were part of the batch.
   410     struct SeqChain {
   411         uint32_t seq;   // sequence number of batched input message
   412         uint32_t chain; // sequence number of previous batched input message
   413     };
   414     Vector<SeqChain> mSeqChains;
   416     status_t consumeBatch(InputEventFactoryInterface* factory,
   417             nsecs_t frameTime, uint32_t* outSeq, InputEvent** outEvent);
   418     status_t consumeSamples(InputEventFactoryInterface* factory,
   419             Batch& batch, size_t count, uint32_t* outSeq, InputEvent** outEvent);
   421     void updateTouchState(InputMessage* msg);
   422     void rewriteMessage(const TouchState& state, InputMessage* msg);
   423     void resampleTouchState(nsecs_t frameTime, MotionEvent* event,
   424             const InputMessage *next);
   426     ssize_t findBatch(int32_t deviceId, int32_t source) const;
   427     ssize_t findTouchState(int32_t deviceId, int32_t source) const;
   429     status_t sendUnchainedFinishedSignal(uint32_t seq, bool handled);
   431     static void initializeKeyEvent(KeyEvent* event, const InputMessage* msg);
   432     static void initializeMotionEvent(MotionEvent* event, const InputMessage* msg);
   433     static void addSample(MotionEvent* event, const InputMessage* msg);
   434     static bool canAddSample(const Batch& batch, const InputMessage* msg);
   435     static ssize_t findSampleNoLaterThan(const Batch& batch, nsecs_t time);
   436     static bool shouldResampleTool(int32_t toolType);
   438     static bool isTouchResamplingEnabled();
   439 };
   441 } // namespace android
   443 #endif // _ANDROIDFW_INPUT_TRANSPORT_H

mercurial