#pragma once
/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "common/vsoc/shm/base.h"
#include "common/vsoc/shm/circqueue.h"

// Memory layout for region carrying input events from host to guest

namespace vsoc {
namespace layout {

namespace input_events {

struct InputEventsLayout : public RegionLayout {
  static constexpr size_t layout_size =
      CircularPacketQueue<10, 256>::layout_size +
      2 * CircularPacketQueue<10, 16>::layout_size;

  static const char* region_name;
  // Event queues for the different input devices supported. Both the power
  // button and the keyboard need only generate 2 input events for every
  // 'hardware' event, so 16 bytes are enough, however when the touchscreen has
  // multitouch enabled the number of generated events is significantly higher.
  CircularPacketQueue<10, 256> touch_screen_queue;
  CircularPacketQueue<10, 16> keyboard_queue;
  CircularPacketQueue<10, 16> power_button_queue;
};
ASSERT_SHM_COMPATIBLE(InputEventsLayout);

}  // namespace input_events
}  // namespace layout
}  // namespace vsoc
