1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ui/base/accelerators/platform_accelerator_gtk.h"
6
7#include "ui/base/events/event_conversion_gtk.h"
8#include "ui/base/keycodes/keyboard_code_conversion_gtk.h"
9
10namespace ui {
11
12PlatformAcceleratorGtk::PlatformAcceleratorGtk()
13    : gdk_key_code_(0),
14      gdk_modifier_(static_cast<GdkModifierType>(0)) {
15}
16
17PlatformAcceleratorGtk::PlatformAcceleratorGtk(guint gdk_key_code,
18                                               GdkModifierType gdk_modifier)
19    : gdk_key_code_(gdk_key_code),
20      gdk_modifier_(gdk_modifier) {
21}
22
23PlatformAcceleratorGtk::~PlatformAcceleratorGtk() {
24}
25
26scoped_ptr<PlatformAccelerator> PlatformAcceleratorGtk::CreateCopy() const {
27  scoped_ptr<PlatformAcceleratorGtk> copy(new PlatformAcceleratorGtk);
28  copy->gdk_key_code_ = gdk_key_code_;
29  copy->gdk_modifier_ = gdk_modifier_;
30  return scoped_ptr<PlatformAccelerator>(copy.release());
31}
32
33bool PlatformAcceleratorGtk::Equals(const PlatformAccelerator& rhs) const {
34  const PlatformAcceleratorGtk& rhs_gtk =
35      static_cast<const PlatformAcceleratorGtk&>(rhs);
36  return gdk_key_code_ == rhs_gtk.gdk_key_code_ &&
37         gdk_modifier_ == rhs_gtk.gdk_modifier_;
38}
39
40Accelerator AcceleratorForGdkKeyCodeAndModifier(guint gdk_key_code,
41                                                GdkModifierType gdk_modifier) {
42  ui::Accelerator accelerator(ui::WindowsKeyCodeForGdkKeyCode(gdk_key_code),
43                              ui::GdkModifierToEventFlag(gdk_modifier));
44  scoped_ptr<PlatformAccelerator> platform_accelerator(
45      new PlatformAcceleratorGtk(gdk_key_code, gdk_modifier));
46  accelerator.set_platform_accelerator(platform_accelerator.Pass());
47  return accelerator;
48}
49
50guint GetGdkKeyCodeForAccelerator(const Accelerator& accelerator) {
51  if (accelerator.platform_accelerator()) {
52    return static_cast<const PlatformAcceleratorGtk*>(
53        accelerator.platform_accelerator())->gdk_key_code();
54  }
55  // The second parameter is false because accelerator keys are expressed in
56  // terms of the non-shift-modified key.
57  return GdkKeyCodeForWindowsKeyCode(accelerator.key_code(), false);
58}
59
60GdkModifierType GetGdkModifierForAccelerator(const Accelerator& accelerator) {
61  if (accelerator.platform_accelerator()) {
62    return static_cast<const PlatformAcceleratorGtk*>(
63        accelerator.platform_accelerator())->gdk_modifier();
64  }
65  return EventFlagToGdkModifier(accelerator.modifiers());
66}
67
68}  // namespace ui
69