1 /*
2  * Copyright (C) 2016  Red Hat, Inc.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  *
18  */
19 
20 #pragma once
21 
22 #include <glib-object.h>
23 
24 G_BEGIN_DECLS
25 
26 /*
27  * GNOME Control Center display configuration system:
28  *
29  * The display configuration system consists of multiple concepts:
30  *
31  * CcDisplayConfig:
32  *
33  *   Configuration instance, read from mutter using the
34  *   org.gnome.Mutter.DisplayConfig D-Bus API. Contains information about the
35  *   current configuration. Can be copied, to create a representation of a
36  *   configuration at a given time, and applied, applying any changes that has
37  *   been made to the objects associated with the configuration.
38  *
39  *   CcDisplayConfig provides a list of all known "monitors" known to the
40  *   compositor. It does not know about ports without any monitors connected,
41  *   nor low level details about monitors, such as tiling etc.
42  *
43  * CcDisplayMonitor:
44  *
45  *   A high level representation of a connected monitor. A monitor have details
46  *   associated with it, some which can be altered. Each CcDisplayMonitor
47  *   instance is associated with a single CcDisplayConfig instance. All
48  *   alteration to a monitor is cached and not applied until
49  *   cc_display_config_apply() is called on the corresponding CcDisplayConfig
50  *   object.
51  *
52  * CcDisplayMode:
53  *
54  *   A monitor mode, including resolution, refresh rate, and scale. Each monitor
55  *   will have a list of possible modes.
56  *
57  */
58 
59 typedef enum _CcDisplayRotation
60 {
61   CC_DISPLAY_ROTATION_NONE,
62   CC_DISPLAY_ROTATION_90,
63   CC_DISPLAY_ROTATION_180,
64   CC_DISPLAY_ROTATION_270,
65   CC_DISPLAY_ROTATION_FLIPPED,
66   CC_DISPLAY_ROTATION_90_FLIPPED,
67   CC_DISPLAY_ROTATION_180_FLIPPED,
68   CC_DISPLAY_ROTATION_270_FLIPPED,
69 } CcDisplayRotation;
70 
71 
72 #define CC_TYPE_DISPLAY_MODE (cc_display_mode_get_type ())
73 G_DECLARE_DERIVABLE_TYPE (CcDisplayMode, cc_display_mode,
74                           CC, DISPLAY_MODE, GObject)
75 
76 struct _CcDisplayModeClass
77 {
78   GObjectClass parent_class;
79 
80   void          (*get_resolution)       (CcDisplayMode *self, int *w, int *h);
81   GArray*       (*get_supported_scales) (CcDisplayMode *self);
82   double        (*get_preferred_scale)  (CcDisplayMode *self);
83   gboolean      (*is_interlaced)        (CcDisplayMode *self);
84   int           (*get_freq)             (CcDisplayMode *self);
85   double        (*get_freq_f)           (CcDisplayMode *self);
86 };
87 
88 
89 #define CC_TYPE_DISPLAY_MONITOR (cc_display_monitor_get_type ())
90 G_DECLARE_DERIVABLE_TYPE (CcDisplayMonitor, cc_display_monitor,
91                           CC, DISPLAY_MONITOR, GObject)
92 
93 struct _CcDisplayMonitorClass
94 {
95   GObjectClass parent_class;
96 
97   guint32           (*get_id)                 (CcDisplayMonitor  *self);
98   const char*       (*get_display_name)       (CcDisplayMonitor  *self);
99   const char*       (*get_connector_name)     (CcDisplayMonitor  *self);
100   gboolean          (*is_builtin)             (CcDisplayMonitor  *self);
101   gboolean          (*is_primary)             (CcDisplayMonitor  *self);
102   void              (*set_primary)            (CcDisplayMonitor  *self,
103                                                gboolean          primary);
104   gboolean          (*is_active)              (CcDisplayMonitor *self);
105   void              (*set_active)             (CcDisplayMonitor *self,
106                                                gboolean          a);
107   CcDisplayRotation (*get_rotation)           (CcDisplayMonitor *self);
108   void              (*set_rotation)           (CcDisplayMonitor  *self,
109                                                CcDisplayRotation  r);
110   gboolean          (*supports_rotation)      (CcDisplayMonitor  *self,
111                                                CcDisplayRotation  r);
112   void              (*get_physical_size)      (CcDisplayMonitor  *self,
113                                                int               *w,
114                                                int               *h);
115   void              (*get_geometry)           (CcDisplayMonitor  *self,
116                                                int               *x,
117                                                int               *y,
118                                                int               *w,
119                                                int               *h);
120   gboolean          (*supports_underscanning) (CcDisplayMonitor  *self);
121   gboolean          (*get_underscanning)      (CcDisplayMonitor  *self);
122   void              (*set_underscanning)      (CcDisplayMonitor  *self,
123                                                gboolean           u);
124   CcDisplayMode*    (*get_mode)               (CcDisplayMonitor  *self);
125   CcDisplayMode*    (*get_preferred_mode)     (CcDisplayMonitor  *self);
126   GList*            (*get_modes)              (CcDisplayMonitor  *self);
127   void              (*set_mode)               (CcDisplayMonitor  *self,
128                                                CcDisplayMode     *m);
129   void              (*set_position)           (CcDisplayMonitor  *self,
130                                                int                x,
131                                                int                y);
132   double            (*get_scale)              (CcDisplayMonitor  *self);
133   void              (*set_scale)              (CcDisplayMonitor  *self,
134                                                double             s);
135 };
136 
137 
138 #define CC_TYPE_DISPLAY_CONFIG (cc_display_config_get_type ())
139 G_DECLARE_DERIVABLE_TYPE (CcDisplayConfig, cc_display_config,
140                           CC, DISPLAY_CONFIG, GObject)
141 
142 struct _CcDisplayConfigClass
143 {
144   GObjectClass parent_class;
145 
146   GList*   (*get_monitors)      (CcDisplayConfig  *self);
147   gboolean (*is_applicable)     (CcDisplayConfig  *self);
148   gboolean (*equal)             (CcDisplayConfig  *self,
149                                  CcDisplayConfig  *other);
150   gboolean (*apply)             (CcDisplayConfig  *self,
151                                 GError           **error);
152   gboolean (*is_cloning)        (CcDisplayConfig  *self);
153   void     (*set_cloning)       (CcDisplayConfig  *self,
154                                  gboolean          clone);
155   GList*   (*get_cloning_modes) (CcDisplayConfig  *self);
156   gboolean (*is_layout_logical) (CcDisplayConfig  *self);
157   void     (*set_minimum_size)  (CcDisplayConfig  *self,
158                                  int               width,
159                                  int               height);
160   gboolean (*is_scaled_mode_valid) (CcDisplayConfig  *self,
161                                     CcDisplayMode    *mode,
162                                     double            scale);
163   gboolean (* get_panel_orientation_managed) (CcDisplayConfig    *self);
164 };
165 
166 
167 GList*            cc_display_config_get_monitors            (CcDisplayConfig    *config);
168 GList*            cc_display_config_get_ui_sorted_monitors  (CcDisplayConfig    *config);
169 int               cc_display_config_count_useful_monitors   (CcDisplayConfig    *config);
170 gboolean          cc_display_config_is_applicable           (CcDisplayConfig    *config);
171 gboolean          cc_display_config_equal                   (CcDisplayConfig    *config,
172                                                              CcDisplayConfig    *other);
173 gboolean          cc_display_config_apply                   (CcDisplayConfig    *config,
174                                                              GError            **error);
175 gboolean          cc_display_config_is_cloning              (CcDisplayConfig    *config);
176 void              cc_display_config_set_cloning             (CcDisplayConfig    *config,
177                                                              gboolean            clone);
178 GList*            cc_display_config_get_cloning_modes       (CcDisplayConfig    *config);
179 
180 void              cc_display_config_set_mode_on_all_outputs (CcDisplayConfig *config,
181                                                              CcDisplayMode   *mode);
182 
183 gboolean          cc_display_config_is_layout_logical       (CcDisplayConfig    *self);
184 void              cc_display_config_set_minimum_size        (CcDisplayConfig    *self,
185                                                              int                 width,
186                                                              int                 height);
187 gboolean          cc_display_config_is_scaled_mode_valid    (CcDisplayConfig    *self,
188                                                              CcDisplayMode      *mode,
189                                                              double              scale);
190 gboolean          cc_display_config_get_panel_orientation_managed
191                                                             (CcDisplayConfig    *self);
192 
193 const char*       cc_display_monitor_get_display_name       (CcDisplayMonitor   *monitor);
194 gboolean          cc_display_monitor_is_active              (CcDisplayMonitor   *monitor);
195 void              cc_display_monitor_set_active             (CcDisplayMonitor   *monitor,
196                                                              gboolean            active);
197 const char*       cc_display_monitor_get_connector_name     (CcDisplayMonitor   *monitor);
198 CcDisplayRotation cc_display_monitor_get_rotation           (CcDisplayMonitor   *monitor);
199 void              cc_display_monitor_set_rotation           (CcDisplayMonitor   *monitor,
200                                                              CcDisplayRotation  r);
201 gboolean          cc_display_monitor_supports_rotation      (CcDisplayMonitor  *monitor,
202                                                              CcDisplayRotation  rotation);
203 void              cc_display_monitor_get_physical_size      (CcDisplayMonitor  *monitor,
204                                                              int               *w,
205                                                              int               *h);
206 gboolean          cc_display_monitor_is_builtin             (CcDisplayMonitor  *monitor);
207 gboolean          cc_display_monitor_is_primary             (CcDisplayMonitor  *monitor);
208 void              cc_display_monitor_set_primary            (CcDisplayMonitor  *monitor,
209                                                              gboolean           primary);
210 guint32           cc_display_monitor_get_id                 (CcDisplayMonitor  *monitor);
211 
212 gboolean          cc_display_monitor_supports_underscanning (CcDisplayMonitor  *monitor);
213 gboolean          cc_display_monitor_get_underscanning      (CcDisplayMonitor  *monitor);
214 void              cc_display_monitor_set_underscanning      (CcDisplayMonitor  *monitor,
215                                                              gboolean           underscanning);
216 
217 CcDisplayMode*    cc_display_monitor_get_mode               (CcDisplayMonitor  *monitor);
218 void              cc_display_monitor_get_geometry           (CcDisplayMonitor  *monitor,
219                                                              int               *x,
220                                                              int               *y,
221                                                              int               *width,
222                                                              int               *height);
223 GList*            cc_display_monitor_get_modes              (CcDisplayMonitor  *monitor);
224 CcDisplayMode*    cc_display_monitor_get_preferred_mode     (CcDisplayMonitor  *monitor);
225 double            cc_display_monitor_get_scale              (CcDisplayMonitor  *monitor);
226 void              cc_display_monitor_set_scale              (CcDisplayMonitor  *monitor,
227                                                              double s);
228 
229 void              cc_display_monitor_set_mode               (CcDisplayMonitor  *monitor,
230                                                              CcDisplayMode     *mode);
231 void              cc_display_monitor_set_position           (CcDisplayMonitor  *monitor,
232                                                              int                x,
233                                                              int                y);
234 
235 gboolean          cc_display_monitor_is_useful              (CcDisplayMonitor  *monitor);
236 gboolean          cc_display_monitor_is_usable              (CcDisplayMonitor  *monitor);
237 void              cc_display_monitor_set_usable             (CcDisplayMonitor  *monitor,
238                                                              gboolean           is_usable);
239 int               cc_display_monitor_get_ui_number          (CcDisplayMonitor  *monitor);
240 const char*       cc_display_monitor_get_ui_name            (CcDisplayMonitor  *monitor);
241 const char*       cc_display_monitor_get_ui_number_name     (CcDisplayMonitor  *monitor);
242 char*             cc_display_monitor_dup_ui_number_name     (CcDisplayMonitor  *monitor);
243 
244 void              cc_display_mode_get_resolution            (CcDisplayMode     *mode,
245                                                              int               *width,
246                                                              int               *height);
247 GArray*           cc_display_mode_get_supported_scales      (CcDisplayMode     *self);
248 double            cc_display_mode_get_preferred_scale       (CcDisplayMode     *self);
249 gboolean          cc_display_mode_is_interlaced             (CcDisplayMode     *mode);
250 int               cc_display_mode_get_freq                  (CcDisplayMode     *mode);
251 double            cc_display_mode_get_freq_f                (CcDisplayMode     *mode);
252 
253 G_END_DECLS
254