a11y: Update sticky keys to work with Fn modifier
Bug: b/338477733 Change-Id: I29567d81f88fb4bebe66f58cb58fc16accd728ba Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5506937 Reviewed-by: Katie Dektar <katie@chromium.org> Commit-Queue: David Padlipsky <dpad@google.com> Cr-Commit-Position: refs/heads/main@{#1298353}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
0e6e4e0637
commit
8291717b28
@ -56,7 +56,10 @@ ui::EventRewriteStatus RewriteUpdate(
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// StickyKeys
|
||||
StickyKeysController::StickyKeysController()
|
||||
: enabled_(false), mod3_enabled_(false), altgr_enabled_(false) {}
|
||||
: enabled_(false),
|
||||
mod3_enabled_(false),
|
||||
altgr_enabled_(false),
|
||||
fn_enabled_(false) {}
|
||||
|
||||
StickyKeysController::~StickyKeysController() = default;
|
||||
|
||||
@ -79,8 +82,11 @@ void StickyKeysController::Enable(bool enabled) {
|
||||
mod3_sticky_key_ = std::make_unique<StickyKeysHandler>(ui::EF_MOD3_DOWN);
|
||||
search_sticky_key_ =
|
||||
std::make_unique<StickyKeysHandler>(ui::EF_COMMAND_DOWN);
|
||||
fn_sticky_key_ =
|
||||
std::make_unique<StickyKeysHandler>(ui::EF_FUNCTION_DOWN);
|
||||
|
||||
overlay_ = std::make_unique<StickyKeysOverlay>();
|
||||
overlay_->SetModifierVisible(ui::EF_FUNCTION_DOWN, fn_enabled_);
|
||||
overlay_->SetModifierVisible(ui::EF_ALTGR_DOWN, altgr_enabled_);
|
||||
overlay_->SetModifierVisible(ui::EF_MOD3_DOWN, mod3_enabled_);
|
||||
} else if (overlay_) {
|
||||
@ -89,8 +95,8 @@ void StickyKeysController::Enable(bool enabled) {
|
||||
}
|
||||
}
|
||||
|
||||
void StickyKeysController::SetModifiersEnabled(bool mod3_enabled,
|
||||
bool altgr_enabled) {
|
||||
void StickyKeysController::SetMod3AndAltGrModifiersEnabled(bool mod3_enabled,
|
||||
bool altgr_enabled) {
|
||||
mod3_enabled_ = mod3_enabled;
|
||||
altgr_enabled_ = altgr_enabled;
|
||||
if (overlay_) {
|
||||
@ -105,6 +111,13 @@ void StickyKeysController::SetModifiersEnabled(bool mod3_enabled,
|
||||
}
|
||||
}
|
||||
|
||||
void StickyKeysController::SetFnModifierEnabled(bool fn_enabled) {
|
||||
fn_enabled_ = fn_enabled;
|
||||
if (overlay_) {
|
||||
overlay_->SetModifierVisible(ui::EF_FUNCTION_DOWN, fn_enabled_);
|
||||
}
|
||||
}
|
||||
|
||||
void StickyKeysController::UpdateStickyKeysOverlayBoundsIfNeeded() {
|
||||
if (!enabled_)
|
||||
return;
|
||||
@ -146,7 +159,8 @@ ui::EventRewriteStatus StickyKeysController::NextDispatchEvent(
|
||||
altgr_sticky_key_->GetModifierUpEvent(new_event) +
|
||||
ctrl_sticky_key_->GetModifierUpEvent(new_event) +
|
||||
mod3_sticky_key_->GetModifierUpEvent(new_event) +
|
||||
search_sticky_key_->GetModifierUpEvent(new_event);
|
||||
search_sticky_key_->GetModifierUpEvent(new_event) +
|
||||
fn_sticky_key_->GetModifierUpEvent(new_event);
|
||||
if (!new_event)
|
||||
return ui::EVENT_REWRITE_CONTINUE;
|
||||
if (remaining)
|
||||
@ -166,7 +180,8 @@ ui::EventRewriteStatus StickyKeysController::RewriteKeyEvent(
|
||||
altgr_sticky_key_->HandleKeyEvent(event, &mod_down_flags, &released) ||
|
||||
ctrl_sticky_key_->HandleKeyEvent(event, &mod_down_flags, &released) ||
|
||||
mod3_sticky_key_->HandleKeyEvent(event, &mod_down_flags, &released) ||
|
||||
search_sticky_key_->HandleKeyEvent(event, &mod_down_flags, &released);
|
||||
search_sticky_key_->HandleKeyEvent(event, &mod_down_flags, &released) ||
|
||||
fn_sticky_key_->HandleKeyEvent(event, &mod_down_flags, &released);
|
||||
UpdateOverlay();
|
||||
return RewriteUpdate(consumed, released, mod_down_flags, event,
|
||||
rewritten_event);
|
||||
@ -183,7 +198,8 @@ ui::EventRewriteStatus StickyKeysController::RewriteMouseEvent(
|
||||
alt_sticky_key_->HandleMouseEvent(event, &mod_down_flags, &released) ||
|
||||
altgr_sticky_key_->HandleMouseEvent(event, &mod_down_flags, &released) ||
|
||||
ctrl_sticky_key_->HandleMouseEvent(event, &mod_down_flags, &released) ||
|
||||
mod3_sticky_key_->HandleMouseEvent(event, &mod_down_flags, &released);
|
||||
mod3_sticky_key_->HandleMouseEvent(event, &mod_down_flags, &released) ||
|
||||
fn_sticky_key_->HandleMouseEvent(event, &mod_down_flags, &released);
|
||||
return RewriteUpdate(consumed, released, mod_down_flags, event,
|
||||
rewritten_event);
|
||||
}
|
||||
@ -199,7 +215,8 @@ ui::EventRewriteStatus StickyKeysController::RewriteScrollEvent(
|
||||
alt_sticky_key_->HandleScrollEvent(event, &mod_down_flags, &released) ||
|
||||
altgr_sticky_key_->HandleScrollEvent(event, &mod_down_flags, &released) ||
|
||||
ctrl_sticky_key_->HandleScrollEvent(event, &mod_down_flags, &released) ||
|
||||
mod3_sticky_key_->HandleScrollEvent(event, &mod_down_flags, &released);
|
||||
mod3_sticky_key_->HandleScrollEvent(event, &mod_down_flags, &released) ||
|
||||
fn_sticky_key_->HandleScrollEvent(event, &mod_down_flags, &released);
|
||||
return RewriteUpdate(consumed, released, mod_down_flags, event,
|
||||
rewritten_event);
|
||||
}
|
||||
@ -217,6 +234,8 @@ void StickyKeysController::UpdateOverlay() {
|
||||
altgr_sticky_key_->current_state());
|
||||
overlay_->SetModifierKeyState(ui::EF_MOD3_DOWN,
|
||||
mod3_sticky_key_->current_state());
|
||||
overlay_->SetModifierKeyState(ui::EF_FUNCTION_DOWN,
|
||||
fn_sticky_key_->current_state());
|
||||
|
||||
bool key_in_use =
|
||||
shift_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED ||
|
||||
@ -224,7 +243,8 @@ void StickyKeysController::UpdateOverlay() {
|
||||
altgr_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED ||
|
||||
ctrl_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED ||
|
||||
search_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED ||
|
||||
mod3_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED;
|
||||
mod3_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED ||
|
||||
fn_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED;
|
||||
|
||||
overlay_->Show(enabled_ && key_in_use);
|
||||
}
|
||||
@ -352,6 +372,8 @@ StickyKeysHandler::KeyEventType StickyKeysHandler::TranslateKeyEvent(
|
||||
is_target_key = (modifier_flag_ == ui::EF_MOD3_DOWN);
|
||||
} else if (key_code == ui::VKEY_LWIN || key_code == ui::VKEY_RWIN) {
|
||||
is_target_key = (modifier_flag_ == ui::EF_COMMAND_DOWN);
|
||||
} else if (key_code == ui::VKEY_FUNCTION) {
|
||||
is_target_key = (modifier_flag_ == ui::EF_FUNCTION_DOWN);
|
||||
} else {
|
||||
return type == ui::ET_KEY_PRESSED ? NORMAL_KEY_DOWN : NORMAL_KEY_UP;
|
||||
}
|
||||
|
@ -72,7 +72,9 @@ class ASH_EXPORT StickyKeysController : public ui::EventRewriter {
|
||||
// Activate sticky keys to intercept and modify incoming events.
|
||||
void Enable(bool enabled);
|
||||
|
||||
void SetModifiersEnabled(bool mod3_enabled, bool altgr_enabled);
|
||||
void SetMod3AndAltGrModifiersEnabled(bool mod3_enabled, bool altgr_enabled);
|
||||
|
||||
void SetFnModifierEnabled(bool fn_enabled);
|
||||
|
||||
// Update StickyKeysOverlay bounds (e.g. if the workspace area changed).
|
||||
void UpdateStickyKeysOverlayBoundsIfNeeded();
|
||||
@ -119,6 +121,9 @@ class ASH_EXPORT StickyKeysController : public ui::EventRewriter {
|
||||
// Whether the current layout has an altgr key.
|
||||
bool altgr_enabled_;
|
||||
|
||||
// Whether the current internal keyboard has an fn key.
|
||||
bool fn_enabled_;
|
||||
|
||||
// Sticky key handlers.
|
||||
std::unique_ptr<StickyKeysHandler> shift_sticky_key_;
|
||||
std::unique_ptr<StickyKeysHandler> alt_sticky_key_;
|
||||
@ -126,6 +131,7 @@ class ASH_EXPORT StickyKeysController : public ui::EventRewriter {
|
||||
std::unique_ptr<StickyKeysHandler> ctrl_sticky_key_;
|
||||
std::unique_ptr<StickyKeysHandler> mod3_sticky_key_;
|
||||
std::unique_ptr<StickyKeysHandler> search_sticky_key_;
|
||||
std::unique_ptr<StickyKeysHandler> fn_sticky_key_;
|
||||
|
||||
std::unique_ptr<StickyKeysOverlay> overlay_;
|
||||
};
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include "ui/base/resource/resource_bundle.h"
|
||||
#include "ui/compositor/layer.h"
|
||||
#include "ui/compositor/scoped_layer_animation_settings.h"
|
||||
#include "ui/events/event_constants.h"
|
||||
#include "ui/gfx/canvas.h"
|
||||
#include "ui/gfx/font_list.h"
|
||||
#include "ui/gfx/geometry/insets.h"
|
||||
@ -159,6 +160,7 @@ StickyKeysOverlayView::StickyKeysOverlayView() {
|
||||
AddKeyLabel(ui::EF_SHIFT_DOWN, l10n_util::GetStringUTF8(IDS_ASH_SHIFT_KEY));
|
||||
AddKeyLabel(ui::EF_COMMAND_DOWN,
|
||||
l10n_util::GetStringUTF8(IDS_ASH_SEARCH_KEY));
|
||||
AddKeyLabel(ui::EF_FUNCTION_DOWN, l10n_util::GetStringUTF8(IDS_ASH_FN_KEY));
|
||||
AddKeyLabel(ui::EF_ALTGR_DOWN, l10n_util::GetStringUTF8(IDS_ASH_ALTGR_KEY));
|
||||
AddKeyLabel(ui::EF_MOD3_DOWN, l10n_util::GetStringUTF8(IDS_ASH_MOD3_KEY));
|
||||
}
|
||||
|
@ -232,6 +232,49 @@ TEST_F(StickyKeysTest, BasicOneshotScenarioTest) {
|
||||
EXPECT_FALSE(mod_down_flags & ui::EF_SHIFT_DOWN);
|
||||
}
|
||||
|
||||
TEST_F(StickyKeysTest, BasicOneshotScenarioFnTest) {
|
||||
std::unique_ptr<ui::KeyEvent> ev;
|
||||
StickyKeysHandler sticky_key(ui::EF_FUNCTION_DOWN);
|
||||
|
||||
EXPECT_EQ(STICKY_KEY_STATE_DISABLED, sticky_key.current_state());
|
||||
|
||||
// By typing Fn key, internal state become ENABLED.
|
||||
SendActivateStickyKeyPattern(&sticky_key, ui::VKEY_FUNCTION);
|
||||
EXPECT_EQ(STICKY_KEY_STATE_ENABLED, sticky_key.current_state());
|
||||
|
||||
ev.reset(GenerateKey(ui::ET_KEY_PRESSED, ui::VKEY_A));
|
||||
bool released = false;
|
||||
int mod_down_flags = 0;
|
||||
HandleKeyEvent(*ev.get(), &sticky_key, &mod_down_flags, &released);
|
||||
// Next keyboard event is fn modified.
|
||||
EXPECT_TRUE(mod_down_flags & ui::EF_FUNCTION_DOWN);
|
||||
// Modifier release notification happens.
|
||||
EXPECT_TRUE(released);
|
||||
|
||||
ev.reset(GenerateKey(ui::ET_KEY_RELEASED, ui::VKEY_A));
|
||||
released = false;
|
||||
mod_down_flags = 0;
|
||||
HandleKeyEvent(*ev.get(), &sticky_key, &mod_down_flags, &released);
|
||||
|
||||
EXPECT_EQ(STICKY_KEY_STATE_DISABLED, sticky_key.current_state());
|
||||
// Making sure Function up keyboard event is available.
|
||||
std::unique_ptr<ui::Event> up_event;
|
||||
ASSERT_EQ(0, sticky_key.GetModifierUpEvent(&up_event));
|
||||
EXPECT_TRUE(up_event.get());
|
||||
EXPECT_EQ(ui::ET_KEY_RELEASED, up_event->type());
|
||||
EXPECT_EQ(ui::VKEY_FUNCTION,
|
||||
static_cast<const ui::KeyEvent*>(up_event.get())->key_code());
|
||||
|
||||
// Enabled state is one shot, so next key event should not be fn modified.
|
||||
ev.reset(GenerateKey(ui::ET_KEY_PRESSED, ui::VKEY_A));
|
||||
mod_down_flags = HandleKeyEventForDownFlags(*ev.get(), &sticky_key);
|
||||
EXPECT_FALSE(mod_down_flags & ui::EF_FUNCTION_DOWN);
|
||||
|
||||
ev.reset(GenerateKey(ui::ET_KEY_RELEASED, ui::VKEY_A));
|
||||
mod_down_flags = HandleKeyEventForDownFlags(*ev.get(), &sticky_key);
|
||||
EXPECT_FALSE(mod_down_flags & ui::EF_FUNCTION_DOWN);
|
||||
}
|
||||
|
||||
TEST_F(StickyKeysTest, AltGrKey) {
|
||||
std::unique_ptr<ui::KeyEvent> ev;
|
||||
StickyKeysHandler altgr_sticky_key(ui::EF_ALTGR_DOWN);
|
||||
|
@ -2451,6 +2451,9 @@ Style notes:
|
||||
<message name="IDS_ASH_MOD3_KEY" desc="Name of ISOLevel5 (mod3) key name. Shouldn't be translated in many languages actually. This name should be lower case.">
|
||||
mod3
|
||||
</message>
|
||||
<message name="IDS_ASH_FN_KEY" desc="Name of [Fn] key name. Shouldn't be translated in many languages actually. This name should be lower case.">
|
||||
fn
|
||||
</message>
|
||||
|
||||
<!-- Dictation -->
|
||||
<message name="IDS_ASH_DICTATION_BUTTON_ACCESSIBLE_NAME" desc="The accessible name for the Dictation button in the system tray.">
|
||||
|
1
ash/ash_strings_grd/IDS_ASH_FN_KEY.png.sha1
Normal file
1
ash/ash_strings_grd/IDS_ASH_FN_KEY.png.sha1
Normal file
@ -0,0 +1 @@
|
||||
845ab34d2dd6323f71960fbf3f0ab0675dc011ba
|
@ -108,6 +108,9 @@
|
||||
#include "ui/base/ime/ash/extension_ime_util.h"
|
||||
#include "ui/base/l10n/l10n_util.h"
|
||||
#include "ui/base/resource/resource_bundle.h"
|
||||
#include "ui/events/ash/keyboard_capability.h"
|
||||
#include "ui/events/devices/device_data_manager.h"
|
||||
#include "ui/events/devices/input_device_event_observer.h"
|
||||
#include "ui/events/keycodes/keyboard_codes_posix.h"
|
||||
#include "ui/strings/grit/ui_strings.h"
|
||||
#include "ui/views/widget/widget.h"
|
||||
@ -578,6 +581,8 @@ AccessibilityManager::AccessibilityManager() {
|
||||
|
||||
CrasAudioHandler::Get()->AddAudioObserver(this);
|
||||
|
||||
ui::DeviceDataManager::GetInstance()->AddObserver(this);
|
||||
|
||||
dlc_installer_ = std::make_unique<AccessibilityDlcInstaller>();
|
||||
}
|
||||
|
||||
@ -586,6 +591,7 @@ AccessibilityManager::~AccessibilityManager() {
|
||||
AccessibilityStatusEventDetails details(
|
||||
AccessibilityNotificationType::kManagerShutdown, false);
|
||||
NotifyAccessibilityStatusChanged(details);
|
||||
ui::DeviceDataManager::GetInstance()->RemoveObserver(this);
|
||||
CrasAudioHandler::Get()->RemoveAudioObserver(this);
|
||||
user_manager::UserManager::Get()->RemoveSessionStateObserver(this);
|
||||
input_method::InputMethodManager::Get()->RemoveObserver(this);
|
||||
@ -1503,7 +1509,7 @@ void AccessibilityManager::InputMethodChanged(
|
||||
input_method::InputMethodManager* manager,
|
||||
Profile* /* profile */,
|
||||
bool show_message) {
|
||||
Shell::Get()->sticky_keys_controller()->SetModifiersEnabled(
|
||||
Shell::Get()->sticky_keys_controller()->SetMod3AndAltGrModifiersEnabled(
|
||||
manager->IsISOLevel5ShiftUsedByCurrentInputMethod(),
|
||||
manager->IsAltGrUsedByCurrentInputMethod());
|
||||
const input_method::InputMethodDescriptor descriptor =
|
||||
@ -3025,4 +3031,16 @@ void AccessibilityManager::SendSyntheticMouseEvent(
|
||||
}
|
||||
}
|
||||
|
||||
void AccessibilityManager::OnInputDeviceConfigurationChanged(
|
||||
uint8_t input_device_type) {
|
||||
if (input_device_type & ui::InputDeviceEventObserver::kKeyboard) {
|
||||
Shell::Get()->sticky_keys_controller()->SetFnModifierEnabled(
|
||||
Shell::Get()->keyboard_capability()->HasFunctionKeyOnAnyKeyboard());
|
||||
}
|
||||
}
|
||||
void AccessibilityManager::OnDeviceListsComplete() {
|
||||
Shell::Get()->sticky_keys_controller()->SetFnModifierEnabled(
|
||||
Shell::Get()->keyboard_capability()->HasFunctionKeyOnAnyKeyboard());
|
||||
}
|
||||
|
||||
} // namespace ash
|
||||
|
@ -42,6 +42,7 @@
|
||||
#include "ui/accessibility/ax_enums.mojom-forward.h"
|
||||
#include "ui/base/ime/ash/input_method_manager.h"
|
||||
#include "ui/events/base_event_utils.h"
|
||||
#include "ui/events/devices/input_device_event_observer.h"
|
||||
#include "ui/wm/core/coordinate_conversion.h"
|
||||
|
||||
namespace content {
|
||||
@ -129,7 +130,8 @@ class AccessibilityManager
|
||||
public input_method::InputMethodManager::Observer,
|
||||
public CrasAudioHandler::AudioObserver,
|
||||
public ProfileObserver,
|
||||
public speech::SodaInstaller::Observer {
|
||||
public speech::SodaInstaller::Observer,
|
||||
public ui::InputDeviceEventObserver {
|
||||
public:
|
||||
AccessibilityManager(const AccessibilityManager&) = delete;
|
||||
AccessibilityManager& operator=(const AccessibilityManager&) = delete;
|
||||
@ -434,6 +436,10 @@ class AccessibilityManager
|
||||
void OnSodaProgress(speech::LanguageCode language_code,
|
||||
int progress) override;
|
||||
|
||||
// ui::InputDeviceEventObserver
|
||||
void OnInputDeviceConfigurationChanged(uint8_t input_device_type) override;
|
||||
void OnDeviceListsComplete() override;
|
||||
|
||||
// Test helpers:
|
||||
void SetProfileForTest(Profile* profile);
|
||||
static void SetBrailleControllerForTest(
|
||||
|
@ -4532,29 +4532,36 @@ TEST_P(StickyKeysOverlayTest, ModifierVisibility) {
|
||||
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_COMMAND_DOWN));
|
||||
EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
|
||||
EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
|
||||
EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_FUNCTION_DOWN));
|
||||
|
||||
// Turn all modifiers on.
|
||||
auto* sticky_keys_controller = Shell::Get()->sticky_keys_controller();
|
||||
sticky_keys_controller->SetModifiersEnabled(true, true);
|
||||
sticky_keys_controller->SetMod3AndAltGrModifiersEnabled(true, true);
|
||||
sticky_keys_controller->SetFnModifierEnabled(true);
|
||||
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_CONTROL_DOWN));
|
||||
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_SHIFT_DOWN));
|
||||
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALT_DOWN));
|
||||
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_COMMAND_DOWN));
|
||||
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
|
||||
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
|
||||
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_FUNCTION_DOWN));
|
||||
|
||||
// Turn off Fn.
|
||||
sticky_keys_controller->SetFnModifierEnabled(false);
|
||||
EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_FUNCTION_DOWN));
|
||||
|
||||
// Turn off Mod3.
|
||||
sticky_keys_controller->SetModifiersEnabled(false, true);
|
||||
sticky_keys_controller->SetMod3AndAltGrModifiersEnabled(false, true);
|
||||
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
|
||||
EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
|
||||
|
||||
// Turn off AltGr.
|
||||
sticky_keys_controller->SetModifiersEnabled(true, false);
|
||||
sticky_keys_controller->SetMod3AndAltGrModifiersEnabled(true, false);
|
||||
EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
|
||||
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
|
||||
|
||||
// Turn off AltGr and Mod3.
|
||||
sticky_keys_controller->SetModifiersEnabled(false, false);
|
||||
sticky_keys_controller->SetMod3AndAltGrModifiersEnabled(false, false);
|
||||
EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
|
||||
EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
|
||||
}
|
||||
|
@ -980,6 +980,16 @@ bool KeyboardCapability::HasFunctionKey(int device_id) const {
|
||||
return HasFunctionKey(*keyboard);
|
||||
}
|
||||
|
||||
bool KeyboardCapability::HasFunctionKeyOnAnyKeyboard() const {
|
||||
for (const ui::KeyboardDevice& keyboard :
|
||||
ui::DeviceDataManager::GetInstance()->GetKeyboardDevices()) {
|
||||
if (HasFunctionKey(keyboard)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool KeyboardCapability::HasRightAltKey(const KeyboardDevice& keyboard) const {
|
||||
if (ash::features::IsSplitKeyboardRefactorEnabled()) {
|
||||
return true;
|
||||
|
@ -360,6 +360,7 @@ class KeyboardCapability : public InputDeviceEventObserver {
|
||||
// Check if the Function key exists on the given keyboard.
|
||||
bool HasFunctionKey(const KeyboardDevice& keyboard) const;
|
||||
bool HasFunctionKey(int device_id) const;
|
||||
bool HasFunctionKeyOnAnyKeyboard() const;
|
||||
|
||||
// Check if the RightAlt key exists on the given keyboard.
|
||||
bool HasRightAltKey(const KeyboardDevice& keyboard) const;
|
||||
|
Reference in New Issue
Block a user