|
30 | 30 | #include <nod/nod.hpp>
|
31 | 31 | #include <pqrs/karabiner/driverkit/virtual_hid_device_driver.hpp>
|
32 | 32 | #include <pqrs/osx/iokit_hid_manager.hpp>
|
| 33 | +#include <pqrs/osx/iokit_power_management.hpp> |
33 | 34 | #include <pqrs/osx/system_preferences.hpp>
|
34 | 35 | #include <pqrs/spdlog.hpp>
|
35 | 36 | #include <string_view>
|
@@ -347,12 +348,59 @@ class device_grabber final : public pqrs::dispatcher::extra::dispatcher_client {
|
347 | 348 | logger::get_logger()->error("{0}: {1}", message, kern_return.to_string());
|
348 | 349 | logger_unique_filter_.reset();
|
349 | 350 | });
|
| 351 | + |
| 352 | + // |
| 353 | + // power_management_monitor_ |
| 354 | + // |
| 355 | + |
| 356 | + power_management_monitor_ = std::make_unique<pqrs::osx::iokit_power_management::monitor>(weak_dispatcher_, |
| 357 | + pqrs::cf::run_loop_thread::extra::get_shared_run_loop_thread()); |
| 358 | + |
| 359 | + power_management_monitor_->system_will_sleep.connect([](auto&& kernel_port, |
| 360 | + auto&& notification_id, |
| 361 | + auto&& wait) { |
| 362 | + logger::get_logger()->info("system_will_sleep"); |
| 363 | + |
| 364 | + IOAllowPowerChange(kernel_port, notification_id); |
| 365 | + |
| 366 | + wait->notify(); |
| 367 | + }); |
| 368 | + |
| 369 | + power_management_monitor_->system_will_power_on.connect([] { |
| 370 | + logger::get_logger()->info("system_will_power_on"); |
| 371 | + }); |
| 372 | + |
| 373 | + power_management_monitor_->system_has_powered_on.connect([] { |
| 374 | + logger::get_logger()->info("system_has_powered_on"); |
| 375 | + }); |
| 376 | + |
| 377 | + power_management_monitor_->can_system_sleep.connect([](auto&& kernel_port, |
| 378 | + auto&& notification_id, |
| 379 | + auto&& wait) { |
| 380 | + logger::get_logger()->info("can_system_sleep"); |
| 381 | + |
| 382 | + IOAllowPowerChange(kernel_port, notification_id); |
| 383 | + |
| 384 | + wait->notify(); |
| 385 | + }); |
| 386 | + |
| 387 | + power_management_monitor_->system_will_not_sleep.connect([] { |
| 388 | + logger::get_logger()->info("system_will_not_sleepod"); |
| 389 | + }); |
| 390 | + |
| 391 | + power_management_monitor_->error_occurred.connect([](auto&& message) { |
| 392 | + logger::get_logger()->error("power_management_monitor_ error: {0}", message); |
| 393 | + }); |
| 394 | + |
| 395 | + power_management_monitor_->async_start(); |
350 | 396 | }
|
351 | 397 |
|
352 | 398 | virtual ~device_grabber(void) {
|
353 | 399 | detach_from_dispatcher([this] {
|
354 | 400 | stop();
|
355 | 401 |
|
| 402 | + power_management_monitor_ = nullptr; |
| 403 | + |
356 | 404 | hid_manager_ = nullptr;
|
357 | 405 |
|
358 | 406 | external_signal_connections_.clear();
|
@@ -1003,6 +1051,8 @@ class device_grabber final : public pqrs::dispatcher::extra::dispatcher_client {
|
1003 | 1051 | std::unordered_map<device_id, std::shared_ptr<device_grabber_details::entry>> entries_;
|
1004 | 1052 | hid_queue_values_converter hid_queue_values_converter_;
|
1005 | 1053 |
|
| 1054 | + std::unique_ptr<pqrs::osx::iokit_power_management::monitor> power_management_monitor_; |
| 1055 | + |
1006 | 1056 | core_configuration::details::profile profile_;
|
1007 | 1057 | pqrs::osx::system_preferences::properties system_preferences_properties_;
|
1008 | 1058 |
|
|
0 commit comments