Commit e9a93954 authored by Avi Drissman's avatar Avi Drissman Committed by Commit Bot

Revert "[Ash] Simplify accessibility tray view"

This reverts commit 249ce21a.

Reason for revert: 

Suspicion of breaking 30-odd accessibility tests (DumpAccessibilityEventsTest.*, DumpAccessibilityTreeTest.*) starting with

https://ci.chromium.org/p/chromium/builders/ci/linux-trusty-rel/15793
https://ci.chromium.org/p/chromium/builders/ci/Linux%20MSan%20Tests/25463


Original change's description:
> [Ash] Simplify accessibility tray view
> 
> After refactoring of AccessibilityControllerImpl, we can finally
> leverage that modularity by removing tons of identical calls.
> 
> Bug: 2390184
> Change-Id: I1c42bff577a844af80584ba6acd8da81e7b9b704
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2398687
> Commit-Queue: Anatoliy Potapchuk <apotapchuk@chromium.org>
> Reviewed-by: Xiyuan Xia <xiyuan@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#806594}

TBR=xiyuan@chromium.org,apotapchuk@chromium.org

Change-Id: Iaee9d02267fd87eabc94930da410ff870079282c
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: 2390184
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2410341Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Commit-Queue: Avi Drissman <avi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#806658}
parent 834b0fa2
...@@ -88,7 +88,7 @@ const FeatureData kFeatures[] = { ...@@ -88,7 +88,7 @@ const FeatureData kFeatures[] = {
&kSystemMenuAccessibilityAutoClickIcon}, &kSystemMenuAccessibilityAutoClickIcon},
{FeatureType::kCaretHighlight, prefs::kAccessibilityCaretHighlightEnabled, {FeatureType::kCaretHighlight, prefs::kAccessibilityCaretHighlightEnabled,
nullptr}, nullptr},
{FeatureType::kCursorHighlight, prefs::kAccessibilityCursorHighlightEnabled, {FeatureType::KCursorHighlight, prefs::kAccessibilityCursorHighlightEnabled,
nullptr}, nullptr},
{FeatureType::kCursorColor, prefs::kAccessibilityCursorColorEnabled, {FeatureType::kCursorColor, prefs::kAccessibilityCursorColorEnabled,
nullptr}, nullptr},
...@@ -565,14 +565,6 @@ void AccessibilityControllerImpl::CreateAccessibilityFeatures() { ...@@ -565,14 +565,6 @@ void AccessibilityControllerImpl::CreateAccessibilityFeatures() {
for (auto feature_data : kFeatures) { for (auto feature_data : kFeatures) {
DCHECK(!features_[feature_data.type]); DCHECK(!features_[feature_data.type]);
auto it = dialogs.find(feature_data.type); auto it = dialogs.find(feature_data.type);
// Some features have custom logic.
if (feature_data.type == FeatureType::kSwitchAccess) {
features_[feature_data.type] = std::make_unique<SwitchAccessFeature>(
feature_data.type, feature_data.pref, feature_data.icon, this);
continue;
}
if (it == dialogs.end()) { if (it == dialogs.end()) {
features_[feature_data.type] = std::make_unique<Feature>( features_[feature_data.type] = std::make_unique<Feature>(
feature_data.type, feature_data.pref, feature_data.icon, this); feature_data.type, feature_data.pref, feature_data.icon, this);
...@@ -581,8 +573,6 @@ void AccessibilityControllerImpl::CreateAccessibilityFeatures() { ...@@ -581,8 +573,6 @@ void AccessibilityControllerImpl::CreateAccessibilityFeatures() {
feature_data.type, feature_data.pref, feature_data.icon, it->second, feature_data.type, feature_data.pref, feature_data.icon, it->second,
this); this);
} }
features_[feature_data.type]->SetConflictingFeature(
feature_data.conflicting_feature);
} }
} }
...@@ -778,7 +768,7 @@ AccessibilityControllerImpl::caret_highlight() const { ...@@ -778,7 +768,7 @@ AccessibilityControllerImpl::caret_highlight() const {
AccessibilityControllerImpl::Feature& AccessibilityControllerImpl::Feature&
AccessibilityControllerImpl::cursor_highlight() const { AccessibilityControllerImpl::cursor_highlight() const {
return GetFeature(FeatureType::kCursorHighlight); return GetFeature(FeatureType::KCursorHighlight);
} }
AccessibilityControllerImpl::Feature& AccessibilityControllerImpl::Feature&
...@@ -854,6 +844,113 @@ AccessibilityControllerImpl::virtual_keyboard() const { ...@@ -854,6 +844,113 @@ AccessibilityControllerImpl::virtual_keyboard() const {
return GetFeature(FeatureType::kVirtualKeyboard); return GetFeature(FeatureType::kVirtualKeyboard);
} }
bool AccessibilityControllerImpl::IsAutoclickSettingVisibleInTray() {
return autoclick().IsVisibleInTray();
}
bool AccessibilityControllerImpl::IsEnterpriseIconVisibleForAutoclick() {
return autoclick().IsEnterpriseIconVisible();
}
bool AccessibilityControllerImpl::IsPrimarySettingsViewVisibleInTray() {
return (IsSpokenFeedbackSettingVisibleInTray() ||
IsSelectToSpeakSettingVisibleInTray() ||
IsDictationSettingVisibleInTray() ||
IsHighContrastSettingVisibleInTray() ||
IsFullScreenMagnifierSettingVisibleInTray() ||
IsDockedMagnifierSettingVisibleInTray() ||
IsAutoclickSettingVisibleInTray() ||
IsVirtualKeyboardSettingVisibleInTray() ||
IsSwitchAccessSettingVisibleInTray());
}
bool AccessibilityControllerImpl::IsAdditionalSettingsViewVisibleInTray() {
return (IsLargeCursorSettingVisibleInTray() ||
IsMonoAudioSettingVisibleInTray() ||
IsCaretHighlightSettingVisibleInTray() ||
IsCursorHighlightSettingVisibleInTray() ||
IsFocusHighlightSettingVisibleInTray() ||
IsStickyKeysSettingVisibleInTray());
}
bool AccessibilityControllerImpl::IsAdditionalSettingsSeparatorVisibleInTray() {
return IsPrimarySettingsViewVisibleInTray() &&
IsAdditionalSettingsViewVisibleInTray();
}
bool AccessibilityControllerImpl::IsCaretHighlightSettingVisibleInTray() {
return caret_highlight().IsVisibleInTray();
}
bool AccessibilityControllerImpl::IsEnterpriseIconVisibleForCaretHighlight() {
return caret_highlight().IsEnterpriseIconVisible();
}
bool AccessibilityControllerImpl::IsCursorHighlightSettingVisibleInTray() {
return cursor_highlight().IsVisibleInTray();
}
bool AccessibilityControllerImpl::IsEnterpriseIconVisibleForCursorHighlight() {
return cursor_highlight().IsEnterpriseIconVisible();
}
bool AccessibilityControllerImpl::IsDictationSettingVisibleInTray() {
return dictation().IsVisibleInTray();
}
bool AccessibilityControllerImpl::IsEnterpriseIconVisibleForDictation() {
return dictation().IsEnterpriseIconVisible();
}
bool AccessibilityControllerImpl::IsFocusHighlightSettingVisibleInTray() {
return focus_highlight().IsVisibleInTray();
}
bool AccessibilityControllerImpl::IsEnterpriseIconVisibleForFocusHighlight() {
return focus_highlight().IsEnterpriseIconVisible();
}
bool AccessibilityControllerImpl::IsFullScreenMagnifierSettingVisibleInTray() {
return fullscreen_magnifier().IsVisibleInTray();
}
bool AccessibilityControllerImpl::
IsEnterpriseIconVisibleForFullScreenMagnifier() {
return fullscreen_magnifier().IsEnterpriseIconVisible();
}
bool AccessibilityControllerImpl::IsDockedMagnifierSettingVisibleInTray() {
return docked_magnifier().IsVisibleInTray();
}
bool AccessibilityControllerImpl::IsEnterpriseIconVisibleForDockedMagnifier() {
return docked_magnifier().IsEnterpriseIconVisible();
}
bool AccessibilityControllerImpl::IsHighContrastSettingVisibleInTray() {
return high_contrast().IsVisibleInTray();
}
bool AccessibilityControllerImpl::IsEnterpriseIconVisibleForHighContrast() {
return high_contrast().IsEnterpriseIconVisible();
}
bool AccessibilityControllerImpl::IsLargeCursorSettingVisibleInTray() {
return large_cursor().IsVisibleInTray();
}
bool AccessibilityControllerImpl::IsEnterpriseIconVisibleForLargeCursor() {
return large_cursor().IsEnterpriseIconVisible();
}
bool AccessibilityControllerImpl::IsMonoAudioSettingVisibleInTray() {
return mono_audio().IsVisibleInTray();
}
bool AccessibilityControllerImpl::IsEnterpriseIconVisibleForMonoAudio() {
return mono_audio().IsEnterpriseIconVisible();
}
void AccessibilityControllerImpl::SetSpokenFeedbackEnabled( void AccessibilityControllerImpl::SetSpokenFeedbackEnabled(
bool enabled, bool enabled,
AccessibilityNotificationVisibility notify) { AccessibilityNotificationVisibility notify) {
...@@ -870,6 +967,22 @@ void AccessibilityControllerImpl::SetSpokenFeedbackEnabled( ...@@ -870,6 +967,22 @@ void AccessibilityControllerImpl::SetSpokenFeedbackEnabled(
ShowAccessibilityNotification(type); ShowAccessibilityNotification(type);
} }
bool AccessibilityControllerImpl::IsSpokenFeedbackSettingVisibleInTray() {
return spoken_feedback().IsVisibleInTray();
}
bool AccessibilityControllerImpl::IsEnterpriseIconVisibleForSpokenFeedback() {
return spoken_feedback().IsEnterpriseIconVisible();
}
bool AccessibilityControllerImpl::IsSelectToSpeakSettingVisibleInTray() {
return select_to_speak().IsVisibleInTray();
}
bool AccessibilityControllerImpl::IsEnterpriseIconVisibleForSelectToSpeak() {
return select_to_speak().IsEnterpriseIconVisible();
}
void AccessibilityControllerImpl::RequestSelectToSpeakStateChange() { void AccessibilityControllerImpl::RequestSelectToSpeakStateChange() {
client_->RequestSelectToSpeakStateChange(); client_->RequestSelectToSpeakStateChange();
} }
...@@ -902,14 +1015,21 @@ bool AccessibilityControllerImpl::IsSwitchAccessRunning() const { ...@@ -902,14 +1015,21 @@ bool AccessibilityControllerImpl::IsSwitchAccessRunning() const {
return switch_access().enabled() || switch_access_disable_dialog_showing_; return switch_access().enabled() || switch_access_disable_dialog_showing_;
} }
bool AccessibilityControllerImpl::SwitchAccessFeature::IsVisibleInTray() const { bool AccessibilityControllerImpl::IsSwitchAccessSettingVisibleInTray() {
// Switch Access cannot be enabled on the sign-in page because there is no way // Switch Access cannot be enabled on the sign-in page because there is no way
// to configure switches while the device is locked. // to configure switches while the device is locked.
if (!enabled() && Shell::Get()->session_controller()->login_status() == if (!switch_access().enabled() &&
ash::LoginStatus::NOT_LOGGED_IN) { Shell::Get()->session_controller()->login_status() ==
ash::LoginStatus::NOT_LOGGED_IN) {
return false; return false;
} }
return Feature::IsVisibleInTray(); return switch_access().IsVisibleInTray();
return IsEnterpriseIconVisibleInTrayMenu(
prefs::kAccessibilitySwitchAccessEnabled);
}
bool AccessibilityControllerImpl::IsEnterpriseIconVisibleForSwitchAccess() {
return switch_access().IsEnterpriseIconVisible();
} }
void AccessibilityControllerImpl::SetAccessibilityEventRewriter( void AccessibilityControllerImpl::SetAccessibilityEventRewriter(
...@@ -952,6 +1072,22 @@ void AccessibilityControllerImpl::StartPointScanning() { ...@@ -952,6 +1072,22 @@ void AccessibilityControllerImpl::StartPointScanning() {
point_scan_controller_->Start(); point_scan_controller_->Start();
} }
bool AccessibilityControllerImpl::IsStickyKeysSettingVisibleInTray() {
return sticky_keys().IsVisibleInTray();
}
bool AccessibilityControllerImpl::IsEnterpriseIconVisibleForStickyKeys() {
return sticky_keys().IsEnterpriseIconVisible();
}
bool AccessibilityControllerImpl::IsVirtualKeyboardSettingVisibleInTray() {
return virtual_keyboard().IsVisibleInTray();
}
bool AccessibilityControllerImpl::IsEnterpriseIconVisibleForVirtualKeyboard() {
return virtual_keyboard().IsEnterpriseIconVisible();
}
void AccessibilityControllerImpl::ShowFloatingMenuIfEnabled() { void AccessibilityControllerImpl::ShowFloatingMenuIfEnabled() {
if (floating_menu().enabled() && !floating_menu_controller_) { if (floating_menu().enabled() && !floating_menu_controller_) {
floating_menu_controller_ = floating_menu_controller_ =
...@@ -1699,7 +1835,7 @@ void AccessibilityControllerImpl::UpdateFeatureFromPref(FeatureType feature) { ...@@ -1699,7 +1835,7 @@ void AccessibilityControllerImpl::UpdateFeatureFromPref(FeatureType feature) {
case FeatureType::kCaretHighlight: case FeatureType::kCaretHighlight:
UpdateAccessibilityHighlightingFromPrefs(); UpdateAccessibilityHighlightingFromPrefs();
break; break;
case FeatureType::kCursorHighlight: case FeatureType::KCursorHighlight:
UpdateAccessibilityHighlightingFromPrefs(); UpdateAccessibilityHighlightingFromPrefs();
break; break;
case FeatureType::kDictation: case FeatureType::kDictation:
......
...@@ -60,7 +60,7 @@ class ASH_EXPORT AccessibilityControllerImpl : public AccessibilityController, ...@@ -60,7 +60,7 @@ class ASH_EXPORT AccessibilityControllerImpl : public AccessibilityController,
enum FeatureType { enum FeatureType {
kAutoclick = 0, kAutoclick = 0,
kCaretHighlight, kCaretHighlight,
kCursorHighlight, KCursorHighlight,
kDictation, kDictation,
kFloatingMenu, kFloatingMenu,
kFocusHighlight, kFocusHighlight,
...@@ -98,7 +98,7 @@ class ASH_EXPORT AccessibilityControllerImpl : public AccessibilityController, ...@@ -98,7 +98,7 @@ class ASH_EXPORT AccessibilityControllerImpl : public AccessibilityController,
// - there is an other feature, which conflicts with the current one. // - there is an other feature, which conflicts with the current one.
virtual void SetEnabled(bool enabled); virtual void SetEnabled(bool enabled);
bool enabled() const { return enabled_; } bool enabled() const { return enabled_; }
virtual bool IsVisibleInTray() const; bool IsVisibleInTray() const;
bool IsEnterpriseIconVisible() const; bool IsEnterpriseIconVisible() const;
const std::string& pref_name() const { return pref_name_; } const std::string& pref_name() const { return pref_name_; }
const gfx::VectorIcon& icon() const; const gfx::VectorIcon& icon() const;
...@@ -154,13 +154,6 @@ class ASH_EXPORT AccessibilityControllerImpl : public AccessibilityController, ...@@ -154,13 +154,6 @@ class ASH_EXPORT AccessibilityControllerImpl : public AccessibilityController,
Dialog dialog_; Dialog dialog_;
}; };
// Switch access has custom tray visibility logic.
class SwitchAccessFeature : public Feature {
public:
using Feature::Feature;
bool IsVisibleInTray() const override;
};
AccessibilityControllerImpl(); AccessibilityControllerImpl();
~AccessibilityControllerImpl() override; ~AccessibilityControllerImpl() override;
...@@ -196,6 +189,9 @@ class ASH_EXPORT AccessibilityControllerImpl : public AccessibilityController, ...@@ -196,6 +189,9 @@ class ASH_EXPORT AccessibilityControllerImpl : public AccessibilityController,
void SetDisplayRotationAcceleratorDialogBeenAccepted(); void SetDisplayRotationAcceleratorDialogBeenAccepted();
bool HasDisplayRotationAcceleratorDialogBeenAccepted() const; bool HasDisplayRotationAcceleratorDialogBeenAccepted() const;
bool IsAutoclickSettingVisibleInTray();
bool IsEnterpriseIconVisibleForAutoclick();
void SetAutoclickEventType(AutoclickEventType event_type); void SetAutoclickEventType(AutoclickEventType event_type);
AutoclickEventType GetAutoclickEventType(); AutoclickEventType GetAutoclickEventType();
void SetAutoclickMenuPosition(FloatingMenuPosition position); void SetAutoclickMenuPosition(FloatingMenuPosition position);
...@@ -211,18 +207,58 @@ class ASH_EXPORT AccessibilityControllerImpl : public AccessibilityController, ...@@ -211,18 +207,58 @@ class ASH_EXPORT AccessibilityControllerImpl : public AccessibilityController,
// virtual keyboard position). // virtual keyboard position).
void UpdateAutoclickMenuBoundsIfNeeded(); void UpdateAutoclickMenuBoundsIfNeeded();
bool IsCaretHighlightSettingVisibleInTray();
bool IsEnterpriseIconVisibleForCaretHighlight();
bool IsCursorHighlightSettingVisibleInTray();
bool IsEnterpriseIconVisibleForCursorHighlight();
bool IsDictationSettingVisibleInTray();
bool IsEnterpriseIconVisibleForDictation();
bool IsFocusHighlightSettingVisibleInTray();
bool IsEnterpriseIconVisibleForFocusHighlight();
bool IsFullScreenMagnifierSettingVisibleInTray();
bool IsEnterpriseIconVisibleForFullScreenMagnifier();
bool IsDockedMagnifierSettingVisibleInTray();
bool IsEnterpriseIconVisibleForDockedMagnifier();
bool IsHighContrastSettingVisibleInTray();
bool IsEnterpriseIconVisibleForHighContrast();
bool IsLargeCursorSettingVisibleInTray();
bool IsEnterpriseIconVisibleForLargeCursor();
bool IsMonoAudioSettingVisibleInTray();
bool IsEnterpriseIconVisibleForMonoAudio();
void SetSpokenFeedbackEnabled(bool enabled, void SetSpokenFeedbackEnabled(bool enabled,
AccessibilityNotificationVisibility notify); AccessibilityNotificationVisibility notify);
bool IsSpokenFeedbackSettingVisibleInTray();
bool IsEnterpriseIconVisibleForSpokenFeedback();
bool IsSelectToSpeakSettingVisibleInTray();
bool IsEnterpriseIconVisibleForSelectToSpeak();
void RequestSelectToSpeakStateChange(); void RequestSelectToSpeakStateChange();
SelectToSpeakState GetSelectToSpeakState() const; SelectToSpeakState GetSelectToSpeakState() const;
bool IsStickyKeysSettingVisibleInTray();
bool IsEnterpriseIconVisibleForStickyKeys();
// Switch access may be disabled in prefs but still running when the disable // Switch access may be disabled in prefs but still running when the disable
// dialog is displaying. // dialog is displaying.
bool IsSwitchAccessRunning() const; bool IsSwitchAccessRunning() const;
bool IsSwitchAccessSettingVisibleInTray();
bool IsEnterpriseIconVisibleForSwitchAccess();
void SetAccessibilityEventRewriter( void SetAccessibilityEventRewriter(
AccessibilityEventRewriter* accessibility_event_rewriter); AccessibilityEventRewriter* accessibility_event_rewriter);
bool IsVirtualKeyboardSettingVisibleInTray();
bool IsEnterpriseIconVisibleForVirtualKeyboard();
void SetTabletModeShelfNavigationButtonsEnabled(bool enabled); void SetTabletModeShelfNavigationButtonsEnabled(bool enabled);
bool tablet_mode_shelf_navigation_buttons_enabled() const { bool tablet_mode_shelf_navigation_buttons_enabled() const {
return tablet_mode_shelf_navigation_buttons_enabled_; return tablet_mode_shelf_navigation_buttons_enabled_;
...@@ -280,6 +316,20 @@ class ASH_EXPORT AccessibilityControllerImpl : public AccessibilityController, ...@@ -280,6 +316,20 @@ class ASH_EXPORT AccessibilityControllerImpl : public AccessibilityController,
// by a policy and false otherwise. // by a policy and false otherwise.
bool IsEnterpriseIconVisibleInTrayMenu(const std::string& path); bool IsEnterpriseIconVisibleInTrayMenu(const std::string& path);
// Returns true if at least one of the primary settings of the accessibility
// features is going to be visible in the accessibility tray menu.
bool IsPrimarySettingsViewVisibleInTray();
// Returns true if at least one of the additional settings of the
// accessibility features is going to be visible in the accessibility tray
// menu.
bool IsAdditionalSettingsViewVisibleInTray();
// Returns true if there exist one of the additional accessibility features
// and one of the primary accessibility features which are going to visible on
// accessibility tray menu.
bool IsAdditionalSettingsSeparatorVisibleInTray();
// Starts point scanning, to select a point onscreen without using a mouse // Starts point scanning, to select a point onscreen without using a mouse
// (as used by Switch Access). // (as used by Switch Access).
void StartPointScanning(); void StartPointScanning();
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#include <stdint.h> #include <stdint.h>
#include "ash/accessibility/accessibility_controller_impl.h"
#include "ash/accessibility/accessibility_delegate.h" #include "ash/accessibility/accessibility_delegate.h"
#include "ash/accessibility/accessibility_observer.h" #include "ash/accessibility/accessibility_observer.h"
#include "ash/public/cpp/session/session_observer.h" #include "ash/public/cpp/session/session_observer.h"
...@@ -23,6 +22,7 @@ class TrayAccessibilityTest; ...@@ -23,6 +22,7 @@ class TrayAccessibilityTest;
namespace views { namespace views {
class Button; class Button;
class Button;
class View; class View;
} // namespace views } // namespace views
...@@ -67,14 +67,40 @@ class ASH_EXPORT AccessibilityDetailedView : public TrayDetailedView { ...@@ -67,14 +67,40 @@ class ASH_EXPORT AccessibilityDetailedView : public TrayDetailedView {
// Add the accessibility feature list. // Add the accessibility feature list.
void AppendAccessibilityList(); void AppendAccessibilityList();
HoverHighlightView* HoverHighlightView* spoken_feedback_view_ = nullptr;
feature_views_[AccessibilityControllerImpl::FeatureType::kFeatureCount] = HoverHighlightView* select_to_speak_view_ = nullptr;
{nullptr}; HoverHighlightView* dictation_view_ = nullptr;
HoverHighlightView* high_contrast_view_ = nullptr;
HoverHighlightView* screen_magnifier_view_ = nullptr;
HoverHighlightView* docked_magnifier_view_ = nullptr;
HoverHighlightView* large_cursor_view_ = nullptr;
HoverHighlightView* autoclick_view_ = nullptr;
HoverHighlightView* virtual_keyboard_view_ = nullptr;
HoverHighlightView* switch_access_view_ = nullptr;
HoverHighlightView* mono_audio_view_ = nullptr;
HoverHighlightView* caret_highlight_view_ = nullptr;
HoverHighlightView* highlight_mouse_cursor_view_ = nullptr;
HoverHighlightView* highlight_keyboard_focus_view_ = nullptr;
HoverHighlightView* sticky_keys_view_ = nullptr;
views::Button* help_view_ = nullptr; views::Button* help_view_ = nullptr;
views::Button* settings_view_ = nullptr; views::Button* settings_view_ = nullptr;
// These exist for tests. The canonical state is stored in prefs. // These exist for tests. The canonical state is stored in prefs.
bool features_enabled_[AccessibilityControllerImpl::kFeatureCount] = {false}; bool spoken_feedback_enabled_ = false;
bool select_to_speak_enabled_ = false;
bool dictation_enabled_ = false;
bool high_contrast_enabled_ = false;
bool screen_magnifier_enabled_ = false;
bool docked_magnifier_enabled_ = false;
bool large_cursor_enabled_ = false;
bool autoclick_enabled_ = false;
bool virtual_keyboard_enabled_ = false;
bool switch_access_enabled_ = false;
bool mono_audio_enabled_ = false;
bool caret_highlight_enabled_ = false;
bool highlight_mouse_cursor_enabled_ = false;
bool highlight_keyboard_focus_enabled_ = false;
bool sticky_keys_enabled_ = false;
LoginStatus login_; LoginStatus login_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment