blob: 0676e5593441d52a5ddb6c330af5c0454eb9e9e5 [file] [log] [blame]
// Copyright 2022 The Chromium OS 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 "rgbkbd/rgb_keyboard_controller_impl.h"
#include <utility>
#include "base/check.h"
namespace rgbkbd {
RgbKeyboardControllerImpl::RgbKeyboardControllerImpl(RgbKeyboard* keyboard)
: keyboard_(keyboard), background_color_(kDefaultBackgroundColor) {}
RgbKeyboardControllerImpl::~RgbKeyboardControllerImpl() = default;
uint32_t RgbKeyboardControllerImpl::GetRgbKeyboardCapabilities() {
// TODO(michaelcheco): Update to support RgbKeyboardCapabilities::kFiveZone
const bool supported = keyboard_->GetRgbKeyboardCapabilities();
keyboard_capabilities_ = supported ? RgbKeyboardCapabilities::kIndividualKey
: RgbKeyboardCapabilities::kNone;
return static_cast<uint32_t>(keyboard_capabilities_);
}
void RgbKeyboardControllerImpl::SetKeyColor(const KeyColor& key_color) {
keyboard_->SetKeyColor(key_color.key, key_color.color.r, key_color.color.g,
key_color.color.b);
}
void RgbKeyboardControllerImpl::SetAllKeyColors(const Color& color) {
keyboard_->SetAllKeyColors(color.r, color.g, color.b);
}
void RgbKeyboardControllerImpl::SetCapsLockState(bool enabled) {
caps_lock_enabled_ = enabled;
const auto color = GetCurrentCapsLockColor();
SetKeyColor({kLeftShiftKey, color});
SetKeyColor({kRightShiftKey, color});
}
void RgbKeyboardControllerImpl::SetStaticBackgroundColor(uint32_t r,
uint32_t g,
uint32_t b) {
background_type_ = BackgroundType::kStaticSingleColor;
background_color_ = Color(r, g, b);
SetAllKeyColors(background_color_);
// If Capslock was enabled, re-color the highlight keys.
if (caps_lock_enabled_) {
SetCapsLockState(/*caps_lock_enabled_=*/true);
}
}
void RgbKeyboardControllerImpl::SetKeyboardClient(RgbKeyboard* keyboard) {
DCHECK(keyboard);
keyboard_ = keyboard;
}
void RgbKeyboardControllerImpl::SetRainbowMode() {
background_type_ = BackgroundType::kStaticRainbow;
for (const auto& entry : kRainbowMode) {
// Check if caps lock is enabled to avoid overriding the caps lock
// highlight keys.
if (caps_lock_enabled_ && IsShiftKey(entry.key)) {
continue;
}
keyboard_->SetKeyColor(entry.key, entry.color.r, entry.color.g,
entry.color.b);
}
}
Color RgbKeyboardControllerImpl::GetColorForBackgroundType() const {
switch (background_type_) {
case BackgroundType::kStaticSingleColor:
return background_color_;
case BackgroundType::kStaticRainbow:
// TODO(michaelcheco): Determine colors for caps lock keys when rainbow
// mode is enabled.
return kCapsLockHighlightDefault;
}
}
Color RgbKeyboardControllerImpl::GetCurrentCapsLockColor() const {
return caps_lock_enabled_ ? GetCapsLockHighlightColor()
: GetColorForBackgroundType();
}
} // namespace rgbkbd