zwp_idle_inhibit_manager.cc 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/exo/wayland/zwp_idle_inhibit_manager.h"
  5. #include <idle-inhibit-unstable-v1-server-protocol.h>
  6. #include <memory>
  7. #include "base/memory/scoped_refptr.h"
  8. #include "base/task/single_thread_task_runner.h"
  9. #include "base/task/thread_pool.h"
  10. #include "components/exo/wayland/server_util.h"
  11. #include "services/device/public/mojom/wake_lock.mojom.h"
  12. #include "services/device/wake_lock/power_save_blocker/power_save_blocker.h"
  13. #include "wayland-server-core.h"
  14. constexpr char kPowerSaveBlockerDescription[] =
  15. "Power save blocker created by exo wayland idle inhibitor";
  16. namespace exo {
  17. namespace wayland {
  18. namespace {
  19. ////////////////////////////////////////////////////////////////////////////////
  20. // zwp_idle_inhibitor_v1_interface:
  21. class IdleInhibitor {
  22. public:
  23. IdleInhibitor(
  24. scoped_refptr<base::SequencedTaskRunner> ui_task_runner,
  25. scoped_refptr<base::SingleThreadTaskRunner> blocking_task_runner)
  26. : power_save_blocker_(std::make_unique<device::PowerSaveBlocker>(
  27. /*type=*/device::mojom::WakeLockType::kPreventDisplaySleep,
  28. /*reason=*/device::mojom::WakeLockReason::kOther,
  29. kPowerSaveBlockerDescription,
  30. ui_task_runner,
  31. blocking_task_runner)) {}
  32. IdleInhibitor(const IdleInhibitor&) = delete;
  33. IdleInhibitor& operator=(const IdleInhibitor&) = delete;
  34. private:
  35. std::unique_ptr<device::PowerSaveBlocker> power_save_blocker_;
  36. };
  37. void zwp_idle_inhibitor_destroy(wl_client* client, wl_resource* resource) {
  38. wl_resource_destroy(resource);
  39. }
  40. const struct zwp_idle_inhibitor_v1_interface
  41. zwp_idle_inhibitor_v1_implementation = {zwp_idle_inhibitor_destroy};
  42. ////////////////////////////////////////////////////////////////////////////////
  43. // zwp_idle_inhibit_manager_v1_interface:
  44. class IdleInhibitManager {
  45. public:
  46. IdleInhibitManager()
  47. : ui_task_runner_(base::ThreadTaskRunnerHandle::Get()),
  48. blocking_task_runner_(base::ThreadPool::CreateSingleThreadTaskRunner(
  49. {base::MayBlock(), base::TaskPriority::BEST_EFFORT})) {}
  50. IdleInhibitManager(const IdleInhibitManager&) = delete;
  51. IdleInhibitManager& operator=(const IdleInhibitManager&) = delete;
  52. std::unique_ptr<IdleInhibitor> CreateInhibitor() {
  53. return std::make_unique<IdleInhibitor>(ui_task_runner_,
  54. blocking_task_runner_);
  55. }
  56. private:
  57. scoped_refptr<base::SequencedTaskRunner> ui_task_runner_;
  58. scoped_refptr<base::SingleThreadTaskRunner> blocking_task_runner_;
  59. };
  60. void zwp_idle_inhibit_manager_destroy(wl_client* client,
  61. wl_resource* resource) {
  62. wl_resource_destroy(resource);
  63. }
  64. void zwp_idle_inhibit_manager_create_inhibitor(wl_client* client,
  65. wl_resource* resource,
  66. uint32_t id,
  67. wl_resource* surface) {
  68. wl_resource* inhibitor_resource =
  69. wl_resource_create(client, &zwp_idle_inhibitor_v1_interface,
  70. wl_resource_get_version(resource), id);
  71. std::unique_ptr<IdleInhibitor> inhibitor =
  72. GetUserDataAs<IdleInhibitManager>(resource)->CreateInhibitor();
  73. SetImplementation(inhibitor_resource, &zwp_idle_inhibitor_v1_implementation,
  74. std::move(inhibitor));
  75. }
  76. const struct zwp_idle_inhibit_manager_v1_interface
  77. zwp_idle_inhibit_manager_v1_implementation = {
  78. zwp_idle_inhibit_manager_destroy,
  79. zwp_idle_inhibit_manager_create_inhibitor};
  80. } // namespace
  81. void bind_zwp_idle_inhibit_manager(wl_client* client,
  82. void* data,
  83. uint32_t version,
  84. uint32_t id) {
  85. wl_resource* resource = wl_resource_create(
  86. client, &zwp_idle_inhibit_manager_v1_interface, version, id);
  87. SetImplementation(resource, &zwp_idle_inhibit_manager_v1_implementation,
  88. std::make_unique<IdleInhibitManager>());
  89. }
  90. } // namespace wayland
  91. } // namespace exo