// Copyright (c) 2012 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/base/accelerators/platform_accelerator_gtk.h" #include "ui/events/keycodes/keyboard_code_conversion_gtk.h" namespace ui { namespace { int GdkModifierToEventFlag(GdkModifierType gdk_modifier) { int event_flags = 0; if (gdk_modifier & GDK_SHIFT_MASK) event_flags |= EF_SHIFT_DOWN; if (gdk_modifier & GDK_CONTROL_MASK) event_flags |= EF_CONTROL_DOWN; if (gdk_modifier & GDK_MOD1_MASK) event_flags |= EF_ALT_DOWN; return event_flags; } GdkModifierType EventFlagToGdkModifier(int event_flag) { int modifier = 0; if (event_flag & EF_SHIFT_DOWN) modifier |= GDK_SHIFT_MASK; if (event_flag & EF_CONTROL_DOWN) modifier |= GDK_CONTROL_MASK; if (event_flag & EF_ALT_DOWN) modifier |= GDK_MOD1_MASK; return static_cast<GdkModifierType>(modifier); } } // namespace PlatformAcceleratorGtk::PlatformAcceleratorGtk() : gdk_key_code_(0), gdk_modifier_(static_cast<GdkModifierType>(0)) { } PlatformAcceleratorGtk::PlatformAcceleratorGtk(guint gdk_key_code, GdkModifierType gdk_modifier) : gdk_key_code_(gdk_key_code), gdk_modifier_(gdk_modifier) { } PlatformAcceleratorGtk::~PlatformAcceleratorGtk() { } scoped_ptr<PlatformAccelerator> PlatformAcceleratorGtk::CreateCopy() const { scoped_ptr<PlatformAcceleratorGtk> copy(new PlatformAcceleratorGtk); copy->gdk_key_code_ = gdk_key_code_; copy->gdk_modifier_ = gdk_modifier_; return scoped_ptr<PlatformAccelerator>(copy.release()); } bool PlatformAcceleratorGtk::Equals(const PlatformAccelerator& rhs) const { const PlatformAcceleratorGtk& rhs_gtk = static_cast<const PlatformAcceleratorGtk&>(rhs); return gdk_key_code_ == rhs_gtk.gdk_key_code_ && gdk_modifier_ == rhs_gtk.gdk_modifier_; } Accelerator AcceleratorForGdkKeyCodeAndModifier(guint gdk_key_code, GdkModifierType gdk_modifier) { ui::Accelerator accelerator(ui::WindowsKeyCodeForGdkKeyCode(gdk_key_code), ui::GdkModifierToEventFlag(gdk_modifier)); scoped_ptr<PlatformAccelerator> platform_accelerator( new PlatformAcceleratorGtk(gdk_key_code, gdk_modifier)); accelerator.set_platform_accelerator(platform_accelerator.Pass()); return accelerator; } guint GetGdkKeyCodeForAccelerator(const Accelerator& accelerator) { if (accelerator.platform_accelerator()) { return static_cast<const PlatformAcceleratorGtk*>( accelerator.platform_accelerator())->gdk_key_code(); } // The second parameter is false because accelerator keys are expressed in // terms of the non-shift-modified key. return GdkKeyCodeForWindowsKeyCode(accelerator.key_code(), false); } GdkModifierType GetGdkModifierForAccelerator(const Accelerator& accelerator) { if (accelerator.platform_accelerator()) { return static_cast<const PlatformAcceleratorGtk*>( accelerator.platform_accelerator())->gdk_modifier(); } return EventFlagToGdkModifier(accelerator.modifiers()); } } // namespace ui