// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/events/ozone/evdev/event_modifiers_evdev.h"

#include <linux/input.h>

#include "ui/events/event.h"

namespace ui {

namespace {

static const int kEventFlagFromModifiers[] = {
    EF_NONE,                 // EVDEV_MODIFIER_NONE,
    EF_CAPS_LOCK_DOWN,       // EVDEV_MODIFIER_CAPS_LOCK
    EF_SHIFT_DOWN,           // EVDEV_MODIFIER_SHIFT
    EF_CONTROL_DOWN,         // EVDEV_MODIFIER_CONTROL
    EF_ALT_DOWN,             // EVDEV_MODIFIER_ALT
    EF_LEFT_MOUSE_BUTTON,    // EVDEV_MODIFIER_LEFT_MOUSE_BUTTON
    EF_MIDDLE_MOUSE_BUTTON,  // EVDEV_MODIFIER_MIDDLE_MOUSE_BUTTON
    EF_RIGHT_MOUSE_BUTTON,   // EVDEV_MODIFIER_RIGHT_MOUSE_BUTTON
    EF_COMMAND_DOWN,         // EVDEV_MODIFIER_COMMAND
    EF_ALTGR_DOWN,           // EVDEV_MODIFIER_ALTGR
};

}  // namespace

EventModifiersEvdev::EventModifiersEvdev()
    : modifier_flags_locked_(0), modifier_flags_(0) {
  memset(modifiers_down_, 0, sizeof(modifiers_down_));
}
EventModifiersEvdev::~EventModifiersEvdev() {}

void EventModifiersEvdev::UpdateModifier(unsigned int modifier, bool down) {
  DCHECK_LT(modifier, EVDEV_NUM_MODIFIERS);

  if (down) {
    modifiers_down_[modifier]++;
  } else {
    // Ignore spurious modifier "up" events. This might happen if the
    // button is down during startup.
    if (modifiers_down_[modifier])
      modifiers_down_[modifier]--;
  }

  UpdateFlags(modifier);
}

void EventModifiersEvdev::UpdateModifierLock(unsigned int modifier, bool down) {
  DCHECK_LT(modifier, EVDEV_NUM_MODIFIERS);

  if (down)
    modifier_flags_locked_ ^= kEventFlagFromModifiers[modifier];

  // TODO(spang): Synchronize with the CapsLock LED.

  UpdateFlags(modifier);
}

void EventModifiersEvdev::UpdateFlags(unsigned int modifier) {
  int mask = kEventFlagFromModifiers[modifier];
  bool down = modifiers_down_[modifier];
  bool locked = (modifier_flags_locked_ & mask);
  if (down != locked)
    modifier_flags_ |= mask;
  else
    modifier_flags_ &= ~mask;
}

int EventModifiersEvdev::GetModifierFlags() { return modifier_flags_; }

// static
int EventModifiersEvdev::GetEventFlagFromModifier(unsigned int modifier) {
  return kEventFlagFromModifiers[modifier];
}

}  // namespace ui
