File: gnome_display_config.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (93 lines) | stat: -rw-r--r-- 3,037 bytes parent folder | download | duplicates (6)
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
// 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.

#ifndef REMOTING_HOST_LINUX_GNOME_DISPLAY_CONFIG_H_
#define REMOTING_HOST_LINUX_GNOME_DISPLAY_CONFIG_H_

#include <gio/gio.h>

#include <map>
#include <string>
#include <vector>

#include "remoting/host/linux/scoped_glib.h"

namespace remoting {

// This object stores information returned from GNOME's D-Bus API:
// org.gnome.Mutter.DisplayConfig.GetCurrentState(). The API returns information
// as GObject types (GVariant and so on), and this class provides helper
// methods to convert this to C++ types. The caller can read and modify this C++
// data directly. A helper method can then be used to build a GVariant that can
// be passed to the D-Bus method:
// org.gnome.Mutter.DisplayConfig.ApplyMonitorsConfig().
struct GnomeDisplayConfig {
  // Type of the "method" parameter in the ApplyMonitorsConfig() API. The
  // valid values are documented in the XML schema.
  enum class Method : guint {
    kVerify = 0,
    kTemporary = 1,
    kPersistent = 2,
  };

  struct MonitorMode {
    std::string name;
    int width;
    int height;
    bool is_current;
  };

  struct MonitorInfo {
    MonitorInfo();
    MonitorInfo(const MonitorInfo&);
    MonitorInfo& operator=(const MonitorInfo&);
    ~MonitorInfo();

    // Returns the first mode with is_current set, or nullptr.
    const MonitorMode* GetCurrentMode() const;

    std::vector<MonitorMode> modes;
    int x = 0;
    int y = 0;
    double scale = 1.0;
    bool is_primary = false;
  };

  GnomeDisplayConfig();
  GnomeDisplayConfig(const GnomeDisplayConfig&);
  GnomeDisplayConfig& operator=(const GnomeDisplayConfig&);
  ~GnomeDisplayConfig();

  // Called for each entry of the 'monitors' property returned by D-Bus
  // GetCurrentState().
  void AddMonitorFromVariant(GVariant* monitor);

  // Called for each entry of the 'logical_monitors' property returned by D-Bus
  // GetCurrentState(). Each logical monitor is assumed to have a single
  // physical monitor (identified by connector-name), previously added by
  // AddMonitorFromVariant().
  void AddLogicalMonitorFromVariant(GVariant* logical_monitor);

  // This converts the C++ data into a GVariant `logical_monitors` parameter
  // to pass to D-Bus ApplyMonitorsConfig().
  ScopedGVariant BuildMonitorsConfigParameters() const;

  // The serial number returned by GNOME. When applying a new monitor config,
  // GNOME will check that the serial number matches, to avoid race-conditions
  // from trying to modify a stale config.
  guint serial = 0;

  // This property is returned by the GNOME API. If true, GNOME will enforce
  // that all monitors have the same scale property.
  bool global_scale_required = false;

  // The "method" parameter to pass to the ApplyMonitorsConfig() API.
  Method method = Method::kPersistent;

  std::map<std::string, MonitorInfo> monitors;
};

}  // namespace remoting

#endif  // REMOTING_HOST_LINUX_GNOME_DISPLAY_CONFIG_H_