File: cursor_accessibility_scale_factor.mm

package info (click to toggle)
chromium 138.0.7204.183-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 6,071,908 kB
  • sloc: cpp: 34,937,088; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,953; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,806; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (96 lines) | stat: -rw-r--r-- 2,917 bytes parent folder | download | duplicates (8)
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/base/cocoa/cursor_accessibility_scale_factor.h"

#include <Foundation/Foundation.h>
#include <dispatch/dispatch.h>

#include <algorithm>
#include <optional>

#include "base/apple/foundation_util.h"
#include "base/command_line.h"
#include "ui/base/cursor/cursor.h"

@interface CursorAccessibilityScaleFactorNotifier ()
@property(readonly, nonatomic) float scaleFactor;
@end

@implementation CursorAccessibilityScaleFactorNotifier {
  NSMutableDictionary<id<NSObject>, void (^)(void)>* _observers;
  NSUserDefaults* __strong _defaults;
  float _scaleFactor;
}

@synthesize scaleFactor = _scaleFactor;

+ (CursorAccessibilityScaleFactorNotifier*)sharedNotifier {
  static dispatch_once_t once;
  static CursorAccessibilityScaleFactorNotifier* instance;
  dispatch_once(&once, ^{
    instance = [[CursorAccessibilityScaleFactorNotifier alloc] init];
  });
  return instance;
}

- (instancetype)init {
  if (self = [super init]) {
    CHECK(base::CommandLine::ForCurrentProcess()
              ->GetSwitchValueASCII("type")
              .empty());

    _observers = [[NSMutableDictionary alloc] init];
    _defaults =
        [[NSUserDefaults alloc] initWithSuiteName:@"com.apple.universalaccess"];
    [_defaults addObserver:self
                forKeyPath:@"mouseDriverCursorSize"
                   options:NSKeyValueObservingOptionNew |
                           NSKeyValueObservingOptionInitial
                   context:nullptr];
  }
  return self;
}

- (void)observeValueForKeyPath:(NSString*)keyPath
                      ofObject:(id)object
                        change:(NSDictionary*)change
                       context:(void*)context {
  // If this key is present, it will be a number from [1.0, 4.0], but it might
  // not be present if it is never set, or in tests. In that case, this
  // observation method will be called with NSNull, so the following code must
  // handle that case.
  NSNumber* defaultsValue =
      base::apple::ObjCCast<NSNumber>(change[NSKeyValueChangeNewKey]);
  _scaleFactor = std::clamp(defaultsValue.floatValue, 1.0f, 4.0f);
  for (void (^observer)() in _observers.allValues) {
    observer();
  }
}

- (id<NSObject>)addObserver:(void (^)())observer {
  static int sequence;

  // An opaque token is required to represent the observation, something that is
  // quick and easy and compares differently to other values. A wrapped
  // incrementing number will do.
  id<NSObject, NSCopying> token = @(++sequence);
  _observers[token] = observer;

  return token;
}

- (void)removeObserver:(id<NSObject>)token {
  [_observers removeObjectForKey:token];
}

namespace ui {

float GetCursorAccessibilityScaleFactor() {
  return CursorAccessibilityScaleFactorNotifier.sharedNotifier.scaleFactor;
}

}  // namespace ui

@end