chromium/tools/mac/power/power_sampler/main_display_sampler.cc

// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "tools/mac/power/power_sampler/main_display_sampler.h"

#include "base/memory/ptr_util.h"

extern "C" {

// This sampler imitates the open-source "brightness" tool at
// https://github.com/nriley/brightness.
// Since this sampler doesn't care about older MacOSen, multiple displays
// or other complications that tool has to consider, retrieving the brightness
// level boils down to calling this function for the main display.
extern int DisplayServicesGetBrightness(CGDirectDisplayID id,
                                        float* brightness);
}

namespace power_sampler {

MainDisplaySampler::~MainDisplaySampler() = default;

// static
std::unique_ptr<MainDisplaySampler> MainDisplaySampler::Create() {
  return base::WrapUnique(new MainDisplaySampler(CGMainDisplayID()));
}

std::string MainDisplaySampler::GetName() {
  return kSamplerName;
}

Sampler::DatumNameUnits MainDisplaySampler::GetDatumNameUnits() {
  DatumNameUnits ret;
  // Display brightness is in units of 0-100% of max brightness.
  ret.insert(std::make_pair("brightness", "%"));
  ret.insert(std::make_pair("sleeping", "bool"));
  return ret;
}

Sampler::Sample MainDisplaySampler::GetSample(base::TimeTicks sample_time) {
  Sampler::Sample sample;
  auto result = GetDisplayBrightness();
  if (result.has_value())
    sample.emplace("brightness", result.value() * 100.0);
  sample.emplace("sleeping", GetIsDisplaySleeping());

  return sample;
}

bool MainDisplaySampler::GetIsDisplaySleeping() {
  return CGDisplayIsAsleep(main_display_);
}

std::optional<float> MainDisplaySampler::GetDisplayBrightness() {
  float brightness = 0.0;
  int err = DisplayServicesGetBrightness(main_display_, &brightness);
  if (err != 0)
    return std::nullopt;

  return brightness;
}

MainDisplaySampler::MainDisplaySampler(CGDirectDisplayID main_display)
    : main_display_(main_display) {}

}  // namespace power_sampler