1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
content / browser / screenlock_monitor / screenlock_monitor_device_source_mac.mm [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/screenlock_monitor/screenlock_monitor_device_source.h"
#include <CoreFoundation/CoreFoundation.h>
namespace content {
namespace {
CFStringRef kScreenLockedEvent = CFSTR("com.apple.screenIsLocked");
CFStringRef kScreenUnlockedEvent = CFSTR("com.apple.screenIsUnlocked");
void OnScreenlockNotificationReceived(CFNotificationCenterRef center,
void* observer,
CFStringRef name,
const void* object,
CFDictionaryRef userInfo) {
ScreenlockMonitorSource::ScreenlockEvent screenlock_event;
if (CFEqual(name, kScreenLockedEvent)) {
screenlock_event = ScreenlockMonitorSource::SCREEN_LOCK_EVENT;
} else if (CFEqual(name, kScreenUnlockedEvent)) {
screenlock_event = ScreenlockMonitorSource::SCREEN_UNLOCK_EVENT;
} else {
return;
}
ScreenlockMonitorSource::ProcessScreenlockEvent(screenlock_event);
}
} // namespace
void ScreenlockMonitorDeviceSource::StartListeningForScreenlock() {
CFNotificationCenterAddObserver(
CFNotificationCenterGetDistributedCenter(), this,
&OnScreenlockNotificationReceived, kScreenLockedEvent, /*object=*/nullptr,
CFNotificationSuspensionBehaviorDeliverImmediately);
CFNotificationCenterAddObserver(
CFNotificationCenterGetDistributedCenter(), this,
&OnScreenlockNotificationReceived, kScreenUnlockedEvent,
/*object=*/nullptr, CFNotificationSuspensionBehaviorDeliverImmediately);
}
void ScreenlockMonitorDeviceSource::StopListeningForScreenlock() {
CFNotificationCenterRemoveEveryObserver(
CFNotificationCenterGetDistributedCenter(), this);
}
} // namespace content