1 | /* |
2 | * Copyright © 2000 Compaq Computer Corporation, Inc. |
3 | * Copyright © 2002 Hewlett-Packard Company, Inc. |
4 | * Copyright © 2006 Intel Corporation |
5 | * Copyright © 2008 Red Hat, Inc. |
6 | * |
7 | * Permission to use, copy, modify, distribute, and sell this software and its |
8 | * documentation for any purpose is hereby granted without fee, provided that |
9 | * the above copyright notice appear in all copies and that both that copyright |
10 | * notice and this permission notice appear in supporting documentation, and |
11 | * that the name of the copyright holders not be used in advertising or |
12 | * publicity pertaining to distribution of the software without specific, |
13 | * written prior permission. The copyright holders make no representations |
14 | * about the suitability of this software for any purpose. It is provided "as |
15 | * is" without express or implied warranty. |
16 | * |
17 | * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, |
18 | * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO |
19 | * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR |
20 | * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, |
21 | * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER |
22 | * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE |
23 | * OF THIS SOFTWARE. |
24 | * |
25 | * Author: Jim Gettys, HP Labs, Hewlett-Packard, Inc. |
26 | * Keith Packard, Intel Corporation |
27 | */ |
28 | |
29 | #ifndef _XRANDR_H_ |
30 | #define _XRANDR_H_ |
31 | |
32 | #include <X11/extensions/randr.h> |
33 | #include <X11/extensions/Xrender.h> |
34 | |
35 | #include <X11/Xfuncproto.h> |
36 | |
37 | _XFUNCPROTOBEGIN |
38 | |
39 | typedef XID RROutput; |
40 | typedef XID RRCrtc; |
41 | typedef XID RRMode; |
42 | typedef XID RRProvider; |
43 | |
44 | typedef struct { |
45 | int width, height; |
46 | int mwidth, mheight; |
47 | } XRRScreenSize; |
48 | |
49 | /* |
50 | * Events. |
51 | */ |
52 | |
53 | typedef struct { |
54 | int type; /* event base */ |
55 | unsigned long serial; /* # of last request processed by server */ |
56 | Bool send_event; /* true if this came from a SendEvent request */ |
57 | Display *display; /* Display the event was read from */ |
58 | Window window; /* window which selected for this event */ |
59 | Window root; /* Root window for changed screen */ |
60 | Time timestamp; /* when the screen change occurred */ |
61 | Time config_timestamp; /* when the last configuration change */ |
62 | SizeID size_index; |
63 | SubpixelOrder subpixel_order; |
64 | Rotation rotation; |
65 | int width; |
66 | int height; |
67 | int mwidth; |
68 | int mheight; |
69 | } XRRScreenChangeNotifyEvent; |
70 | |
71 | typedef struct { |
72 | int type; /* event base */ |
73 | unsigned long serial; /* # of last request processed by server */ |
74 | Bool send_event; /* true if this came from a SendEvent request */ |
75 | Display *display; /* Display the event was read from */ |
76 | Window window; /* window which selected for this event */ |
77 | int subtype; /* RRNotify_ subtype */ |
78 | } XRRNotifyEvent; |
79 | |
80 | typedef struct { |
81 | int type; /* event base */ |
82 | unsigned long serial; /* # of last request processed by server */ |
83 | Bool send_event; /* true if this came from a SendEvent request */ |
84 | Display *display; /* Display the event was read from */ |
85 | Window window; /* window which selected for this event */ |
86 | int subtype; /* RRNotify_OutputChange */ |
87 | RROutput output; /* affected output */ |
88 | RRCrtc crtc; /* current crtc (or None) */ |
89 | RRMode mode; /* current mode (or None) */ |
90 | Rotation rotation; /* current rotation of associated crtc */ |
91 | Connection connection; /* current connection status */ |
92 | SubpixelOrder subpixel_order; |
93 | } XRROutputChangeNotifyEvent; |
94 | |
95 | typedef struct { |
96 | int type; /* event base */ |
97 | unsigned long serial; /* # of last request processed by server */ |
98 | Bool send_event; /* true if this came from a SendEvent request */ |
99 | Display *display; /* Display the event was read from */ |
100 | Window window; /* window which selected for this event */ |
101 | int subtype; /* RRNotify_CrtcChange */ |
102 | RRCrtc crtc; /* current crtc (or None) */ |
103 | RRMode mode; /* current mode (or None) */ |
104 | Rotation rotation; /* current rotation of associated crtc */ |
105 | int x, y; /* position */ |
106 | unsigned int width, height; /* size */ |
107 | } XRRCrtcChangeNotifyEvent; |
108 | |
109 | typedef struct { |
110 | int type; /* event base */ |
111 | unsigned long serial; /* # of last request processed by server */ |
112 | Bool send_event; /* true if this came from a SendEvent request */ |
113 | Display *display; /* Display the event was read from */ |
114 | Window window; /* window which selected for this event */ |
115 | int subtype; /* RRNotify_OutputProperty */ |
116 | RROutput output; /* related output */ |
117 | Atom property; /* changed property */ |
118 | Time timestamp; /* time of change */ |
119 | int state; /* NewValue, Deleted */ |
120 | } XRROutputPropertyNotifyEvent; |
121 | |
122 | typedef struct { |
123 | int type; /* event base */ |
124 | unsigned long serial; /* # of last request processed by server */ |
125 | Bool send_event; /* true if this came from a SendEvent request */ |
126 | Display *display; /* Display the event was read from */ |
127 | Window window; /* window which selected for this event */ |
128 | int subtype; /* RRNotify_ProviderChange */ |
129 | RRProvider provider; /* current provider (or None) */ |
130 | Time timestamp; /* time of change */ |
131 | unsigned int current_role; |
132 | } XRRProviderChangeNotifyEvent; |
133 | |
134 | typedef struct { |
135 | int type; /* event base */ |
136 | unsigned long serial; /* # of last request processed by server */ |
137 | Bool send_event; /* true if this came from a SendEvent request */ |
138 | Display *display; /* Display the event was read from */ |
139 | Window window; /* window which selected for this event */ |
140 | int subtype; /* RRNotify_ProviderProperty */ |
141 | RRProvider provider; /* related provider */ |
142 | Atom property; /* changed property */ |
143 | Time timestamp; /* time of change */ |
144 | int state; /* NewValue, Deleted */ |
145 | } XRRProviderPropertyNotifyEvent; |
146 | |
147 | typedef struct { |
148 | int type; /* event base */ |
149 | unsigned long serial; /* # of last request processed by server */ |
150 | Bool send_event; /* true if this came from a SendEvent request */ |
151 | Display *display; /* Display the event was read from */ |
152 | Window window; /* window which selected for this event */ |
153 | int subtype; /* RRNotify_ResourceChange */ |
154 | Time timestamp; /* time of change */ |
155 | } XRRResourceChangeNotifyEvent; |
156 | |
157 | /* internal representation is private to the library */ |
158 | typedef struct _XRRScreenConfiguration XRRScreenConfiguration; |
159 | |
160 | Bool XRRQueryExtension (Display *dpy, |
161 | int *event_base_return, |
162 | int *error_base_return); |
163 | Status XRRQueryVersion (Display *dpy, |
164 | int *major_version_return, |
165 | int *minor_version_return); |
166 | |
167 | XRRScreenConfiguration *XRRGetScreenInfo (Display *dpy, |
168 | Window window); |
169 | |
170 | void XRRFreeScreenConfigInfo (XRRScreenConfiguration *config); |
171 | |
172 | /* |
173 | * Note that screen configuration changes are only permitted if the client can |
174 | * prove it has up to date configuration information. We are trying to |
175 | * insist that it become possible for screens to change dynamically, so |
176 | * we want to ensure the client knows what it is talking about when requesting |
177 | * changes. |
178 | */ |
179 | Status XRRSetScreenConfig (Display *dpy, |
180 | XRRScreenConfiguration *config, |
181 | Drawable draw, |
182 | int size_index, |
183 | Rotation rotation, |
184 | Time timestamp); |
185 | |
186 | /* added in v1.1, sorry for the lame name */ |
187 | Status XRRSetScreenConfigAndRate (Display *dpy, |
188 | XRRScreenConfiguration *config, |
189 | Drawable draw, |
190 | int size_index, |
191 | Rotation rotation, |
192 | short rate, |
193 | Time timestamp); |
194 | |
195 | |
196 | Rotation XRRConfigRotations(XRRScreenConfiguration *config, Rotation *current_rotation); |
197 | |
198 | Time XRRConfigTimes (XRRScreenConfiguration *config, Time *config_timestamp); |
199 | |
200 | XRRScreenSize *XRRConfigSizes(XRRScreenConfiguration *config, int *nsizes); |
201 | |
202 | short *XRRConfigRates (XRRScreenConfiguration *config, int sizeID, int *nrates); |
203 | |
204 | SizeID XRRConfigCurrentConfiguration (XRRScreenConfiguration *config, |
205 | Rotation *rotation); |
206 | |
207 | short XRRConfigCurrentRate (XRRScreenConfiguration *config); |
208 | |
209 | int XRRRootToScreen(Display *dpy, Window root); |
210 | |
211 | /* |
212 | * returns the screen configuration for the specified screen; does a lazy |
213 | * evalution to delay getting the information, and caches the result. |
214 | * These routines should be used in preference to XRRGetScreenInfo |
215 | * to avoid unneeded round trips to the X server. These are new |
216 | * in protocol version 0.1. |
217 | */ |
218 | |
219 | |
220 | void XRRSelectInput(Display *dpy, Window window, int mask); |
221 | |
222 | /* |
223 | * the following are always safe to call, even if RandR is not implemented |
224 | * on a screen |
225 | */ |
226 | |
227 | |
228 | Rotation XRRRotations(Display *dpy, int screen, Rotation *current_rotation); |
229 | XRRScreenSize *XRRSizes(Display *dpy, int screen, int *nsizes); |
230 | short *XRRRates (Display *dpy, int screen, int sizeID, int *nrates); |
231 | Time XRRTimes (Display *dpy, int screen, Time *config_timestamp); |
232 | |
233 | |
234 | /* Version 1.2 additions */ |
235 | |
236 | /* despite returning a Status, this returns 1 for success */ |
237 | Status |
238 | XRRGetScreenSizeRange (Display *dpy, Window window, |
239 | int *minWidth, int *minHeight, |
240 | int *maxWidth, int *maxHeight); |
241 | |
242 | void |
243 | XRRSetScreenSize (Display *dpy, Window window, |
244 | int width, int height, |
245 | int mmWidth, int mmHeight); |
246 | |
247 | typedef unsigned long XRRModeFlags; |
248 | |
249 | typedef struct _XRRModeInfo { |
250 | RRMode id; |
251 | unsigned int width; |
252 | unsigned int height; |
253 | unsigned long dotClock; |
254 | unsigned int hSyncStart; |
255 | unsigned int hSyncEnd; |
256 | unsigned int hTotal; |
257 | unsigned int hSkew; |
258 | unsigned int vSyncStart; |
259 | unsigned int vSyncEnd; |
260 | unsigned int vTotal; |
261 | char *name; |
262 | unsigned int nameLength; |
263 | XRRModeFlags modeFlags; |
264 | } XRRModeInfo; |
265 | |
266 | typedef struct _XRRScreenResources { |
267 | Time timestamp; |
268 | Time configTimestamp; |
269 | int ncrtc; |
270 | RRCrtc *crtcs; |
271 | int noutput; |
272 | RROutput *outputs; |
273 | int nmode; |
274 | XRRModeInfo *modes; |
275 | } XRRScreenResources; |
276 | |
277 | XRRScreenResources * |
278 | XRRGetScreenResources (Display *dpy, Window window); |
279 | |
280 | void |
281 | XRRFreeScreenResources (XRRScreenResources *resources); |
282 | |
283 | typedef struct _XRROutputInfo { |
284 | Time timestamp; |
285 | RRCrtc crtc; |
286 | char *name; |
287 | int nameLen; |
288 | unsigned long mm_width; |
289 | unsigned long mm_height; |
290 | Connection connection; |
291 | SubpixelOrder subpixel_order; |
292 | int ncrtc; |
293 | RRCrtc *crtcs; |
294 | int nclone; |
295 | RROutput *clones; |
296 | int nmode; |
297 | int npreferred; |
298 | RRMode *modes; |
299 | } XRROutputInfo; |
300 | |
301 | XRROutputInfo * |
302 | XRRGetOutputInfo (Display *dpy, XRRScreenResources *resources, RROutput output); |
303 | |
304 | void |
305 | XRRFreeOutputInfo (XRROutputInfo *outputInfo); |
306 | |
307 | Atom * |
308 | XRRListOutputProperties (Display *dpy, RROutput output, int *nprop); |
309 | |
310 | typedef struct { |
311 | Bool pending; |
312 | Bool range; |
313 | Bool immutable; |
314 | int num_values; |
315 | long *values; |
316 | } XRRPropertyInfo; |
317 | |
318 | XRRPropertyInfo * |
319 | XRRQueryOutputProperty (Display *dpy, RROutput output, Atom property); |
320 | |
321 | void |
322 | XRRConfigureOutputProperty (Display *dpy, RROutput output, Atom property, |
323 | Bool pending, Bool range, int num_values, |
324 | long *values); |
325 | |
326 | void |
327 | XRRChangeOutputProperty (Display *dpy, RROutput output, |
328 | Atom property, Atom type, |
329 | int format, int mode, |
330 | _Xconst unsigned char *data, int nelements); |
331 | |
332 | void |
333 | XRRDeleteOutputProperty (Display *dpy, RROutput output, Atom property); |
334 | |
335 | int |
336 | XRRGetOutputProperty (Display *dpy, RROutput output, |
337 | Atom property, long offset, long length, |
338 | Bool _delete, Bool pending, Atom req_type, |
339 | Atom *actual_type, int *actual_format, |
340 | unsigned long *nitems, unsigned long *bytes_after, |
341 | unsigned char **prop); |
342 | |
343 | XRRModeInfo * |
344 | XRRAllocModeInfo (_Xconst char *name, int nameLength); |
345 | |
346 | RRMode |
347 | XRRCreateMode (Display *dpy, Window window, XRRModeInfo *modeInfo); |
348 | |
349 | void |
350 | XRRDestroyMode (Display *dpy, RRMode mode); |
351 | |
352 | void |
353 | XRRAddOutputMode (Display *dpy, RROutput output, RRMode mode); |
354 | |
355 | void |
356 | XRRDeleteOutputMode (Display *dpy, RROutput output, RRMode mode); |
357 | |
358 | void |
359 | XRRFreeModeInfo (XRRModeInfo *modeInfo); |
360 | |
361 | typedef struct _XRRCrtcInfo { |
362 | Time timestamp; |
363 | int x, y; |
364 | unsigned int width, height; |
365 | RRMode mode; |
366 | Rotation rotation; |
367 | int noutput; |
368 | RROutput *outputs; |
369 | Rotation rotations; |
370 | int npossible; |
371 | RROutput *possible; |
372 | } XRRCrtcInfo; |
373 | |
374 | XRRCrtcInfo * |
375 | XRRGetCrtcInfo (Display *dpy, XRRScreenResources *resources, RRCrtc crtc); |
376 | |
377 | void |
378 | XRRFreeCrtcInfo (XRRCrtcInfo *crtcInfo); |
379 | |
380 | Status |
381 | XRRSetCrtcConfig (Display *dpy, |
382 | XRRScreenResources *resources, |
383 | RRCrtc crtc, |
384 | Time timestamp, |
385 | int x, int y, |
386 | RRMode mode, |
387 | Rotation rotation, |
388 | RROutput *outputs, |
389 | int noutputs); |
390 | |
391 | int |
392 | XRRGetCrtcGammaSize (Display *dpy, RRCrtc crtc); |
393 | |
394 | typedef struct _XRRCrtcGamma { |
395 | int size; |
396 | unsigned short *red; |
397 | unsigned short *green; |
398 | unsigned short *blue; |
399 | } XRRCrtcGamma; |
400 | |
401 | XRRCrtcGamma * |
402 | XRRGetCrtcGamma (Display *dpy, RRCrtc crtc); |
403 | |
404 | XRRCrtcGamma * |
405 | XRRAllocGamma (int size); |
406 | |
407 | void |
408 | XRRSetCrtcGamma (Display *dpy, RRCrtc crtc, XRRCrtcGamma *gamma); |
409 | |
410 | void |
411 | XRRFreeGamma (XRRCrtcGamma *gamma); |
412 | |
413 | /* Version 1.3 additions */ |
414 | |
415 | XRRScreenResources * |
416 | XRRGetScreenResourcesCurrent (Display *dpy, Window window); |
417 | |
418 | void |
419 | XRRSetCrtcTransform (Display *dpy, |
420 | RRCrtc crtc, |
421 | XTransform *transform, |
422 | _Xconst char *filter, |
423 | XFixed *params, |
424 | int nparams); |
425 | |
426 | typedef struct _XRRCrtcTransformAttributes { |
427 | XTransform pendingTransform; |
428 | char *pendingFilter; |
429 | int pendingNparams; |
430 | XFixed *pendingParams; |
431 | XTransform currentTransform; |
432 | char *currentFilter; |
433 | int currentNparams; |
434 | XFixed *currentParams; |
435 | } XRRCrtcTransformAttributes; |
436 | |
437 | /* |
438 | * Get current crtc transforms and filters. |
439 | * Pass *attributes to XFree to free |
440 | */ |
441 | Status |
442 | XRRGetCrtcTransform (Display *dpy, |
443 | RRCrtc crtc, |
444 | XRRCrtcTransformAttributes **attributes); |
445 | |
446 | /* |
447 | * intended to take RRScreenChangeNotify, or |
448 | * ConfigureNotify (on the root window) |
449 | * returns 1 if it is an event type it understands, 0 if not |
450 | */ |
451 | int XRRUpdateConfiguration(XEvent *event); |
452 | |
453 | typedef struct _XRRPanning { |
454 | Time timestamp; |
455 | unsigned int left; |
456 | unsigned int top; |
457 | unsigned int width; |
458 | unsigned int height; |
459 | unsigned int track_left; |
460 | unsigned int track_top; |
461 | unsigned int track_width; |
462 | unsigned int track_height; |
463 | int border_left; |
464 | int border_top; |
465 | int border_right; |
466 | int border_bottom; |
467 | } XRRPanning; |
468 | |
469 | XRRPanning * |
470 | XRRGetPanning (Display *dpy, XRRScreenResources *resources, RRCrtc crtc); |
471 | |
472 | void |
473 | XRRFreePanning (XRRPanning *panning); |
474 | |
475 | Status |
476 | XRRSetPanning (Display *dpy, |
477 | XRRScreenResources *resources, |
478 | RRCrtc crtc, |
479 | XRRPanning *panning); |
480 | |
481 | void |
482 | XRRSetOutputPrimary(Display *dpy, |
483 | Window window, |
484 | RROutput output); |
485 | |
486 | RROutput |
487 | XRRGetOutputPrimary(Display *dpy, |
488 | Window window); |
489 | |
490 | typedef struct _XRRProviderResources { |
491 | Time timestamp; |
492 | int nproviders; |
493 | RRProvider *providers; |
494 | } XRRProviderResources; |
495 | |
496 | XRRProviderResources * |
497 | XRRGetProviderResources(Display *dpy, Window window); |
498 | |
499 | void |
500 | XRRFreeProviderResources(XRRProviderResources *resources); |
501 | |
502 | typedef struct _XRRProviderInfo { |
503 | unsigned int capabilities; |
504 | int ncrtcs; |
505 | RRCrtc *crtcs; |
506 | int noutputs; |
507 | RROutput *outputs; |
508 | char *name; |
509 | int nassociatedproviders; |
510 | RRProvider *associated_providers; |
511 | unsigned int *associated_capability; |
512 | int nameLen; |
513 | } XRRProviderInfo; |
514 | |
515 | XRRProviderInfo * |
516 | XRRGetProviderInfo(Display *dpy, XRRScreenResources *resources, RRProvider provider); |
517 | |
518 | void |
519 | XRRFreeProviderInfo(XRRProviderInfo *provider); |
520 | |
521 | int |
522 | XRRSetProviderOutputSource(Display *dpy, XID provider, XID source_provider); |
523 | |
524 | int |
525 | XRRSetProviderOffloadSink(Display *dpy, XID provider, XID sink_provider); |
526 | |
527 | Atom * |
528 | XRRListProviderProperties (Display *dpy, RRProvider provider, int *nprop); |
529 | |
530 | XRRPropertyInfo * |
531 | XRRQueryProviderProperty (Display *dpy, RRProvider provider, Atom property); |
532 | |
533 | void |
534 | XRRConfigureProviderProperty (Display *dpy, RRProvider provider, Atom property, |
535 | Bool pending, Bool range, int num_values, |
536 | long *values); |
537 | |
538 | void |
539 | XRRChangeProviderProperty (Display *dpy, RRProvider provider, |
540 | Atom property, Atom type, |
541 | int format, int mode, |
542 | _Xconst unsigned char *data, int nelements); |
543 | |
544 | void |
545 | XRRDeleteProviderProperty (Display *dpy, RRProvider provider, Atom property); |
546 | |
547 | int |
548 | XRRGetProviderProperty (Display *dpy, RRProvider provider, |
549 | Atom property, long offset, long length, |
550 | Bool _delete, Bool pending, Atom req_type, |
551 | Atom *actual_type, int *actual_format, |
552 | unsigned long *nitems, unsigned long *bytes_after, |
553 | unsigned char **prop); |
554 | |
555 | |
556 | typedef struct _XRRMonitorInfo { |
557 | Atom name; |
558 | Bool primary; |
559 | Bool automatic; |
560 | int noutput; |
561 | int x; |
562 | int y; |
563 | int width; |
564 | int height; |
565 | int mwidth; |
566 | int mheight; |
567 | RROutput *outputs; |
568 | } XRRMonitorInfo; |
569 | |
570 | XRRMonitorInfo * |
571 | XRRAllocateMonitor(Display *dpy, int noutput); |
572 | |
573 | XRRMonitorInfo * |
574 | XRRGetMonitors(Display *dpy, Window window, Bool get_active, int *nmonitors); |
575 | |
576 | void |
577 | XRRSetMonitor(Display *dpy, Window window, XRRMonitorInfo *monitor); |
578 | |
579 | void |
580 | XRRDeleteMonitor(Display *dpy, Window window, Atom name); |
581 | |
582 | void |
583 | XRRFreeMonitors(XRRMonitorInfo *monitors); |
584 | |
585 | _XFUNCPROTOEND |
586 | |
587 | #endif /* _XRANDR_H_ */ |
588 | |