// Copyright (c) 2009 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.

#ifndef APP_MENUS_ACCELERATOR_GTK_H_
#define APP_MENUS_ACCELERATOR_GTK_H_
#pragma once

#include <gdk/gdk.h>

#include "app/keyboard_code_conversion_gtk.h"
#include "app/keyboard_codes_posix.h"
#include "app/menus/accelerator.h"

namespace menus {

class AcceleratorGtk : public Accelerator {
 public:
  AcceleratorGtk(app::KeyboardCode key_code,
                 bool shift_pressed, bool ctrl_pressed, bool alt_pressed)
      : gdk_keyval_(0) {
    key_code_ = key_code;
    modifiers_ = 0;
    if (shift_pressed)
      modifiers_ |= GDK_SHIFT_MASK;
    if (ctrl_pressed)
      modifiers_ |= GDK_CONTROL_MASK;
    if (alt_pressed)
      modifiers_ |= GDK_MOD1_MASK;
  }

  AcceleratorGtk(guint keyval, GdkModifierType modifier_type) {
    key_code_ = app::WindowsKeyCodeForGdkKeyCode(keyval);
    gdk_keyval_ = keyval;
    modifiers_ = modifier_type;
  }

  AcceleratorGtk() : gdk_keyval_(0) { }
  virtual ~AcceleratorGtk() { }

  guint GetGdkKeyCode() const {
    return gdk_keyval_ > 0 ?
           // The second parameter is false because accelerator keys are
           // expressed in terms of the non-shift-modified key.
           gdk_keyval_ : app::GdkKeyCodeForWindowsKeyCode(key_code_, false);
  }

  GdkModifierType gdk_modifier_type() {
    return static_cast<GdkModifierType>(modifiers());
  }

 private:
  // The GDK keycode.
  guint gdk_keyval_;
};

}  // namespace menus

#endif  // APP_MENUS_ACCELERATOR_GTK_H_
