blob: 4138f9c554461752dc0a8efb523625d9fef07dec [file] [log] [blame]
// Copyright 2019 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/platform_window/x11/atk_event_conversion.h"
#include "base/check.h"
#include "base/notreached.h"
#include "ui/events/x/events_x_utils.h"
#include "ui/gfx/x/xproto.h"
#include "ui/gfx/x/xproto_types.h"
namespace ui {
std::unique_ptr<AtkKeyEventStruct> AtkKeyEventFromXEvent(
x11::Event* x11_event) {
DCHECK(x11_event);
auto atk_key_event = std::make_unique<AtkKeyEventStruct>();
auto* xkey = x11_event->As<x11::KeyEvent>();
DCHECK(xkey);
atk_key_event->type = xkey->opcode == x11::KeyEvent::Press
? ATK_KEY_EVENT_PRESS
: ATK_KEY_EVENT_RELEASE;
auto state = static_cast<int>(xkey->state);
auto keycode = static_cast<int>(xkey->detail);
auto keysym = x11::Connection::Get()->KeycodeToKeysym(keycode, state);
atk_key_event->state = state;
atk_key_event->keyval = static_cast<uint32_t>(keysym);
atk_key_event->keycode = keycode;
atk_key_event->timestamp = static_cast<uint32_t>(xkey->time);
// This string property matches the one that was removed from GdkEventKey. In
// the future, ATK clients should no longer rely on it, so we set it to null.
atk_key_event->string = nullptr;
atk_key_event->length = 0;
int flags = ui::EventFlagsFromXEvent(*x11_event);
if (flags & ui::EF_SHIFT_DOWN)
atk_key_event->state |= AtkKeyModifierMask::kAtkShiftMask;
if (flags & ui::EF_CAPS_LOCK_ON)
atk_key_event->state |= AtkKeyModifierMask::kAtkLockMask;
if (flags & ui::EF_CONTROL_DOWN)
atk_key_event->state |= AtkKeyModifierMask::kAtkControlMask;
if (flags & ui::EF_ALT_DOWN)
atk_key_event->state |= AtkKeyModifierMask::kAtkMod1Mask;
if (flags & ui::EF_NUM_LOCK_ON)
atk_key_event->state |= AtkKeyModifierMask::kAtkMod2Mask;
if (flags & ui::EF_MOD3_DOWN)
atk_key_event->state |= AtkKeyModifierMask::kAtkMod3Mask;
if (flags & ui::EF_COMMAND_DOWN)
atk_key_event->state |= AtkKeyModifierMask::kAtkMod4Mask;
if (flags & ui::EF_ALTGR_DOWN)
atk_key_event->state |= AtkKeyModifierMask::KAtkMod5Mask;
return atk_key_event;
}
} // namespace ui