blob: 143d9ca871f440526486074462e2f78f9f4ccca3 [file] [log] [blame]
// Copyright 2018 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 <atk/atk.h>
#include "ui/accessibility/platform/atk_util_auralinux.h"
#include "ui/events/x/events_x_utils.h"
namespace ui {
// static
DiscardAtkKeyEvent AtkUtilAuraLinux::HandleKeyEvent(XEvent* xevent) {
if (!GetInstance()->ShouldEnableAccessibility())
return DiscardAtkKeyEvent::Retain;
AtkKeyEventStruct atk_key_event;
if (xevent->type == KeyPress)
atk_key_event.type = ATK_KEY_EVENT_PRESS;
else if (xevent->type == KeyRelease)
atk_key_event.type = ATK_KEY_EVENT_RELEASE;
else
NOTREACHED() << xevent->type;
XKeyEvent& xkey = xevent->xkey;
KeySym keysym = NoSymbol;
XLookupString(&xkey, nullptr, 0, &keysym, nullptr);
atk_key_event.state = xkey.state;
atk_key_event.keyval = keysym;
atk_key_event.keycode = xkey.keycode;
atk_key_event.timestamp = 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(*xevent);
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 HandleAtkKeyEvent(&atk_key_event);
}
} // namespace ui