Home | History | Annotate | Download | only in lib
      1 /*
      2  * Copyright (C) 2017 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 #include "common/vsoc/lib/input_events_region_view.h"
     17 
     18 #include <linux/input.h>
     19 #include <linux/uinput.h>
     20 
     21 #include "common/vsoc/lib/circqueue_impl.h"
     22 
     23 using vsoc::layout::input_events::InputEventsLayout;
     24 
     25 namespace vsoc {
     26 namespace input_events {
     27 
     28 namespace {
     29 void InitInputEvent(InputEvent* evt, uint16_t type, uint16_t code, uint32_t value) {
     30   evt->type = type;
     31   evt->code = code;
     32   evt->value = value;
     33 }
     34 }  // namespace
     35 
     36 const int InputEventsRegionView::kMaxEventsPerPacket = 4;
     37 
     38 bool InputEventsRegionView::HandleSingleTouchEvent(bool down, int x, int y) {
     39   // TODO(jemoreira): Use multitouch when available
     40   InputEvent events[4];
     41   // Make sure to modify kMaxEventPerPacket if more events are sent.
     42   InitInputEvent(&events[0], EV_ABS, ABS_X, x);
     43   InitInputEvent(&events[1], EV_ABS, ABS_Y, y);
     44   InitInputEvent(&events[2], EV_KEY, BTN_TOUCH, down);
     45   InitInputEvent(&events[3], EV_SYN, 0, 0);
     46   return 0 <
     47          data()->touch_screen_queue.Write(
     48              this, reinterpret_cast<char*>(&events[0]), sizeof(events), true);
     49 }
     50 
     51 bool InputEventsRegionView::HandlePowerButtonEvent(bool down) {
     52   InputEvent events[2];
     53   InitInputEvent(&events[0], EV_KEY, KEY_POWER, down);
     54   InitInputEvent(&events[1], EV_SYN, 0, 0);
     55   return 0 < data()->power_button_queue.Write(
     56                  this, reinterpret_cast<char*>(&events[0]),
     57                  sizeof(events), true);
     58 }
     59 
     60 bool InputEventsRegionView::HandleKeyboardEvent(bool down, uint16_t key_code) {
     61   InputEvent events[2];
     62   InitInputEvent(&events[0], EV_KEY, key_code, down);
     63   InitInputEvent(&events[1], EV_SYN, 0, 0);
     64   return 0 <
     65          data()->keyboard_queue.Write(this, reinterpret_cast<char*>(&events[0]),
     66                                       sizeof(events), true);
     67 }
     68 
     69 intptr_t InputEventsRegionView::GetScreenEventsOrWait(InputEvent* evt,
     70                                                       int max_event_count) {
     71   intptr_t ret = this->data()->touch_screen_queue.Read(
     72       this, reinterpret_cast<char*>(evt), sizeof(InputEvent) * max_event_count);
     73   if (ret < 0) {
     74     return ret;
     75   }
     76   return ret / sizeof(InputEvent);
     77 }
     78 
     79 intptr_t InputEventsRegionView::GetKeyboardEventsOrWait(InputEvent* evt,
     80                                                         int max_event_count) {
     81   intptr_t ret = this->data()->keyboard_queue.Read(
     82       this, reinterpret_cast<char*>(evt), sizeof(InputEvent) * max_event_count);
     83   if (ret < 0) {
     84     return ret;
     85   }
     86   return ret / sizeof(InputEvent);
     87 }
     88 
     89 intptr_t InputEventsRegionView::GetPowerButtonEventsOrWait(
     90     InputEvent* evt, int max_event_count) {
     91   intptr_t ret = this->data()->power_button_queue.Read(
     92       this, reinterpret_cast<char*>(evt), sizeof(InputEvent) * max_event_count);
     93   if (ret < 0) {
     94     return ret;
     95   }
     96   return ret / sizeof(InputEvent);
     97 }
     98 
     99 }  // namespace input_events
    100 }  // namespace vsoc
    101